我有一个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吗?
答案 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];
希望这有帮助。