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

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

问题描述:

我正在构建浏览器应用程序。我希望iOS将其作为浏览器进行检测。我试图在URL Schemes中添加http,但徒劳无益。我试过this answer将我的iOS应用程序检测为网络浏览器

+0

我不想改变,我想我的应用程序被检测为浏览器 –

+0

有没有解决上述提到的请求? –

+0

我认为Share Extension是你可以在iOS –

在iOS中,操作系统不会跟踪哪些应用程序是浏览器,并且就系统而言,用户应该使用Safari的一切功能。因此,没有类似于您所链接的问题的API,它是指macOS。

但是,如果您希望您的应用显示在“Open In”弹出窗口中,您可以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

@Mathew,你能描述一个例子吗? –

+0

@VaibhavJhaveri我编辑了我的答案 –

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

了解更多信息但是,当用户选择URL时,这不会打开您的应用程序。用户将不得不关闭其他应用程序并打开您的应用程序以在您的应用程序中查看共享URL。为此,您可以从SharingViewController类中显示正确的消息。

无论何时用户将与您的应用共享URL,您的SharingViewController中的didSelectPost()委托方法将被调用,您可以从此方法获取共享URL并在您的应用中使用该方法。

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中获取值存储,并显示它的URL。

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") 
    } 

这不能做,http是一个保留的URL方案,请参阅Using URL Schemes to Communicate with Apps

苹果提供内置支持的HTTP,邮寄地址,电话和短信网址等 方案。它还支持针对地图,YouTube和iPod应用的基于http的URL。这些方案的处理程序是固定的 并且不能更改。如果您的网址类型包含与Apple定义的方案相同的 ,则Apple提供的应用将启动 而不是您的应用。

你可以做的是使用Universal Links与您的应用程序,并使用您的应用程序(如果安装)作为您的网站的浏览器。不过,您无法为所有网址实现此目标。