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

时间:2019-05-19 15:45:36

标签: swift appdelegate url-scheme

我创建了一个自定义URL方案以从其他应用程序启动我的应用程序。如果该应用未打开,则可从Safari使用。它使用以下功能加载AppDelegate:

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

问题是,当我打开应用程序时,通过单击“主页”按钮将其放置在后台。我设置为在AppDelegate中接收文本的变量不再受到攻击。我在主VC中设置了一个通知程序,当将应用程序重新放回前台时,该通知程序可以工作,但是我在viewDidLoad上引用的变量为空,因为它是从AppDelegate读取的。根据Apple的文档,创建自定义网址方案后,它将达到上面的功能。

  

系统通过调用应用程序代表的application(_:open:options :)方法将URL传递给您的应用程序。

有一个用于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),并与我的应用共享。共享时,我的应用程序应在相应的textview中使用url打开。我认为使用自定义URL方案和处理重写链接可能会更容易,但是事实证明这是一个挑战。

1 个答案:

答案 0 :(得分:0)

代替此通知

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方法中检查变量。如果未收到,希望它在收到时通知您