在iOS应用中更改WKWebView的来源

时间:2016-03-05 18:18:11

标签: javascript ios wkwebview

我有一个iOS混合应用,以WKWebView加载本地网络资源loadFileURL为中心。 WKWebView通过HTTPS与jQuery.ajax的后端API进行通信。该应用仅限移动设备,我希望API也是“仅限移动设备”。也就是说,我想阻止Chrome和Firefox等浏览器使用API​​。

我的策略是在API响应中设置Access-Control-Allow-Origin标题,如下所示:

Access-Control-Allow-Origin: app://myApp

我可以将WKWebView的来源更改为app://myApp,以避免浏览器查询API吗?

1 个答案:

答案 0 :(得分:4)

<强>案例:1

您可以在创建文档或文档完成加载时将JS注入WKWebview,并将Java脚本XMLHTTPRequest open方法与您的自定义实现挂钩,以便为来自WKWebView的所有AJAX请求添加此自定义标头。

示例代码

NSString *XMLHTTPRequestHookJSPath = [[NSBundle mainBundle] pathForResource:@"XMLHTTPRequestHook.js" ofType:nil];
    NSString *kXMLHTTPRequestHookJS = [NSString stringWithContentsOfFile:XMLHTTPRequestHookJSPath encoding:NSUTF8StringEncoding error:NULL];
    WKUserContentController *contentController = [[WKUserContentController alloc] init];
    WKUserScript *script = [[WKUserScript alloc] initWithSource:kXMLHTTPRequestHookJS injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
    [contentController addUserScript:script];
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = contentController;

    self.lastUsedWebView = [[WKWebView alloc] initWithFrame:self.webContainerView.bounds configuration:configuration];
    self.lastUsedWebView.navigationDelegate = self;

在XMLHTTPRequestHook.js中尝试将XMLHttpRequest与您的自定义实现挂钩,以添加此自定义标头并回调原始的open方法。

案例2 如果您希望在WKWebview中加载URLRequest时添加此标头,可以将此标头添加到NSMutableRequest,如下所示,并在WKWebview中加载此请求。但是,使用此方法,您可能无法在WKWebview的所有AJAX调用中使用此标头。

示例代码:

WKWebView * webView = /*set up your webView*/
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]];
[request addValue:@"app://myApp" forHTTPHeaderField:@"Access-Control-Allow-Origin"];
// use stringWithFormat: in the above line to inject your values programmatically
[webView loadRequest:request];

希望这有帮助。