Корпус: 1
Вы можете придать JS в WKWebview в момент создания документа или документа закончена загрузка и зацепить Java Script XMLHTTPRequest открытым способом с помощью пользовательской реализации, чтобы добавить этот пользовательский заголовок для всех AJAX запросы от WKWebView.
пример код
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 с пользовательской реализацией, чтобы добавить этот пользовательский заголовок и перезвонить оригинальный метод открытого.
Случай 2 Если вы хотите, этот заголовок будет добавлен при загрузке URLRequest в WKWebview, вы можете добавить этот заголовок NSMutableRequest, как показано ниже, и загрузите этот запрос в WKWebview. Однако с помощью этого метода у вас может не быть этого заголовка во всех вызовах AJAX из WKWebview.
пример код:
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];
Надеется, что это помогает.
Hi Chandra. На стороне приложения я ищу, чтобы изменить «происхождение». Заголовок 'Access-Control-Allow-Origin' добавляется ответами сервера API! – Randomblue
Привет. Если вы ищете что-то вроде NSURLProtocol для перехвата сетевого запроса из WKWebview, NSURLProtocol не работает с WKWebview, поскольку WKWebview загружает все сетевые запросы из другого процесса. Однако вы по-прежнему пытаетесь решить упомянутое выше решение в case1, чтобы изменить заголовки на требуемые значения для всех вызовов AJAX из WKWebview и посмотреть, поможет ли эта помощь. – Chandra
Также вы можете изменить свою стратегию и добавить собственный заголовок (вместо заголовка Access-Control-Allow-Origin) для всех вызовов AJAX из WKWebView и на вашем сервере API вы можете использовать этот настраиваемый заголовок, чтобы определить, что вызовы api из вашего приложения, а не из любого другого браузера. Сообщите мне, если это поможет. – Chandra