点击推送通知时打开浏览器

时间:2015-04-29 08:35:39

标签: ios swift apple-push-notifications appdelegate

我想在用户点按推送通知时打开浏览器。

在我的app委托中,我有:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {    
    var json = remoteNotif[UIApplicationLaunchOptionsRemoteNotificationKey] as! NSDictionary

    storyboard = UIStoryboard(name: "Main", bundle: nil)
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    let navC = storyboard.instantiateViewControllerWithIdentifier("mainNav") as! NavViewController

    let data = json.objectForKey("data") as! NSDictionary
    let url = data.objectForKey("url") as! String
    UIApplication.sharedApplication().openURL(NSURL(string: url)!)

    self.window?.rootViewController = navC
    self.window?.makeKeyAndVisible() 
}

当用户点击推送通知时,这会给我一个黑屏20秒,然后打开应用程序,然后打开浏览器。 如何只在浏览器上打开推送通知,或者至少打开超过20秒?

谢谢。

3 个答案:

答案 0 :(得分:1)

虽然我只是打开一个网址,但是有同样的问题。我试图打开URL(该网络任务)而不将代码放在后台线程中的问题。只需使用它,并在点击推送通知后立即打开它:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{
    UIApplication.sharedApplication().openURL(NSURL(string: "myURL")!)
})

答案 1 :(得分:0)

您无法直接打开其他应用 - 您只能使用快速应用切换功能。 20秒的黑屏听起来很奇怪 - 它在多个设备上是否一致?

如果是这样的话 - 你应该真正运行乐器,看看哪些功能花了这么长时间才能工作。听起来你的应用程序出现之前的加载由于某种原因非常沉重。

如果Instruments没有给你任何东西(而且我很确定会这样做)你应该看看你将这个应用程序再次链接起来了 - 它是一个庞大的框架列表吗?

作为加载案例的快速入侵,故事板是重要部分 - 您可以在加载故事板之前尝试执行openURL。

确保app delegate中的shouldOpenURL方法非常高效,并且不会执行任何同步网络任务或类似的那样。

答案 2 :(得分:0)

当应用程序进入活动状态时,似乎问题与RunLoop有关。所以你只需要将代码放在当前循环的末尾。

下面演示了 Swift 3.2 代码,用于在用户点击iOS时从推送通知中打开网址:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [AnyHashable : Any] {
        self.application(application, didReceiveRemoteNotification: remoteNotification, fetchCompletionHandler: {_ in })
    }
    return true
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if UIApplication.shared.applicationState == .inactive ||
        UIApplication.shared.applicationState == .active { //the app is bringing to an user
        if let urlString = ((userInfo["aps"] as? [String : Any])?["content"] as? [String: Any])?["link"] as? String, let url = URL(string: urlString) {
            DispatchQueue.main.async {
                if UIApplication.shared.canOpenURL(url) {
                    UIApplication.shared.openURL(url)
                }
            }
        }
    }
    completionHandler(UIBackgroundFetchResult.noData)
}
PS:根据Marcos Reboucas的回答