私のiPhoneアプリ内にUIWebViewが埋め込まれています。そのWebビュー内の特定のリンクを完全なMobile Safariアプリに開くことができるようにしたい(つまり、私の埋め込みバージョンではない)。
埋め込まれたWebビュー内で開くすべてのリンクの代わりに、これを強制するためにいくつかのhrefを構造化する簡単な方法はありますか?
ありがとう。
ランディの発言をさらに詳しく説明するために、これをアプリケーションで使用して、すべてのhttp://、https://、およびmailto:// URLを外部のSafariまたはMailアプリケーションで開くようにします。
-(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;
}
ランディが言うように、UIWebViewのデリゲートとして設定したクラス内にこれを実装する必要があります。選択したURLのみがSafariを起動するようにするには、それらのスキームをhttp://からsafari://などに変更し、それらのURLのみをシステムに送信します(カスタムURLスキームをhttp://で置き換えた後)。 。
これは、UIWebViewに表示されるHTMLである内部ヘルプドキュメント内で行います。これにより、アプリケーションに汎用のWebブラウザーが埋め込まれているレビュープロセスで問題が発生しなくなります。
はい、分かりました。多分それは完璧な解決策ではないかもしれませんが、あなたはこのようにそれを行うことができます:
あなただけWebViewController.m
:
行webView.delegate = self;
をviewDidLoad
プロシージャに追加します。
- (void)viewDidLoad {
webView.delegate = self;
.... your code ....
}
次に、上記のようにController.m
ファイル内の任意の場所に、ブール結果の関数に従ってファイルを追加できます。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
[[UIApplication sharedApplication] openURL:request.URL];
return false;
}
return true;
}
私はこれを自分で試したことはありませんが、UIWebViewDelegateメソッドを実装できると思います
webView:shouldStartLoadWithRequest:navigationType
これは、UIWebViewのリンクがクリックされるたびに呼び出されます。その方法では、クリックされたリンクがSafariを起動するかどうかを判断し、必要に応じてopenURLを使用する必要があります。
- (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;
}
UIWebViewデリゲートプロパティを、UIWebViewDelegateを実装するクラスのインスタンスに設定する必要があることを忘れないでください。
これは私たちがそれを解決した方法です、これをViewController.mファイルに追加してください:
- (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;
}
ブラッド・ラーソンの回答の迅速なバージョン:
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
}
}