[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$flfAxgozOAlVvnlmmJdIjL0DWFxQxc687INzSbDbGIoc":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":12,"notice":12,"visitCount":28,"commentCount":29,"keywords":30},56,"2024-01-31T01:19:42.753Z","UIWebView和WKWebView和原生的交互操作","这里以UIWebview为主的演示，当然当今在iOS中依然废弃了UIWebview，普遍使用的是WKWebview。因为是我很早之前的笔记，所以仅供记录。\n\n# OC和JS的交互方式：\n## 1. oc调用js：\n(1）通过拦截URL的方式，js在web端src或者href时，通过截取sheme/ URL/ Path/ NavigationType等来决定是否执行某一个事件\n\nUIWebView在`shouldStart`的代理方法中拦截；\n\nWKWebView在`decidePolicyForNavigation`中进行拦截；\n\n（2）\nUIWebView:\n```\nNSString *jsStr = [NSString stringWithFormat:@\"showAlert('%@')\",@\"这里是JS中alert弹出的message\"];\n[_webView stringByEvaluatingJavaScriptFromString:jsStr];\n```\n注意：该方法会同步返回一个字符串，因此是一个同步方法，可能会阻塞UI。\n\nWKWebView:\nWKWebView的`evaluateJavaScript:completionHandler:`\n\n(3）\n使用JavaScriptCore库来做JS交互。\n```\nJSContext *context = [self.webView valueForKeyPath:@\"documentView.webView.mainFrame.javaScriptContext\"];\nNSString *textJS = @\"showAlert('这里是JS中alert弹出的message')\";\n[context evaluateScript:textJS];\n```\n\n## 2. JS调用OC\n(1)首先导入JavaScriptCore库, 然后在OC中获取JS的上下文\n```\nJSContext *context = [self.webView valueForKeyPath:@\"documentView.webView.mainFrame.javaScriptContext\"];\n```\n\n再然后定义好JS需要调用的方法，例如JS要调用share方法，则可以在UIWebView加载url完成后，在其代理方法中添加要调用的share方法：\n```\n- (void)webViewDidFinishLoad:(UIWebView *)webView\n{\n    JSContext *context = [self.webView valueForKeyPath:@\"documentView.webView.mainFrame.javaScriptContext\"];\n    //定义好JS要调用的方法, share就是调用的share方法名\n    context[@\"share\"] = ^() {\n        NSLog(@\"+++++++Begin Log+++++++\");\n        NSArray *args = [JSContext currentArguments];\n\n        dispatch_async(dispatch_get_main_queue(), ^{\n            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@\"方式二\" message:@\"这是OC原生的弹出窗\" delegate:self cancelButtonTitle:@\"收到\" otherButtonTitles:nil];\n            [alertView show];\n        });\n\n        for (JSValue *jsVal in args) {\n            NSLog(@\"%@\", jsVal.toString);\n        }\n\n        NSLog(@\"-------End Log-------\");\n    };\n}\n\n```\n\nhtml中的演示（部分代码）：\n```html\n\u003Chtml>\n    \u003Chead>\n        \u003Cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n        \u003Cscript type=\"text/javascript\">\n\n            function secondClick() {\n                share('分享的标题','分享的内容','图片地址');\n            }\n        \u003C/script>\n    \u003C/head>\n\u003C/html>\n\n```\n","UIWebView和WKWebView和iOS的objective-c原生代码之间的交互示例，一个简单的演示。","",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",3,{"id":24,"name":26,"parentId":21},"iOS",[],57,0,"ios,uiwebview,wkwebview,objective-c webview,ios开发"]