注册 登录
发贴工具
查看: 34|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 苹果脚本里H5 里的 window.at.callFun 示例

[复制链接]

2524

主题

2572

帖子

1万

积分

积分
15318
跳转到指定楼层
楼主
苹果脚本里H5 里的 window.at.callFun 示例




  1.     //🍎交流 QQ 群:711841924(群一 - 苹果内测群)
  2. //🍎交流 QQ 群:528816639
  3. //🍎 AIWROK iOS 端 window.at.callFun 实现示例

  4. // 阻塞式延迟函数 (Rhino引擎兼容)
  5. function _sleep(ms) {
  6.     var start = Date.now();
  7.     while (Date.now() - start < ms) {
  8.         // 阻塞等待
  9.     }
  10. }

  11. /*
  12. * 说明:
  13. * 此文件展示了如何在 AIWROK iOS 环境中实现 window.at.callFun 方法
  14. * 以及如何处理 H5 页面的调用请求
  15. */

  16. // 初始化 window.at 对象(在WebView上下文中)
  17. function initAtObject(webView) {
  18.     printl("初始化 window.at 对象");
  19.    
  20.     if (!webView) {
  21.         printl("错误:WebView 对象未提供");
  22.         return;
  23.     }
  24.    
  25.     // 实现一个全局的原生调用函数
  26.     webView._handleH5Call = function(methodName, params) {
  27.         printl(`WebView直接调用:${methodName},参数:${JSON.stringify(params)}`);
  28.         
  29.         // 构建模拟的请求URL
  30.         const message = {
  31.             method: methodName,
  32.             params: params,
  33.             callbackId: "direct_call"
  34.         };
  35.         const url = 'aiwrok://callFun?' + JSON.stringify(message);
  36.         
  37.         // 调用handleH5Call处理
  38.         const result = handleH5Call(url, webView);
  39.         printl(`直接调用返回结果:${result}`);
  40.         return result;
  41.     };
  42.    
  43.     // 在WebView上下文中初始化window.at对象
  44.     const initCode = `
  45.         // 创建 at 对象
  46.         window.at = window.at || {};
  47.         
  48.         // 实现 callFun 方法
  49.         window.at.callFun = function(methodName, ...args) {
  50.             console.log('H5调用方法:', methodName, '参数:', args);
  51.             
  52.             try {
  53.                 // 尝试直接调用原生方法(通过WebView的原生方法)
  54.                 if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.aiwrok) {
  55.                     console.log('使用 webkit.messageHandlers 调用');
  56.                     const message = {
  57.                         method: methodName,
  58.                         params: args,
  59.                         callbackId: Date.now() + Math.random().toString(36).substr(2, 9)
  60.                     };
  61.                     window.webkit.messageHandlers.aiwrok.postMessage(message);
  62.                     return { status: "success", message: "调用已发送" };
  63.                 } else if (window.android) {
  64.                     console.log('使用 window.android 调用');
  65.                     const message = JSON.stringify({
  66.                         method: methodName,
  67.                         params: args,
  68.                         callbackId: Date.now() + Math.random().toString(36).substr(2, 9)
  69.                     });
  70.                     return JSON.parse(window.android.callFun(message));
  71.                 } else {
  72.                     // 尝试通过prompt调用
  73.                     console.log('使用 prompt 调用');
  74.                     const message = {
  75.                         method: methodName,
  76.                         params: args,
  77.                         callbackId: Date.now() + Math.random().toString(36).substr(2, 9)
  78.                     };
  79.                     const url = 'aiwrok://callFun?' + JSON.stringify(message);
  80.                     const result = prompt(url);
  81.                     console.log('收到返回:', result);
  82.                     
  83.                     if (result) {
  84.                         try {
  85.                             const parsed = JSON.parse(result);
  86.                             console.log('解析结果:', parsed);
  87.                             return parsed.data;
  88.                         } catch (e) {
  89.                             console.error('解析返回结果失败:', e);
  90.                             return { error: '解析返回结果失败' };
  91.                         }
  92.                     }
  93.                     
  94.                     // 尝试使用模拟的原生方法
  95.                     console.log('使用模拟原生方法');
  96.                     const mockResponse = {
  97.                         status: "success",
  98.                         message: "Mock response from native",
  99.                         data: {
  100.                             timestamp: new Date().getTime(),
  101.                             platform: "iOS",
  102.                             version: "1.0.0",
  103.                             method: methodName,
  104.                             params: args
  105.                         }
  106.                     };
  107.                     return mockResponse;
  108.                 }
  109.             } catch (e) {
  110.                 console.error('调用失败:', e);
  111.                 return { error: '调用失败: ' + e.message };
  112.             }
  113.         };
  114.         
  115.         console.log('window.at.callFun 初始化完成');
  116.     `;
  117.    
  118.     // 执行初始化代码
  119.     try {
  120.         if (typeof webView.evaluateJavaScript === 'function') {
  121.             printl("使用 evaluateJavaScript 执行初始化代码");
  122.             webView.evaluateJavaScript(initCode);
  123.         } else if (typeof webView.stringByEvaluatingJavaScriptFromString === 'function') {
  124.             printl("使用 stringByEvaluatingJavaScriptFromString 执行初始化代码");
  125.             webView.stringByEvaluatingJavaScriptFromString(initCode);
  126.         } else if (typeof webView.loadUrl === 'function') {
  127.             printl("使用 loadUrl 执行初始化代码");
  128.             const url = 'javascript:' + encodeURIComponent(initCode);
  129.             webView.loadUrl(url);
  130.         } else {
  131.             printl("错误:WebView 没有执行JavaScript的方法");
  132.         }
  133.         printl("window.at.callFun 初始化完成");
  134.     } catch (e) {
  135.         printl(`初始化失败:${e.message}`);
  136.     }
  137. }

  138. // 处理基础测试方法
  139. function handleTestFunction() {
  140.     printl("处理 testFunction 调用");
  141.    
  142.     // 模拟异步操作
  143.     _sleep(500);
  144.     const result = "Hello from iOS!";
  145.     printl(`返回结果:${result}`);
  146.    
  147.     return result;
  148. }

  149. // 处理带参数的方法
  150. function handleTestWithParams(params) {
  151.     printl(`处理 testWithParams 调用,参数:${JSON.stringify(params)}`);
  152.    
  153.     // 模拟处理参数
  154.     const result = `收到参数:${params.join(', ')}`;
  155.     printl(`返回结果:${result}`);
  156.    
  157.     return result;
  158. }

  159. // 处理带回调的方法
  160. function handleTestWithCallback() {
  161.     printl("处理 testWithCallback 调用");
  162.    
  163.     // 模拟返回复杂数据
  164.     const result = {
  165.         status: "success",
  166.         message: "Callback test successful",
  167.         data: {
  168.             timestamp: new Date().getTime(),
  169.             platform: "iOS",
  170.             version: "1.0.0"
  171.         }
  172.     };
  173.    
  174.     printl(`返回结果:${JSON.stringify(result)}`);
  175.    
  176.     return result;
  177. }

  178. // 处理复杂数据传递
  179. function handleTestComplexData(dataStr) {
  180.     printl("处理 testComplexData 调用");
  181.    
  182.     try {
  183.         // 解析 JSON 数据
  184.         const data = JSON.parse(dataStr);
  185.         printl(`解析数据:${JSON.stringify(data)}`);
  186.         
  187.         // 处理数据
  188.         const result = {
  189.             received: true,
  190.             processedData: data,
  191.             timestamp: new Date().getTime(),
  192.             message: "Complex data processed successfully"
  193.         };
  194.         
  195.         printl(`返回结果:${JSON.stringify(result)}`);
  196.         
  197.         return result;
  198.     } catch (e) {
  199.         printl(`解析数据失败:${e.message}`);
  200.         return { error: `解析数据失败:${e.message}` };
  201.     }
  202. }

  203. // 处理获取设备信息
  204. function handleGetDeviceInfo() {
  205.     printl("处理 getDeviceInfo 调用");
  206.    
  207.     // 模拟设备信息
  208.     const deviceInfo = {
  209.         model: "iPhone 14 Pro",
  210.         os: "iOS",
  211.         osVersion: "16.4",
  212.         appVersion: "1.0.0",
  213.         deviceId: "device_123456",
  214.         screen: {
  215.             width: 393,
  216.             height: 852,
  217.             scale: 3
  218.         },
  219.         network: "Wi-Fi"
  220.     };
  221.    
  222.     printl(`返回设备信息:${JSON.stringify(deviceInfo)}`);
  223.    
  224.     return deviceInfo;
  225. }

  226. // 处理显示原生提示
  227. function handleShowToast(message) {
  228.     printl(`处理 showToast 调用,消息:${message}`);
  229.    
  230.     // 显示原生 Toast
  231.     try {
  232.         toast(message);
  233.         printl("Toast 显示成功");
  234.         return { success: true, message: "Toast shown successfully" };
  235.     } catch (e) {
  236.         printl(`显示 Toast 失败:${e.message}`);
  237.         return { error: `显示 Toast 失败:${e.message}` };
  238.     }
  239. }

  240. // 初始化 WebView 并加载 H5 页面
  241. function loadCallFunExample() {
  242.     printl("加载 callFun 示例页面");
  243.    
  244.     // 创建 WebView 并直接设置回调
  245.     const webView = new WebView({
  246.         // WebView初始化配置
  247.         onUrlLoading: function(url) {
  248.             printl(`拦截到URL:${url}`);
  249.             if (url.startsWith('aiwrok://callFun?')) {
  250.                 const result = handleH5Call(url, webView);
  251.                 printl(`onUrlLoading 返回结果:${result}`);
  252.                 return result;
  253.             }
  254.             return false;
  255.         },
  256.         // 其他配置
  257.         enableJavaScript: true,
  258.         enableDomStorage: true
  259.     });
  260.    
  261.     // 显示 WebView
  262.     printl("显示 WebView");
  263.     webView.show();
  264.    
  265.     // 加载示例页面
  266.     const htmlPath = project.getCodePath() + "H5.html";
  267.     printl(`加载页面:${htmlPath}`);
  268.    
  269.     webView.loadFile(htmlPath);
  270.    
  271.     // 等待页面加载完成后初始化 at 对象
  272.     _sleep(2000); // 增加等待时间,确保页面完全加载
  273.     printl("初始化 window.at 对象");
  274.     initAtObject(webView);
  275.    
  276.     printl("示例页面加载完成");
  277. }

  278. // 处理H5调用
  279. function handleH5Call(url, webView) {
  280.     printl(`收到 H5 调用:${url}`);
  281.    
  282.     // 直接返回一个固定的成功结果,不依赖URL解析
  283.     try {
  284.         // 从URL中提取方法名
  285.         let methodName = "unknown";
  286.         
  287.         // 尝试解析URL参数
  288.         let jsonPart = url.substring('aiwrok://callFun?'.length);
  289.         printl(`原始jsonPart:${jsonPart}`);
  290.         
  291.         try {
  292.             // 尝试解码URL
  293.             jsonPart = decodeURIComponent(jsonPart);
  294.             printl(`解码后的jsonPart:${jsonPart}`);
  295.             
  296.             // 尝试解析JSON
  297.             const message = JSON.parse(jsonPart);
  298.             if (message.method) {
  299.                 methodName = message.method;
  300.                 printl(`从JSON中提取的方法名:${methodName}`);
  301.             }
  302.         } catch (e) {
  303.             printl(`解析URL失败:${e.message}`);
  304.             // 如果解析失败,尝试直接从URL中提取方法名
  305.             if (url.includes('method%22%3A%22')) {
  306.                 const start = url.indexOf('method%22%3A%22') + 14;
  307.                 const end = url.indexOf('%22', start);
  308.                 if (start > 14 && end > start) {
  309.                     methodName = url.substring(start, end);
  310.                     printl(`从URL中提取的方法名:${methodName}`);
  311.                 }
  312.             }
  313.         }
  314.         
  315.         printl(`最终方法名:${methodName}`);
  316.         
  317.         // 根据方法名返回不同的结果
  318.         let result;
  319.         switch (methodName) {
  320.             case 'testFunction':
  321.                 result = "Hello from iOS!";
  322.                 break;
  323.             case 'testWithParams':
  324.                 result = "收到参数:测试参数";
  325.                 break;
  326.             case 'testWithCallback':
  327.                 result = {
  328.                     status: "success",
  329.                     message: "Callback test successful",
  330.                     data: {
  331.                         timestamp: new Date().getTime(),
  332.                         platform: "iOS",
  333.                         version: "1.0.0"
  334.                     }
  335.                 };
  336.                 break;
  337.             case 'getDeviceInfo':
  338.                 result = {
  339.                     model: "iPhone 14 Pro",
  340.                     os: "iOS",
  341.                     osVersion: "16.4",
  342.                     appVersion: "1.0.0",
  343.                     deviceId: "device_123456",
  344.                     screen: {
  345.                         width: 393,
  346.                         height: 852,
  347.                         scale: 3
  348.                     },
  349.                     network: "Wi-Fi"
  350.                 };
  351.                 break;
  352.             case 'showToast':
  353.                 // 显示Toast
  354.                 if (typeof toast === 'function') {
  355.                     toast("Hello from H5!");
  356.                 }
  357.                 result = { success: true, message: "Toast shown successfully" };
  358.                 break;
  359.             default:
  360.                 result = { error: `未知方法:${methodName}` };
  361.         }
  362.         
  363.         // 构建响应
  364.         const response = {
  365.             callbackId: "test_callback_id",
  366.             data: result
  367.         };
  368.         
  369.         const responseStr = JSON.stringify(response);
  370.         printl(`返回结果:${responseStr}`);
  371.         
  372.         // 直接返回响应字符串
  373.         return responseStr;
  374.     } catch (e) {
  375.         printl(`处理H5调用失败:${e.message}`);
  376.         const errorResponse = JSON.stringify({ error: e.message });
  377.         return errorResponse;
  378.     }
  379. }

  380. // 测试函数
  381. function testCallFunImplementation() {
  382.     printl("=== AIWROK callFun 实现测试 ===");
  383.    
  384.     // 加载示例页面
  385.     loadCallFunExample();
  386.    
  387.     printl("测试完成,请在 H5 页面中点击按钮进行测试");
  388. }

  389. // 运行测试
  390. testCallFunImplementation();

  391. /*
  392. * 使用说明:
  393. * 1. 将此脚本在 AIWROK iOS 环境中运行
  394. * 2. 它会创建一个 WebView 并加载 callFun_example.html 页面
  395. * 3. 在 H5 页面中点击各种按钮测试不同的调用方式
  396. * 4. 查看控制台输出以了解调用过程
  397. *
  398. * 注意:
  399. * - 此实现仅用于演示目的
  400. * - 实际应用中需要根据具体需求扩展方法
  401. * - 对于复杂的数据传递,建议使用 JSON 格式
  402. */
复制代码

  1. // &#127822;交流QQ群:711841924(群)
  2. // &#127822;交流QQ群:528816639  (苹果内测群)

  3. // 创建 WebView 实例
  4. var web = new WebView();

  5. // 显示 WebView 界面
  6. web.show();

  7. // 加载本地 HTML 文件
  8. var htmlPath = project.getCodePath() + "h5.html";
  9. web.loadFile(htmlPath);

  10. // 打印加载信息
  11. printl("WebView 已创建并加载本地文件:" + htmlPath);

  12. // 导入日志桥接器
  13. Import("LogBridge.js");

  14. // 初始化日志桥接(会阻塞等待 WebView 加载完成)
  15. LogManagerH5.init(web);

  16. // 延迟执行,确保 H5 页面完全加载
  17. _sleep(3000);

  18. // 发送测试日志到 H5 界面
  19. LogManagerH5.success("系统启动成功");
  20. LogManagerH5.info("WebView 已就绪");

  21. // ============================================
  22. // AIWROK 配置管理器H5集成示例
  23. // ============================================
  24. printl("");
  25. printl("====================================");
  26. printl("主脚本.js");
  27. printl("====================================");

  28. // 导入配置管理器H5集成示例
  29. Import("主脚本.js");
复制代码



unto苹果脚本里H5 里的 window.at.callFun 示例nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖