【问题标题】:Opening an app from another app - "This app is not allowed to query for scheme"从另一个应用程序打开一个应用程序 - “此应用程序不允许查询方案”
【发布时间】:2016-12-06 10:56:30
【问题描述】:

我无法找到关于如何从我当前的自定义应用程序中打开另一个自定义应用程序的清晰、准确的指南。

我不断收到此错误:

此应用不允许查询方案myScheme。

【问题讨论】:

标签: ios swift swift3


【解决方案1】:

我通过执行以下操作成功地完成了这项工作:

在下面的示例中,主应用程序是我想要单击按钮并打开另一个应用程序的主应用程序。此示例中的另一个应用称为 app2。

两个应用程序必须属于同一方案,以防止出现上述“不允许”错误。

在下面的示例中,该方案称为 myapps,但它可以是您在“信息”选项卡中设置的任何内容(如下所述)。

在 app2 中:

  1. 单击您的应用目标(单击左侧层次结构中的应用名称,然后单击目标下的应用名称)。

  2. 单击信息选项卡并向下滚动到 URL 类型。

  3. 单击箭头展开 URL 类型,单击 + 添加新条目。

  4. 在标识符字段中输入唯一标识符(我只是使用了该应用程序的捆绑 ID...例如 com.mycompany.app2。

  5. 在 URL 方案字段中,输入 URL 方案的名称。在本例中,我们将其命名为 myapps,因此我们在字段中输入 myapps。此方案名称需要在主应用程序中设置。对于您要打开的每个附加应用程序,您需要设置不同的方案名称,然后将方案名称添加到主应用程序中。

在主应用程序中:

  1. 重复第 1 至 5 步 - 唯一的变化将是第 4 步,因为唯一标识符将不同,如果您要设置多个应用程序,第 5 步。

  2. 设置按钮。

  3. 将按钮连接到如下操作:

    @IBAction func pressOpenAnotherApp(_ sender: Any) {
        openApp(appURL: "myapps://com.companyname.app2"
    }
    
  4. 设置openApp功能:

    func openApp(appURL: String) {
         let openApp = URL(string: appURL)!
    
         if UIApplication.shared.canOpenURL(appURL) {
             UIApplication.shared.open(appURL, options: [:], completionHandler: { (success) in
                 print("Open App: \(appURL)")
                 print("Status: \(success)")
             })
          }
    }
    

这对我有用,虽然这些信息只是通过我自己的反复试验,所以它可能不是 100% 准确,但它有效!

【讨论】:

    【解决方案2】:

    在尝试实际打开 URL 之前,您是否使用了canOpenURL? (如果没有安装第二个应用程序,您应该这样做。)The documentation goes into plenty of detail,关于在 Info.plist 中包含 LSApplicationQueriesSchemes 的要求。

    【讨论】:

    • 据我了解,这仅适用于 iOS 9 及更早版本。该文档没有告诉您有关添加 URL 类型的任何信息。这不是一个完整的指南......它告诉你一个更大的难题的一小部分。我想要一份关于如何从另一个应用轻松打开 1 个应用的简短指南,我已经在下面记录了如何做到这一点。
    • 重读:这适用于 iOS 9 及更高版本。您的问题表明存在特定错误的问题,本文档说明了如何避免该错误
    • 如果您想要一份简短的指南,请在问题中说明。
    • 您发布的指南适用于 iOS 9 及更早版本。我需要 iOS 10 信息。我在标题 Swift 3 中提到了人们可能与 iOS 10 相关的内容,但一个 mod 一直在删除它,所以现在这个问题看起来有点漫无目的。它与 iOS 上的 Swift 3 相关。这是一个问题,如何从另一个应用程序中打开一个应用程序以及我收到的错误消息。然后我提供了解决这两个问题的指南,因为我找不到任何合适的现有答案或解决方案。
    • ‘在 iOS 9.0 或之后’是指 iOS 9 和 iOS 10 和 iOS 11 等。
    【解决方案3】:

    您有 2 个应用程序来测试此问题。

    1. App_B(从 App_A 打开应用)
    2. App_A(应用启动直接对 App_B 开放)

    步骤:App_B 在 App_B 中选择 set scheme Url(您要重定向的名称以检查此 App_B 是否已安装)

    好的,我们设置方案 URL 完成。 然后转到您的 App_A(您当前的应用程序)

    步骤:App_A

    1.创建你的项目

    2.create func open scheme url

    override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            openApp_B_installed()
    
            
        }
    
    func openApp_B_installed(){
            //LSApplicationQueriesSchemes in your Info.plist.
            let appName = "App_B"
            let appScheme = "\(appName)://"
            let appUrl = URL(string: appScheme)
    
            
            if let url = appUrl,
                UIApplication.shared.canOpenURL(url) {
                print("App installed")
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(url, options: [:], completionHandler: {
                        (success) in
                        if (success)
                        {
                            print("OPENED \(url): \(success)")
                        }
                        else
                        {
                            print("FAILED to open \(url)")
                        }
                    })
                } else {
                    // Fallback on earlier versions
                    UIApplication.shared.openURL(url)
                }
            }else {
                print("App not installed")
            }
            
        }
    
    1. 在 info plist 中添加 LSApplicationQueriesSchemes。 enter image description here

    恭喜你完成了。 您尝试通过安装 App_A , App_B 并安装 App_A 进行测试,只有您可以在 openApp_B_installed() 中调试

    我希望它有助于澄清和解决此主题的问题。 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2019-08-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多