為什么要禁用URL Scheme
和Universal Link
(通用鏈接)
通常我們APP中都會(huì)嵌套一些web頁(yè)面,有時(shí)我們的web頁(yè)面會(huì)被DNS劫持從而跳轉(zhuǎn)到其他APP中;或者是某些APP的Universal Link
(通用鏈接)設(shè)置的比較容易觸發(fā)颊郎,當(dāng)web跨域跳轉(zhuǎn)就有可能跳轉(zhuǎn)到這些APP径筏。比如蘇寧易購(gòu)的Universal Link
(通用鏈接)為*.m.suning.com
,只要web進(jìn)行跨域跳轉(zhuǎn)*.m.suning.com
就會(huì)拉起蘇寧易購(gòu)APP腻扇。在這種情況下的話我們就需要在我們的APP中對(duì)web做一些處理從而來(lái)禁止拉起這些APP睛廊。
在iOS 9.0之后如果需要使用URL Scheme
喚起APP的話需要在info.plist中增加白名單,只有在白名單中的URL Scheme
才可以使用旭咽,因此可以禁止跳轉(zhuǎn)到意料之外的APP贞奋。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>openapp.jdmobile</string>
</array>
WKWebView
在iOS8.0后APP推出的WKWebView
是現(xiàn)有大部分APP中常用的控件之一。
-
WKWebView
中URL Scheme
禁用和啟用即使在info.plist中設(shè)置了白名單但是
WKWebView
對(duì)URL Scheme
默認(rèn)是不支持的穷绵,如果要支持URL Scheme
需要做一些處理- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *url = navigationAction.request.URL; // 調(diào)用電話 if ([url.scheme isEqualToString:@"tel"]) { if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow); }
-
WKWebView
中Universal Link
(通用鏈接)禁用對(duì)于
Universal Link
(通用鏈接)的話因?yàn)樵摲绞绞峭ㄟ^(guò)系統(tǒng)層級(jí)來(lái)直接拉起APP的轿塔,在WKWebView
也是可以無(wú)縫跳轉(zhuǎn)的。如果需要禁用Universal Link
(通用鏈接)的話只需要在WKNavigationDelegate
的- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
中WKNavigationActionPolicyAllow
替換成WKNavigationActionPolicyAllow+2
:- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { decisionHandler(WKNavigationActionPolicyAllow+2); }
UIWebView
雖然iOS8.0后提供了WKWebView
,但是如果需要手動(dòng)管理cookie
的話(WKWebView
在iOS11.0之后才可以手動(dòng)管理cookie
)或其他原因還是又很大一部分使用UIWebView
的APP催训。
-
UIWebView
中URL Scheme
禁用
在iOS9.0之后對(duì)于UIWebView
只有URL Scheme
配置在info.plist中才可以正常使用洽议,因此對(duì)URL Scheme
不需要做特殊處理。
在iOS 9.0之前在UIWebView
中禁用URL Scheme
需要我們?cè)?code>- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;代理方法中做一些處理漫拭。
首先我們可以依然設(shè)置白名單列表,例如:self.whiteSchemes = @[@"http",@"https"];
當(dāng)跳轉(zhuǎn)的Scheme
不在我們的白名單中就禁止跳轉(zhuǎn):- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = request.URL; if (![self.whiteSchemes containsObject:url.scheme]) { return NO; } return YES; }
-
UIWebView
中Universal Link
(通用鏈接)禁用
其實(shí)在APP中嵌套的web頁(yè)面大部分都是自己家的頁(yè)面亚兄,因此域名應(yīng)該是固定的。因此在UIWebView
中禁用Universal Link
(通用鏈接)我只想到用最笨的方法和禁用URL Scheme
方式一樣采驻。
設(shè)置白名單列表审胚,但是和白名單列表中存放的是host
(域名)而不是Scheme
,例如:self.whiteHosts = @[@"http",@"https"];
。當(dāng)跳轉(zhuǎn)的不是白名單中的話就直接禁止跳轉(zhuǎn)礼旅。- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = request.URL; if (![self.whiteHosts containsObject:url.host]) { return NO; } return YES; }
文章若有不對(duì)地方膳叨,歡迎批評(píng)指正