Even Lin

我继续

哈喽,I AM Even Lin,来自杭州的 iOS Developer,还是懒癌晚期的夜猫子,唱不上高音,学不会吉他指弹的音乐爱好者。呵,💊


@EvenLin's Blog

JS与iOS交互笔记

JavaScriptCore

  • JSExport (Protocol)
    • 实现将OC类及其示例方法,类方法,和属性导出为JavaScript代码的协议
  • JSContext
    • JS运行的环境
    • 获取到的JSContext从属于一个JSVirtualMachine
  • JSValue
    • JavaScript的值的引用, 任何JS中的值都能被包装成一个JSValue
  • JSManagedValue
    • 对JSValue的包装,加入了conditional retain
  • JSVirtualMachine
    • JavaScript执行的独立环境
    • 可包含多个JSContext,并互相传值

iOS 与 JS 交互

JS 调用 Native

1. 假请求方式

拦截约定好的scheme

WKWebView中 decisionHandler(WKNavigationActionPolicyCancel);决定允许还是取消导航

2. JavaScriptCore方式 @import JavaScriptCore;

UIWebView

jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

Native 调用 JS

WebView直接注入JS并执行

UIWebView

NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')", @"alert msg"];
[_webView stringByEvaluatingJavaScriptFromString:jsStr];

::这个方法会返回运行 JS 的结果(nullable NSString *),它是一个同步方法,会阻塞当前线程!尽管此方法不被弃用,但最佳做法是使用 WKWebView 类的 evaluateJavaScript:completionHandler:method::

WKWebView

NSString *jsStr = [NSString stringWithFormat:@"setLocation('%@')", @"北京市东城区南锣鼓巷纳福胡同xx号"];
[_webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
    NSLog(@"%@----%@", result, error);
}];

JavaScriptCore 方法

UIWebView 可以直接通过JSContext获取到方法名,传参调用

// 首先引入 JavaScriptCore 库
#import // 先获取 JS 上下文
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 如果涉及 UI 操作,切回主线程调用 JS 代码中的 YourFuncName,通过数组@[parameter] 入参
dispatch_async(dispatch_get_main_queue(), ^{
    JSValue *jsValue = self.jsContext[@"YourFuncName"];
    [jsValue callWithArguments:@[parameter]];
});

WKWebView

WKUIDelegate

可以监听JS中的Alert 和 Confirm

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    // 用 Native 的 UIAlertController 弹窗显示 JS 将要提示的信息
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提醒" message:message preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        // 函数内必须调用 completionHandler
        completionHandler();
    }]];
     
    [self presentViewController:alert animated:YES completion:nil];
}

MessageHandler

JS 调用 Native

继 Native 截获 JS 假请求后另一种 JS 调用 Native 的方法,WKWebView 的新特性实现。对比截获假 Request 的方法来说,MessageHandler 传参数更加简单方便。

-(void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;

参考资料

iOS 与 JS 交互开发知识总结
iOS下JS与OC互相调用(三)—MessageHandler - 简书

最近的文章

Hackintosh

OpenCore 0.9.2, macOS Ventura 13.3.1EFI-GitHubAbout My PC Type Detail CPU Intel i7 10700K GPU Sapphire AMD RX 5700XT 8GB 超白金 MotherBoard Asus ROG STRIX Z490-A Gaming 吹雪 ...…

hackintosh继续阅读
更早的文章

如何自建 iOS 应用分发网站

更新: 2019年05月16日 平时都是将Demo 包放在 fir 或者蒲公英 上, 由于公司需要建一个产品体验中心, 所以需要自己建一个应用分发平台, 自己就先在这里试一下, 顺便记录下官方文档这里是苹果官方的 iOS 部署参考需要以下几个文件 ipa 包 manifest.plist (XML 清单文件) 57*57的 Icon 512*512的 IconHOW 在 GitHub 建一个 repo, 放以上几个文件 在 blog 里放一个链接地址, 点击下载打包 IPA ...…

iOS继续阅读