2010-03-28 25 views
40

Tôi có một UIWebView được nhúng trong một ứng dụng iPhone của tôi. Tôi muốn có thể có các liên kết nhất định trong chế độ xem web đó mở trong ứng dụng Mobile Safari đầy đủ (tức là không phải phiên bản được nhúng của tôi).Buộc liên kết WebView để khởi chạy Safari?

Có cách nào đơn giản để cấu trúc một số href của tôi để ép buộc điều này, thay vì mọi liên kết mở trong trang web nhúng của tôi không?

Cảm ơn.

+0

[http://stackoverflow.com/questions/4452719/how-do-i-open-links-in-safari-thay-of-uiwebview/12103579 # 12103579] [1] [1]: http: // stackoverflow.com/questions/4452719/how-do-i-open-links-in-safari-thay-of-uiwebview/12103579 # 12103579 –

Trả lời

12

Tôi đã không cố gắng này bản thân mình nhưng tôi nghĩ rằng bạn có thể thực hiện phương pháp UIWebViewDelegate

webView:shouldStartLoadWithRequest:navigationType 

mà sẽ được gọi bất cứ lúc nào một liên kết trong UIWebView được nhấp vào. Trong phương pháp đó, bạn chỉ cần xác định xem liên kết được nhấp vào có dẫn đến khởi chạy Safari hay không và sử dụng openURL nếu cần.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    // Check if this was a click event and then some other criteria for determining if you want to launch Safari. 
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) { 
     [[UIApplication sharedApplication] openURL:request.URL]; 

     // Return false to indicate to the UIWebView to not navigate to the linked target 
     return false; 
    } 

    // Return true so that the UIWebView loads the link target 
    return true; 
} 

Đừng quên rằng bạn cần đặt thuộc tính ủy quyền UIWebView của mình thành một thể hiện của lớp triển khai UIWebViewDelegate.

61

Để mở rộng vào những gì Randy nói, đây là những gì tôi sử dụng trong ứng dụng của tôi để làm cho mọi http: //, https: //, và mailto: // URL mở ở bên ngoài Safari hoặc Mail ứng dụng:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{ 
    NSURL *requestURL =[ [ request URL ] retain ]; 
    if (([ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
     && (navigationType == UIWebViewNavigationTypeLinkClicked)) { 
     return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
    } 
    [ requestURL release ]; 
    return YES; 
} 

Như Randy nói, bạn sẽ muốn thực hiện điều này trong bất kỳ lớp nào bạn đặt làm đại biểu của UIWebView. Để chỉ có các URL chọn khởi chạy Safari, bạn có thể thay đổi lược đồ của chúng từ http: // thành safari: // hoặc tương tự và chỉ đá các URL đó vào hệ thống (sau khi thay thế lược đồ URL tùy chỉnh bằng http: //) .

Tôi làm điều này trong tài liệu trợ giúp nội bộ của tôi, HTML được hiển thị trong UIWebView, để tôi không gặp phải vấn đề trong quá trình xem xét với trình duyệt web có mục đích chung được nhúng trong ứng dụng của tôi.

+0

Không giữ lại và phát hành URL thực sự hoang tưởng? – morningstar

+0

@morningstar - Có lẽ, và nó đã lỗi thời với ARC, nhưng lúc đó tôi đang vật lộn với các vụ đụng liên quan đến luồng ở những nơi khác (các đối tượng tự động được chuyển vào các phương thức trên các chủ đề khác nhau đang được giải quyết ở giữa phương thức đó), vì vậy tôi đã sai lầm khi bị hoang tưởng. Một lần nữa, điều này được thực hiện cho bạn ngay bây giờ bởi ARC, vì vậy mã của tôi không còn có nó trong đó nữa. –

+0

Vâng, được rồi, tôi có thể thấy nó có thể cần thiết như thế nào vì vấn đề luồng. – morningstar

20

Ok tôi hiểu rồi. Có lẽ không phải là giải pháp hoàn hảo của mình, nhưng bạn có thể làm điều đó như thế này:

Chỉ trong bạn WebViewController.m:

thêm dòng webView.delegate = self; thủ tục viewDidLoad:

- (void)viewDidLoad { 
    webView.delegate = self; 
    .... your code .... 
} 

Sau đó, bạn có thể thêm như được mô tả ở trên một nơi nào đó trong số Controller.m Tệp theo sau hàm boolean kết quả:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:request.URL]; 
     return false; 
    } 
    return true; 
} 
+1

Đối với newbs, thiết lập bit về đại biểu là quan trọng :) – firecall

+0

Thanku rất nhiều :) –

1

Đây là cách chúng tôi giải quyết nó, thêm video này vào tập tin ViewController.m của bạn:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    first.delegate = (id)self; 
       [first loadRequest:[NSURLRequest requestWithURL:[NSURL  URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]]; 
} 

// Add section below so that external links & PDFs will open in Safari.app 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request  navigationType:(UIWebViewNavigationType)navigationType { 
    if (navigationType == UIWebViewNavigationTypeOther) { 
     NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari"; 
     NSString *reqURL = request.URL.absoluteString; 
     if ([reqURL isEqualToString:checkURL]) 
      { 
       [[UIApplication sharedApplication] openURL:request.URL]; 
      return false; 
    } 
     else { 
      return true; 
     } 
    } 
    return true; 
} 
1

phiên bản Swift của câu trả lời Brad Larson của:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 

    var url: NSURL = request.URL! 
    var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto" 
    if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) { 
     return !UIApplication.sharedApplication().openURL(request.URL!) 
    } else { 
     return true 
    } 
} 
Các vấn đề liên quan