iOS 在第三方 H5 页面中插入 JS 的方案说明

最后更新于:2018-08-02 12:04:43

如果在 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 = \'http://static.sensorsdata.cn/sdk/test/test.js?1\';"
                   "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 = \'http://static.sensorsdata.cn/sdk/test/test.js?1\';"
     "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\';"