iOS 在第三方 H5 页面中插入 JS 的方案说明
最后更新于:2018-11-14 10:55:01
如果在 App 内有加载一些第三方 H5 页面。这些页面不能直接集成神策分析 JavaScript SDK,如果需要获取这些页面对应的埋点信息,可使用如下方式实现。具体实现原理:通过 webView
向第三方 H5 页面自动嵌入 JavaScript sdk ,当 H5 页面触发事件时,会直接把事件发往 App 端,App 端接收到数据后保存并上报。
为了防止 H5 不在 App 环境下浏览时,track 的事件无法通过 JavaScript SDK 发送。在初始化完 iOS SDK 之后,调用如下接口:
[[SensorsAnalyticsSDK sharedInstance] addWebViewUserAgentSensorsDataFlag];
如果是 UIWebView
加载 WebView
时,在 shouldStartLoadWithRequest:
方法中调用如下方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([[SensorsAnalyticsSDK sharedInstance] showUpWebView:webView WithRequest:request]) {
return NO;
}
//在这里添加您的逻辑代码
return YES;
}
WebView
加载完成后,在 webViewDidFinishLoad:
方法中调用如下方法:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.src = \'<#包含神策 SDK js 文件目标地址#>\';"
"document.getElementsByTagName('head')[0].appendChild(script);"];
}
如果是 WKWebView
加载 WebView
时,在 decidePolicyForNavigationAction:
方法中调用如下方法:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if ([[SensorsAnalyticsSDK sharedInstance] showUpWebView:webView WithRequest:navigationAction.request]) {
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
//在这里添加您的逻辑代码
decisionHandler(WKNavigationActionPolicyAllow);
}
WebView
加载完成后,在 didFinishNavigation:
方法中调用如下方法:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
[webView evaluateJavaScript:@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.src = \'<#包含神策 SDK js 文件目标地址#>\';"
"document.getElementsByTagName('head')[0].appendChild(script);"
completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
}]; //添加到head标签中
}
注意事项
如果 H5 URL 为 Https,在上面的 script.src
中使用如下链接:
"script.src = \'https://static.sensorsdata.cn/sdk/test/test.js?2\';"