WKWebView
を中心としたiOSハイブリッドアプリがあり、ローカルWebアセットを loadFileURL
で読み込んでいます。 WKWebView
は、HTTPSを介してjQuery.ajax
を使用してバックエンドAPIと通信します。アプリはモバイル専用であり、APIも「モバイル専用」にしたいです。つまり、ChromeやFirefoxなどのブラウザがAPIを使用するのをブロックしたいのです。
私の戦略は、API応答にAccess-Control-Allow-Origin
ヘッダーを次のように設定することです。
Access-Control-Allow-Origin: app://myApp
ブラウザがAPIをクエリしないように、WKWebView
のオリジンをapp://myApp
に変更できますか?
ケース:1
ドキュメントの作成時またはドキュメントの読み込み終了時にJSをWKWebviewに挿入し、カスタム実装でJavaスクリプトXMLHTTPRequestopenメソッドをフックして、すべての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];
お役に立てれば。