2016-03-05 16 views
13

Tôi có ứng dụng lai iOS tập trung xung quanh một tài sản web cục bộ với . WKWebView liên lạc qua HTTPS với API phụ trợ với jQuery.ajax. Ứng dụng này chỉ dành cho thiết bị di động và tôi muốn API cũng là "chỉ dành cho thiết bị di động". Tức là, tôi muốn chặn các trình duyệt như Chrome và Firefox sử dụng API.Thay đổi nguồn gốc của WKWebView trong ứng dụng iOS

chiến lược của tôi là để thiết lập các tiêu đề trên Access-Control-Allow-Origin phản ứng API như sau:

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

Tôi có thể thay đổi nguồn gốc của WKWebView-app://myApp để tránh các trình duyệt từ truy vấn API?

Trả lời

4

Trường hợp: 1

Bạn có thể tiêm một JS vào WKWebview tại thời điểm tạo ra tài liệu hay tài liệu tải xong và móc java script XMLHttpRequest phương pháp mở với thực hiện tùy chỉnh của bạn để thêm tiêu đề tùy chỉnh này cho tất cả các AJAX yêu cầu từ WKWebView.

mã ví dụ

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; 

Và trong XMLHTTPRequestHook.js cố gắng móc XMLHttpRequest với thực hiện tùy chỉnh của bạn để thêm tiêu đề tùy chỉnh này và gọi lại các phương pháp mở ban đầu.

Trường hợp 2 Nếu bạn muốn tiêu đề này sẽ được bổ sung trong khi tải các URLRequest trong WKWebview, bạn có thể thêm tiêu đề này để NSMutableRequest như dưới đây và tải yêu cầu này trong WKWebview. Tuy nhiên với phương pháp này bạn có thể không có tiêu đề này trong tất cả các cuộc gọi AJAX từ WKWebview.

mã ví dụ:

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]; 

Hope this helps.

+0

Xin chào Chandra. Về phía ứng dụng, tôi đang tìm cách thay đổi 'origin'. Tiêu đề 'Access-Control-Allow-Origin' được thêm vào bởi các phản hồi của máy chủ API! – Randomblue

+0

Hi ..Nếu bạn đang tìm kiếm một cái gì đó như NSURLProtocol để chặn các yêu cầu mạng từ WKWebview, NSURLProtocol không hoạt động với WKWebview như WKWebview tải tất cả các yêu cầu mạng từ một quá trình khác nhau. Tuy nhiên, trường hợp của bạn vẫn thử giải pháp được đề cập ở trên trong case1 để thay đổi các tiêu đề thành các giá trị cần thiết cho tất cả các cuộc gọi AJAX từ WKWebview và xem liệu trợ giúp đó. – Chandra

+0

Ngoài ra, bạn có thể thay đổi chiến lược của mình và thêm tiêu đề tùy chỉnh (thay vì sử dụng tiêu đề Access-Control-Allow-Origin) cho tất cả cuộc gọi AJAX từ WKWebView và trong máy chủ API của bạn, bạn có thể sử dụng tiêu đề tùy chỉnh này để xác định cuộc gọi api từ ứng dụng của bạn chứ không phải từ bất kỳ trình duyệt nào khác. Hãy cho tôi biết nếu nó có ích. – Chandra

Các vấn đề liên quan