在 "podcast://" 前缀的 URL 上调用 open(_:options:completionHandler:) 会导致 iOS Podcasts 应用程序将 "http://" 添加到原始 URL 之前

Calling open(_:options:completionHandler:) on a "podcast://"-prefixed URL results in the iOS Podcasts app prepending "http://" to the original URL

上下文

我正在 Xcode(iOS 13 和 Xcode 11.3)开发 Swift iOS 应用程序。

目标

基本上,在我的应用程序中,我希望能够在 iOS 播客应用程序中打开私人播客提要的 URL(将其添加为新订阅)。

我在做什么

我的理解是,这样做的方法是使用 UIApplication class 上定义的 open(_:options:completionHandler:) 方法,并在 URL 前加上 podcast://。这是一个例子:

// My URL
let url = URL(string: "podcast://https://username:password@example.com/private-podcast-feed")!

// From inside a `UIViewController` method...
UIApplication.shared.open(url, options: [:]) { (success: Bool) in
   // ... handle the result
}

问题

上面的代码确实打开了 iOS 播客应用程序并触发了一个 Add a Show by URL... 警告框,其输入已预先填充,但原来的 URL 现在带有 [=19] 前缀=];即 http://https://username:password@example.com/private-podcast-feed(示例见底部的屏幕截图)。

从 "user experience" 的角度来看,这种行为很糟糕,因为大多数人不会注意到并且操作会失败。

解决这个问题的一个潜在方法是在我的应用程序中省略 https:// 协议并使用预填充的 http:// 并在我的服务器上有一个 301 Redirect (我没有尝试查看 Podcasts 是否遵循重定向),但这对我的用例不利,因为我的 URL 包含凭据。

我的问题

有人知道解决这个问题的方法吗?

事实证明,我在应用程序中定义 URL 实例时没有使用正确的语法。我应该使用 podcast:https... 而不是使用 podcast://https... 而不是两个正斜杠 .

所以这是工作示例(即打开播客应用程序并且不将 http 添加到已经存在的 https 方案的示例):

// My URL
let url = URL(string: "podcast:https://username:password@example.com/private-podcast-feed")!

// From inside a `UIViewController` method...
UIApplication.shared.open(url, options: [:]) { (success: Bool) in
   // ... handle the result
}

最初让我感到困惑的是,在创建要由使用 iOS 中的 URL 方案的应用程序打开的 hyperlink 时,需要 "double forward slash" 语法。例如,如果我在电子邮件中共享 link,那么我需要指定 podcast://{my-url}。但是如果我想从内部和其他应用程序使用它的 URL 方案之一打开一个应用程序,那么我需要排除这两个斜杠,否则该命令可能会混淆目标应用程序(注意:我没有任何文档,但这是我在这个特定场景中观察到的)。

我真的只是在处理相反的问题时偶然发现了答案:我试图为我的一个 iOS 应用程序定义我自己的 URL 方案,我说的是文档(参见 Defining a Custom URL Scheme for Your App)。