web-dev-qa-db-ja.com

アプリのUIWebViewではなく、Safariで外部リンクを開くにはどうすればよいですか?

Phonegap WebView内にいくつかの外部WebページをロードするPhonegap(cordova)アプリケーションがあり、ユーザーがアクティブにしたときにsafariにロードする他の外部Webページがあります。

通常、ほとんどの人は、WebViewで外部リンクを開きたいという問題を抱えています。 OpenAllWhitelistURLsInWebView[〜#〜] yes [〜#〜]に設定する(Cordova.plist/Phongap.plist内)はその問題を解決します。

しかし、私はallを開きたくないので、WebViewをリンクします。

Safariで開くためにwindow.open('http://someexternalsite')を呼び出して、window.parent.location.href = 'http://mysite' WebViewで開きます。

これを行う方法はありますか?

29
Matthew Levine

サファリで開くリンクにすべて共通の文字列が含まれている場合は、次のコードを使用できます。

- (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は、指定されたSCHEMEを使用するすべてのURLをSafariで開きます。

思いつくのはそれだけだと思います。

お役に立てれば

PDATE:

コードは、少なくともCordova 2.2.0の場合、MainViewControlerに配置する必要があります。

メソッドは最初にコメントされます。私はそれを使用して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];
19

target="_blank"を持つjavascript内のすべてのリンクをキャッチし、 '_ 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');
});
11
Ryan

これは、@ TDeBailleulの回答に基づいて私にとってうまくいくものです。基本的に、PDFの接尾辞を持つリンク、OR Safariで開く特定のページの場合、ORページでない場合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;
}

これが他の人に役立つことを願っています!

9
adamdehaven

(phonegap 1.5.0以降)を使用できます:

<a href="some://external/url" target="_blank">Click Me</a>

これにより、phonegapがネイティブブラウザを起動します。

User868766が言及しているのは、上記を機能させるには、外部URLがホワイトリストに登録されている必要があるということです。私が取り組んでいるアプリは、ネイティブブラウザでニュース記事のソースを開いたため、ホワイトリストで*を使用して、ソースを除外しないようにしました。

お役に立てば幸いです。

7
Dan

これを行う正しい方法は、 inAppBrowserプラグイン を使用することです

cordova CLIを使用してインストールします。

cordova plugin add org.Apache.cordova.inappbrowser

次に、サファリのリンクを開くには、次を使用します。

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

プラグインの新しいバージョン npmでホストされています

cordova CLIからインストールする場合:

cordova plugin add cordova-plugin-inappbrowser

サファリでウェブサイトを開くには、次を使用できます

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

または、古いバージョンのようにwindow.openを引き続き使用したい場合は、デバイス準備イベントでこれを行うことができます:

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

Cordova 2.4 + iOSでテスト済み

「_system」を使用し、構成を更新する必要はありません

http://docs.phonegap.com/en/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser

target:(String)にURLをロードするターゲット(オプション、デフォルト: "_self")

_self-URLがホワイトリストにある場合はCordova WebViewで開きます。それ以外の場合はInAppBrowserで開きます_blank-InAppBrowserで常に開きます_system-常にシステムWebブラウザーで開きます

2
Alan124
  1. リンクにtarget = "_ blank"を追加します。すなわち:

    <a href="http://www.brandonbrotsky.com/" target="_blank"></a>
    
  2. Config.xmlでアクセスのOriginが* />であることを確認します(wwwフォルダーの上にあるappディレクトリーのルートにあることを確認してください。例:

    <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

それが役に立てば幸い!

0

xcodeのiside

// /Classes/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 ]; }
}
0
Lobo

これは私にとってはうまくいきます

-(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;
}`
0

サファリで外部URLを開きたい場合、これは便利だと思います:
phonegapを使用している場合、これは%100保証ソリューションです-ios6でテスト済み。
サファリで外部URLを開くには、次の手順を実行します。

1-外部ホストにリンクを追加します(ホワイトリスト)。例 http://google.com
2- Cordova.plistまたはPhonegap.plistで、「OpenAllWhitelistURLsInWebView」を「はい」から「いいえ」に変更します
3-アプリケーションで、リンクに(target = "_ blank")を追加します

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


ありがとうございました。

0