提示
通过设置,您无需更改 Hybrid App 中网站的代码,也能让 iOS SDK 处理应用内网站中的 Airbridge 相关操作。
iOS SDK 可以代替 Web SDK 处理事件发送、设备设置和用户设置等命令。在 WebView 中加载网站之前,请设置 Airbridge.setWebInterface
函数。
YOUR_WEB_TOKEN
是 Web SDK Token,可在 Airbridge 面板的 [设置]>[Token] 获取。
import UIKit
import WebKit
import Airbridge
class ViewController: UIViewController, WKNavigationDelegate {
let webView = {
let configuration = WKWebViewConfiguration()
let controller = WKUserContentController()
Airbridge.setWebInterface(
controller: controller,
webToken: "YOUR_WEB_SDK_TOKEN"
)
configuration.userContentController = controller
return WKWebView(frame: .null, configuration: configuration)
}()
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
self.view = webView
webView.load(URLRequest(url: URL(string: "YOUR_WEBSITE_URL")!))
}
}
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
...
#import "ViewController.h"
#import <WebKit/WebKit.h>
#import <Airbridge/Airbridge.h>
@interface ViewController () <WKNavigationDelegate>
@end
@implementation ViewController {
WKWebView* webView;
}
- (instancetype)init
{
self = [super init];
if (self) {
WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController* controller = [[WKUserContentController alloc] init];
[Airbridge setWebInterfaceWithController:controller webToken:@"YOUR_WEB_SDK_TOKEN"];
configuration.userContentController = controller;
webView = [[WKWebView alloc] initWithFrame:CGRectNull configuration:configuration];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
webView.navigationDelegate = self;
self.view = webView;
[webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"YOUR_WEBSITE_URL"]]];
}
@end
您可以通过添加 Airbridge.click 函数,在 WebView 中正常运行深度链接。由于 WebView 默认不支持深度链接,需要通过 Airbridge.click
函数设置,使 SDK 代替启用追踪链接中的深度链接。
Airbridge.click
函数在输入的地址为追踪链接时返回 true
。当地址启用 App 时,会调用 onSuccess
函数;若无网络或启用了其他 App,则会调用 onFailure
函数。
如果输入的地址不是追踪链接,Airbridge.click
函数将返回 false
,并且不会执行任何操作。
如果在 WKWebView
中实现 webView(_,decidePolicyFor:,decisionHandler:)
,即可在确认加载特定 URL 后决定是否继续加载。
func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy
) -> Void) {
if let url = navigationAction.request.url {
let isHandled = Airbridge.click(trackingLink: url) {
// when url is tracking link and succeed
// do nothing
} onFailure: { error in
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
webView.load(URLRequest(url: url))
}
if isHandled {
// when url is tracking link
decisionHandler(.cancel)
return
}
}
// when url is not tracking link
decisionHandler(.allow)
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL* url = navigationAction.request.URL;
if (url != nil) {
BOOL isHandled = [Airbridge clickWithTrackingLink:url onSuccess:^{
// when url is tracking link and succeed
// do nothing
} onFailure:^(NSError* error) {
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
[webView loadRequest:[[NSURLRequest alloc] initWithURL:url]];
}];
if (isHandled) {
// when url is tracking link
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
}
// when url is not tracking link
decisionHandler(WKNavigationActionPolicyAllow);
}
启用 Hybrid App 设置后,应仅通过 Web SDK 收集在应用内 WebView 中发生的事件。如果同时使用 App SDK 收集事件,可能会导致重复统计。
如果应用内 WebView 使用的是实际的移动版网站,请仅通过 Web SDK 收集事件。
Was this page helpful?
func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy
) -> Void) {
if let url = navigationAction.request.url {
let isHandled = Airbridge.click(trackingLink: url) {
// when url is tracking link and succeed
// do nothing
} onFailure: { error in
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
webView.load(URLRequest(url: url))
}
if isHandled {
// when url is tracking link
decisionHandler(.cancel)
return
}
}
// when url is not tracking link
decisionHandler(.allow)
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL* url = navigationAction.request.URL;
if (url != nil) {
BOOL isHandled = [Airbridge clickWithTrackingLink:url onSuccess:^{
// when url is tracking link and succeed
// do nothing
} onFailure:^(NSError* error) {
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
[webView loadRequest:[[NSURLRequest alloc] initWithURL:url]];
}];
if (isHandled) {
// when url is tracking link
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
}
// when url is not tracking link
decisionHandler(WKNavigationActionPolicyAllow);
}
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
...
#import "ViewController.h"
#import <WebKit/WebKit.h>
#import <Airbridge/Airbridge.h>
@interface ViewController () <WKNavigationDelegate>
@end
@implementation ViewController {
WKWebView* webView;
}
- (instancetype)init
{
self = [super init];
if (self) {
WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController* controller = [[WKUserContentController alloc] init];
[Airbridge setWebInterfaceWithController:controller webToken:@"YOUR_WEB_SDK_TOKEN"];
configuration.userContentController = controller;
webView = [[WKWebView alloc] initWithFrame:CGRectNull configuration:configuration];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
webView.navigationDelegate = self;
self.view = webView;
[webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"YOUR_WEBSITE_URL"]]];
}
@end