javascript - plugin - cordova教學




如何在Safari中打開外部鏈接而不是應用程序的UIWebView? (7)

我有一個Phonegap(cordova)應用程序,我想在phonegap WebView中加載一些外部網頁,我還有其他外部網頁,我想在用戶激活它時在Safari中加載。

通常,大多數人都有他們想要在WebView中打開外部鏈接的問題。 將OpenAllWhitelistURLsInWebView設置為YES (在Cordova.plist / Phongap.plist中)可以解決該問題。

但我不想打開WebView的所有鏈接,只是一些。

我希望我可以在Safari中打開window.open('http://someexternalsite')並在window.parent.location.href = 'http://mysite'中打開它以在WebView中打開它。

知道怎麼做嗎?


  1. 將target =“_ blank”添加到您的鏈接。 即:

    <a href="http://www.brandonbrotsky.com/" target="_blank"></a>
    
  2. 確保訪問在config.xml中具有* />的原點(確保它位於app目錄的根目錄中,位於www文件夾的上方。即:

    <access origin="*" />
    
  3. 將以下代碼添加到MainViewController.m

    - (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSURL *url = [request URL];
    
        // Intercept the external http requests and forward to Safari.app
        // Otherwise forward to the PhoneGap WebView
        if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
            [[UIApplication sharedApplication] openURL:url];
            return NO;
        }
        else {
            return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
        }
    } 
    

我製作了一個快速視頻,解釋瞭如何解決此問題:

http://www.youtube.com/watch?v=zqbjXSnAR-Q&feature=c4-overview&list=UUefS6KLvFQVjhmL6hiBq4Sg

希望能幫助到你!


只需捕獲javascript中包含target="_blank"所有鏈接,並使用'_system'參數將它們傳遞給window.open。 這適用於iOS和Android。

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});

如果你想在safari中打開一個外部URL,我認為這很有用:
如果您使用的是phonegap,則這是%100保證的解決方案 - 在ios6中測試。
在safari中打開外部URL做如下:

1 - 在外部主機(白名單)中添加鏈接。 例如http://google.com
2-in Cordova.plist或Phonegap.plist,將“OpenAllWhitelistURLsInWebView”從“是”更改為“否”
3 - 在您的應用程序中添加(target =“_ blank”)到您的鏈接

    <a href="http://google.com" target="_blank">Google.com</a>


謝謝。


如果要在safari中打開的鏈接都包含公共字符串,則可以使用下一段代碼。

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];

    // Intercept the external http requests and forward to Safari.app
    // Otherwise forward to the PhoneGap WebView
    if ([[url scheme] isEqualToString:@"SCHEME"]) {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }
}

放置在AppDelegate.m中的此代碼將打開在Safari中使用指定SCHEME的所有URL。

我擔心這就是我能想到的一切。

希望這可以幫助

更新:

代碼應該放在MainViewControler中,至少對於cordova 2.2.0。

該方法最初被評論。 我不得不用它來重定向Google地圖鏈接:

NSRange isGoogleMaps = [[url absoluteString] rangeOfString:@"maps.google.com" options:NSCaseInsensitiveSearch];
NSRange isGoogleTerms = [[url absoluteString] rangeOfString:@"terms_maps.html" options:NSCaseInsensitiveSearch];

if(isGoogleMaps.location != NSNotFound || isGoogleTerms.location != NSNotFound ) {
        [[UIApplication sharedApplication] openURL:url];
       return NO;
}
else 
    return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];

根據@TDeBailleul的回答,這對我有用。 基本上,任何具有PDF後綴的鏈接,或者如果它是我想在Safari中打開的特定頁面,或者如果它不是www.example.com/*(外部鏈接)中的頁面,它將在新窗戶:

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

    // Open PDF files, Specific Pages, and External Links (not beginning with http://www.example.com) in Safari.app
    if (
        (navigationType == UIWebViewNavigationTypeLinkClicked) && 
        ([[[request URL] absoluteString] hasSuffix:@"pdf"] || [[[request URL] absoluteString] hasPrefix:@"http://www.example.com/specific-page.php"] || ![[[request URL] absoluteString] hasPrefix:@"http://www.example.com"])
        ) { 

        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    } 

    return YES;
}

希望這有助於他人!


正確的方法是使用inAppBrowser插件

使用cordova CLI安裝它:

cordova plugin add org.apache.cordova.inappbrowser

然後,要在safari上打開一個鏈接,只需使用:

window.open('http://apache.org', '_system');

在npm上託管了一個較新版本的插件

從cordova CLI安裝它:

cordova plugin add cordova-plugin-inappbrowser

要在safari上打開網站,您可以使用

cordova.InAppBrowser.open('http://apache.org', '_system');

或者,如果您想繼續使用window.open,就像舊版本一樣,您可以在設備就緒事件上執行此操作:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
}

這對我有用,它有很多幫助

-(void)viewDidLoad
{
   [super viewDidLoad];
    ////////////////////////
    NSString *urlAddress = @"http://www.playbuzz.org/";
    //NSURL *myURL = [NSURL URLWithString:urlAddress];
    myWebview.delegate = (id)self;
   [myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:urlAddress]]];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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


    //  open External Links (not beginning with www.playbuzz.org/ in Safari.app
    if (
        (navigationType == UIWebViewNavigationTypeLinkClicked) &&
        ( ![[[request URL] absoluteString] hasPrefix:@"http://www.playbuzz.org/"])
        ) {

        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }

   //open Internal links in uiwebview
   return YES;
}`




cordova