在 "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)。
上下文
我正在 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)。