无法让自定义 url 方案在 iOS 中工作
Posted
技术标签:
【中文标题】无法让自定义 url 方案在 iOS 中工作【英文标题】:can't get custom url scheme to work in iOS 【发布时间】:2019-12-10 20:23:47 【问题描述】:我创建了一个快速示例应用程序,它只是一个带有按钮的页面,单击该按钮时会启动 SFSafariViewController,其 URL 指向我创建的本地主机页面。 localhost 页面上只有一个指向 mytestapp://hello 的链接。通过将 mytestapp url 方案添加到“URL 类型”部分,我在 Xcode 的应用程序设置中注册了 mytestapp url 方案。计划是在将 URL 方案实施到我正在构建的主应用程序之前确保它正常工作,但是当我单击 localhost 页面中的链接时没有任何反应。 SFSafariViewController 加载完美,localhost 页面加载正常,我点击链接,没有任何反应。
我在应用委托的 application(:url:options) 方法中添加了一个简单的打印语句,但它永远不会运行。
这里是 ViewController 代码...
import UIKit
import SafariServices
class ViewController: UIViewController, SFSafariViewControllerDelegate
@IBOutlet weak var launchButton: UIButton!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
@IBAction func launchTap(_ sender: UIButton)
guard let url = URL(string: "http://localhost.dcom/test/proof.php") else
print("Unable to create the URL")
return
let authorizationController = SFSafariViewController(url: url)
authorizationController.delegate = self
present(authorizationController, animated: true, completion: nil)
func safariViewControllerDidFinish(_ controller: SFSafariViewController)
print("safari completed")
以及这里的应用委托方法...
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
print("app received url: \(url)")
guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true), let message = components.path else
print("Invalid URL")
return false
print("The message received was \(message)")
return true
我不知道为什么这不起作用,似乎我做了我应该做的一切,但应用程序委托中的打印行从未被调用。
不确定你是否需要它,但以防万一,我的本地主机页面实际上只是......
<?php
echo '<a href="mytestapp://hello">Here goes nothing</a>';
是否有某些东西可能无法在 xcode 的模拟器中工作,并且必须在实际设备上才能使 URL 方案工作?我在某个地方错过了一步吗?还有什么我不知道的?任何帮助将非常感激。谢谢
【问题讨论】:
这是 ios 13 并且您正在使用场景吗?如果是这样,您需要在场景委托中实现scene(_:openURLContexts:)。我相信如果你使用场景,那么application(_:open:options:)
将不会被调用。
我不这么认为。我看到有一个场景委托,但链接来自网页,所以我不确定如何实现 open 功能,因为我没有打开链接,就其本身而言,我只是响应一个网络链接。我可能是错的,我绝对不是这里的专家。
如果您有场景委托,那么您正在使用场景,除非您已采取措施选择不使用它们。尝试实现我提到的场景委托方法,在其中放置一个断点或打印语句,然后查看它是否在您点击链接时被调用。
这能回答你的问题吗? Method 'application:openURL:options:' is not called
【参考方案1】:
这是test project
我所做的唯一更改是将网页更新为以下内容。 PHP 没有问题,因为我没有设置 PHP。
此外,您还可以在 Scene Delegate 中获得回调
func scene(_scene: UIScene, openURLContexts URLContexts: Set)
<html>
<body>
<a href="mytestapp://hello">Here goes nothing</a>
</body>
</html>
【讨论】:
将打印代码添加到场景方法有效。在没有场景的情况下在 iOS12.0 上进行这项工作有什么技巧吗?我在实际应用中的设置几乎相同,只是没有场景而且我没有收到打印消息 在这种情况下使用 AppDelegate 的 openURL 委托。休息应该是一样的以上是关于无法让自定义 url 方案在 iOS 中工作的主要内容,如果未能解决你的问题,请参考以下文章
无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作