我在UIWebView中打开我的移动网站,但我希望指向另一个网站的链接在Safari的新窗口中打开。所以我有这样的代码:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"*** %@", request.URL.absoluteString);
if (![self checkURL:request.URL]) {
//open external links in Safari
if ([[UIApplication sharedApplication] canOpenURL:request.URL])
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
}
return YES;
}
- (BOOL)checkURL:(NSURL *)url {
NSURLComponents *urlComp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];
if ([urlComp.host rangeOfString:@"myprojectsite.ru"].length > 0 ||
[urlComp.host isEqualToString:@"connect.mail.ru"] || //for MailRu registration
[urlComp.host isEqualToString:@"js.stripe.com"]) { //prevents opening this link by Safari
return YES;
}
return NO;
}
一切正常,但在我的网站上,我有来自 stripe 的 javascript,它下载具有内容类型text/html
的脚本https://js.stripe.com/v2/channel.html?stripe_xdm_e=
,因此该脚本在新窗口中打开。我已经用checkURL
方法进行了黑客攻击。但是,如果我有像 Stripe 这样的新脚本呢?我尝试检查navigationType
但对于此链接,它返回UIWebViewNavigationTypeLinkClicked。我怎样才能解决这个问题?
UIWebview "shouldStartLoadWithRequest" 有一个委托方法,它有一个参数 Request。从此请求中,我们可以轻松获取它将要打开的URL。然后,一旦你有了网址,你就可以呈现一个UIViewcontroller,它将有一个UIWebview,并将加载该网址。然后从取消按钮,我们可以在完成时对此视图控制器进行关闭调用。希望这可能会有所帮助。