处理深层链接通知

时间:2018-04-22 00:55:34

标签: swift deep-linking

我正在为我的应用添加深层链接,并且在将URL移交给视图控制器时遇到困难。我尝试使用通知,但它不会一直有效。

我的应用代表:

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {  
        let notification = Notification(name: "DeepLink", object: url)
        NotificationCenter.default.post(notification)

        return true
    }
}

和View Controller:

class ViewController: UIViewController {
    func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.handleDeepLink), name: "DeepLink", object: nil)
    }

    @objc private func handleDeepLink(notification: Notification) {
        let url = notification.object as! URL
        print(url)
    }
}

问题:当我的应用程序被冷启动时,通知未被处理,我猜这是因为View Controller没有时间将自己注册为观察者。如果我按下主页按钮,请转到Notes并再次单击深层链接,一切正常。

问题:如何在应用程序冷启动时注册View Controller以观察通知?或者有更好的方法将URL从App Delegate发送到View Controller吗?

3 个答案:

答案 0 :(得分:1)

我认为最初的假设是假设您的视图控制器没有时间注册自己,这意味着URL和View控制器之间的连接必须解耦并位于视图控制器之外。

然后我会在收到URL时使用某种查找来实例化视图控制器。

例如,

if url.contains(“x”) {
  let vc = ViewController(...)
  cv.url = URL // Pass contextual data to the view controller.
  // Present or push cv
}

随着您的应用变得越来越复杂,您必须管理更具挑战性的场景,例如站立整个控制器堆栈或移除现有的控制器。

答案 1 :(得分:0)

我按照LaunchMe应用中的示例进行操作。这就解决了我的问题:

plot_ly(x =  ~  1:5,  y =  ~ 1:5, type="scatter",mode="markers",
        color =  1:5) %>% hide_colorbar() 

答案 2 :(得分:-1)

如果未处理通知则存储,并在viewDidLoad时加载。

var pendingNotificationInfo: PushNotificationInfo?