在后台使用 App 运行 的自定义 URL 方案

Custom URL Scheme with App running in background

我创建了一个自定义 URL 方案来从其他应用程序启动我的应用程序。如果应用程序未打开,这可以在 Safari 中使用。它用函数加载 AppDelegate:

func application(_ app: UIApplication, open url: URL, options:  [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool

问题是当我打开应用程序并通过点击主页按钮将其置于后台时。我已设置为在 AppDelegate 中接收文本的变量不会再次被击中。我在 main VC 中设置了一个通知程序,当我将应用程序带回前台时它可以工作,但是我在 viewDidLoad 上引用的变量是空的,因为它是从 AppDelegate 读取的。根据 Apple 的文档,当自定义 url scheme 创建时,它会触发上面的函数。

The system delivers the URL to your app by calling your app delegate’s application(_:open:options:) method.

有一个 applicationWillEnterForeground 函数,但我不确定如果不调用该方法,如何将自定义 URL 接收到该函数中。

这是我目前的情况:

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var receivedURL: URL?

    func application(_ app: UIApplication, open url: URL, options:  [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        receivedURL = url
        return true
    }

在 MainViewController 中:

    let appDelegate = UIApplication.shared.delegate as? AppDelegate

    override fun viewDidLoad() {
       if appDelegate?.receivedURL != nil {
           urlToDecodeTextView.text = appDelegate?.receivedURL?.absoluteString
        }

NotificationCenter.default.addObserver(self, selector: #selector(handleLinks), name: UIApplication.willEnterForegroundNotification, object: nil)


    }

   @objc func handleLinks(notification: Notification) {
        print("made it back")  <-- This prints
        let test = appDelegate?.receivedURL <-- this is always nil
        urlToDecodeTextView.text = test?.absoluteString
    }

这是我的原始代码。如果应用程序未打开,此代码效果很好,但如果应用程序在后台 运行 则效果不佳。我确实注意到 appdelegate 函数每次都是 运行,但是当通知程序发生时,该值为 nil - 即使它是在 appdelegate 中设置的。

我最终想要做的是能够从电子邮件(文本或 URL)中复制 URL,并与我的应用程序共享。共享后,我的应用程序应在相应的文本视图中以 url 打开。我认为使用自定义 URL 方案并处理重写 link 可能更容易,但这已被证明是一个挑战。

而不是这个通知

NotificationCenter.default.addObserver(self, selector: #selector(handleLinks), name: UIApplication.willEnterForegroundNotification, object: nil)

你可以这样做

一些可公开访问的通知NSNotification.Name

let customNotifKey = NSNotification.Name("InterAppURLReceived")

然后更改侦听器

var receivedURL: URL? {
    didSet {
        if receivedURL != nil {
            NotificationCenter.default.post(name: customNotifKey, object: nil)
        }
    }
}

终于在 VC

中收到通知
        NotificationCenter.default.addObserver(self, selector: #selector(handleMethod(_:)), name: customNotifKey, object: nil)

现在您 VC 将知道何时设置变量。

首先,检查viewWillAppear方法中的变量。如果没有收到,希望它在收到时通知您