我如何了解 UIApplication 是不是要在 Safari 应用程序中打开链接?

Posted

技术标签:

【中文标题】我如何了解 UIApplication 是不是要在 Safari 应用程序中打开链接?【英文标题】:How can I understand if UIApplication is going to open link in Safari app?我如何了解 UIApplication 是否要在 Safari 应用程序中打开链接? 【发布时间】:2015-03-15 03:17:01 【问题描述】:

我正在开发浏览器。我需要在同一个 WKWebView 实例中打开新的浏览器窗口,但我还需要能够在 Appstore 应用程序中打开链接。

- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 
    if (navigationAction.targetFrame == nil) 
        NSURL *url = navigationAction.request.URL;

        UIApplication *app = [UIApplication sharedApplication];
        if ([app canOpenURL:url]) 
            [app openURL:url];
        
    
    decisionHandler(WKNavigationActionPolicyAllow);


#pragma mark - WKUIDelegate

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
   forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures 
    if (!navigationAction.targetFrame.isMainFrame) 
        [webView loadRequest:navigationAction.request];
    
    return nil;

问题在于它会在 Safari 应用程序中打开所有新窗口。 我如何知道 UIApplication 是否会在 Safari 应用程序中打开链接?

【问题讨论】:

看方案。 httphttps URL 将在 Safari 中打开。 mailto打开邮件应用等 @rmaddy 但应用​​商店链接具有 http 方案,应在应用商店应用程序中打开 App Store 链接以itms:开头。 @maddy,是的,你是对的 【参考方案1】:

嗯,基本上,你无法区分这一点,因为 App Store 链接可能是 https:// 链接。

示例链接: https://itunes.apple.com/de/app/myLeetApp/id313370815?mt=8

Apple 建议您只使用openURL:,就像您在上面所做的那样。见https://developer.apple.com/library/ios/qa/qa1629/_index.html

如果你真的想要区分它们并做一些更花哨的事情(例如像这样使用 StoreKit:Possible to show a "in App Store modal" in iOS 6?),你别无选择,只能使用正则表达式解析每个链接像这样:

import UIKit

let url = "https://itunes.apple.com/de/app/myLeetApp/id313370815?mt=8"
if url.rangeOfString("itunes.apple.com") != nil 
    let pattern = "^https?:\\/\\/itunes\\.apple\\.com\\/.*id([0-9]*).*$"
    if let regex = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: nil) 
        let extractedAppID = regex.stringByReplacingMatchesInString(url, options: nil, range: NSMakeRange(0, countElements(url)), withTemplate: "$1")
    

使用extractedAppID,您可以打开SKStoreProductViewController 等。

【讨论】:

以上是关于我如何了解 UIApplication 是不是要在 Safari 应用程序中打开链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIApplication 切换视图控制器

你真的了解UIApplication吗?

如何在颤动中收听 UIApplication 生命周期 iOS

我是不是需要来自 ApplicationDelegate 函数的 UIApplication* 应用程序?

如何删除表视图核心数据中的行。斯威夫特3

如何拦截任何 UIApplication openURL 调用?