将我的iOS应用程序检测为Web浏览器

时间:2016-09-30 06:54:08

标签: ios swift xcode browser

我正在构建一个浏览器应用。我希望iOS将其检测为浏览器。我尝试将http添加到网址计划中但徒劳无功。

我尝试了this answer

4 个答案:

答案 0 :(得分:1)

在iOS中,操作系统无法跟踪哪些应用程序是浏览器,就系统而言,用户应该使用Safari进行所有操作。因此,没有类似于您链接的问题的API,它指的是macOS。

但是,如果您希望应用程序显示在“打开方式”弹出窗口中,您可以set your app as able to open certain document types。有很多system-declared document types,但您可能需要特别注意与网络相关的内容,例如public.html(kUTTypeHTML)。

不幸的是,我很确定iOS不允许应用程序声明支持打开普通的http URL,只支持自定义URL方案,但您仍然可能需要声明对某些文件类型(如HTML)的支持,以防万一用户尝试打开一个。这是一个例子:

首先,您需要告诉Xcode您支持哪些文档,您可以通过选择目标,转到信息和添加文档类型来实现:

Adding public.html to Document Types

然后,只要您的应用被要求打开.webarchive文件,This document就会说明您必须打开它的位置。基本上,因为您不拥有文件类型,所以您可以在application:didFinishLaunchingWithOptions:application:willFinishLaunchingWithOptions中查看选项字典。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

    if let url = launchOptions?[UIApplicationLaunchOptionsKey.url] as? URL {
        // This code would probably exist in one of your controllers
        let request = URLRequest(url: url)
        webview.load(request)
    }

    return true
}

所以实际上,AppDelegate很可能只需将URL传递给您,就可以将其委托给您应用的其他部分。

但同样,用户仍然可能无法访问Safari并只是将网页分享到您的应用。您的应用程序可能仅在用户实际点击实际html文件时显示,但它可能是iOS提供的最接近您想要的内容。

答案 1 :(得分:1)

Not possible定义应用中的任意位置,以便其他应用将您的应用视为浏览器,但是如果您想将其他应用的网址带到您的应用中您可以为您的应用创建类型共享的应用扩展。这将允许其他应用与您的应用共享网址。当用户选择网址并分享时,他们会看到您的应用。您可以从NSExtensionMainStoryboard自定义班级共享视图的视图。您可以从Apple's Developer website

了解更多相关信息

但是,当用户选择网址时,这将无法打开您的应用。用户必须关闭其他应用并打开您的应用才能在您的应用中查看共享网址。为此,您可以显示来自SharingViewController课程的正确消息。

每当用户与您的应用共享网址时,您的SharingViewController中的didSelectPost()委托方法都会被调用,您可以从此方法获取共享网址,并在您的应用中使用该方法。

    override func didSelectPost() {
        if let item = extensionContext?.inputItems.first as? NSExtensionItem {
            if let itemProvider = item.attachments?.first as? NSItemProvider {
                if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL) {
                    itemProvider.loadItemForTypeIdentifier(kUTTypeURL, options: nil, completionHandler: { (url, error) -> Void in
                        if let shareURL = url as? NSURL {
                            var defaults = NSUserDefaults(suiteName: "group.com.yourapp.extension")
                            defaults?.setObject(url.absoluteString(), forKey: "sharedURL")
                            defaults?.synchronize()
                        }
                        self.extensionContext?.completeRequestReturningItems([], completionHandler:nil)
                    })
                }
            }
        }
    }

您可以在应用中使用套装名称在NSUserDefalts中获取价值存储,并显示其中的网址。

    var defaults = NSUserDefaults(suiteName: "group.com.yourapp.extension")
    defaults?.synchronize()

    // Check for null value before setting
    if let restoredValue = defaults!.stringForKey("sharedURL") {

        //create url with sctring and use it as per your requirement
    }
    else {
      // ("Cannot find value")
    }

答案 2 :(得分:1)

无法执行此操作,http是保留的网址方案,请参阅Using URL Schemes to Communicate with Apps

  

Apple提供对http,mailto,tel和sms URL的内置支持   计划等。它还支持基于http的URL   地图,YouTube和iPod应用。这些方案的处理程序是固定的   并且无法改变。如果您的URL类型包含一个方案   与Apple定义的相同,Apple推出的应用程序已推出   而不是你的应用程序。

您可以做的是在您的应用中使用Universal Links并使用您的应用(如果已安装)作为您网站的浏览器。但是,您无法为所有网址实现此目的。

答案 3 :(得分:0)

现在可以在 iOS 14 上完成:查看 Apple 网站上的这篇文章了解更多信息。

Preparing Your App to be the Default Browser or Email Client