我想在用户点按推送通知时打开浏览器。
在我的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秒?
谢谢。
答案 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的回答