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

问题描述 投票:2回答:1

上下文

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

目标

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

我在做什么

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

// My URL
let url = URL(string: "podcast://https://username:[email protected]/private-podcast-feed")!

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

问题

上面的代码的确打开了iOS Podcasts应用,并触发了一个Add a Show by URL...警报框,其输入已预先填充,但是原始URL现在以http://为前缀;即http://https://username:[email protected]/private-podcast-feed(有关示例,请参见底部的屏幕截图)。

从“用户体验”的角度来看,此行为很糟糕,因为大多数人不会注意到,操作将失败。

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

我的问题

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

enter image description here

ios uikit uiapplication
1个回答
0
投票

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

所以这是工作示例(即将打开Podcasts应用并且不将http放在已经存在的https方案前面的示例):

// My URL
let url = URL(string: "podcast:https://username:[email protected]/private-podcast-feed")!

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

最初让我感到困惑的是,当在iOS中使用URL方案创建由应用程序打开的超链接时,需要使用“双斜杠”语法。例如,如果我在电子邮件中共享一个链接,则需要指定podcast://{my-url}。但是,如果我想从内部和其他应用程序中使用其URL方案之一打开应用程序,则需要排除这两个斜杠,否则该命令可能会使目标应用程序感到困惑(请注意:我对此没有任何文档,但这是我在此特定情况下观察到的结果。

我确实在解决相反的问题时才偶然发现答案:我试图为自己的一个iOS应用程序定义自己的URL方案,我说了文档中使用的语法(请参阅Defining a Custom URL Scheme for Your App

© www.soinside.com 2019 - 2024. All rights reserved.