2013-04-13 17 views
9

Tôi đã sử dụng UIWebView để hiển thị nội dung động, thay vì thực hiện nó một cách tự nhiên bằng cách sử dụng các phần tử giao diện người dùng. Có thể kích hoạt chức năng ứng dụng gốc từ chỉ cần nhấn các liên kết bên trong UIWebView không? Ví dụ: nhấn vào liên kết sau đó chuyển Chế độ xem hiện tại?UIWebView có thể tương tác (giao tiếp) với ứng dụng không?

Trả lời

23

Có, có thể. Trong html của bạn, bạn viết một JS để tải một URL với một chương trình giả mạo như

window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here"; 

Sau đó, trong mã iOS của bạn, gán một đại biểu để WebView của bạn, và trong đại biểu của bạn, xử lý

webView:shouldLoadWithRequest:navigationType 

với một cái gì đó giống như

if([request.URL.scheme isEqualToString: @"request_for_action"]) 
{ 
    // parse your custom URL to extract parameter, use URL parts or query string as you like 
    return NO; // return NO, so webView won't actually try to load this fake request 
} 

-

Chỉ cần một sang một bên, bạn có thể làm theo cách khác, chúng ta hãy iOS đồng de gọi một số mã JS trong html của bạn bằng cách sử dụng

NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"]; 
9

Có! Khi người dùng nhấn một liên kết, bạn sẽ nghe về nó trong ủy nhiệm của web view và sau đó có thể làm bất cứ điều gì bạn muốn. Công cụ mạnh mẽ có thể được thực hiện theo cách này.

Đại biểu của chế độ xem web được gửi webView:shouldStartLoadWithRequest:navigationType:. Bạn phân tích những gì đã xảy ra, và đáp ứng như bạn muốn. Để ngăn chặn xem web từ cố gắng để làm theo các liên kết (có thể hoàn toàn giả mạo, sau khi tất cả), chỉ cần trả lại NO.

Trong ví dụ này từ ứng dụng Tin tức TidBITS, tôi có một liên kết trong trang Web sử dụng sơ đồ play: được tạo thành hoàn toàn. Tôi phát hiện thấy rằng trong đại biểu và chơi:

- (BOOL)webView:(UIWebView *)webView 
     shouldStartLoadWithRequest:(NSURLRequest *)r 
     navigationType:(UIWebViewNavigationType)nt { 
    if ([r.URL.scheme isEqualToString: @"play"]) { 
     [self doPlay:nil]; 
     return NO; 
    } 
    if (nt == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:r.URL]; 
     return NO; 
    } 
    return YES; 
} 
+0

Có vẻ chính xác những gì tôi cần thực hiện. Nhưng tôi không thể tìm ra nơi nào tôi đặt phương pháp này? Cảm ơn câu trả lời mô tả, nhân tiện! –

+0

Bạn đặt nó ở bất cứ đâu đại diện của UIWebView! – matt

+0

Alwesome, công trình này! :) Một câu hỏi nữa: tại sao khi tôi nhấp vào liên kết với lược đồ url được xác định trước, ứng dụng sẽ chuyển hướng đến Safari và cố gắng mở nó? –

2

Thực hiện phương thức UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType:.

Xử lý điều hướng Loại và yêu cầu nếu cần.

+0

Tôi đã thiết lập các đại biểu và thực hiện các phương pháp đại biểu uiwebview. Nhưng không có phương thức đại biểu nào của tôi được gọi khi tôi nhấp vào một số nội dung uiwebview. Không có gọi lại. Cần làm gì? – iPhoneDeveloper

+0

@iPhoneDeveloper Bạn nên đăng câu hỏi của riêng bạn với tất cả các chi tiết liên quan. – rmaddy

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