无法让自定义 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 一起正常工作

无法让自定义的活动指示器生成动画

无法让自定义对话框与 DirtyForms 一起使用

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

在 Django 中正确使用自定义标签时遇到问题

无法使图表对象在自定义UIView中工作