2015-04-29 32 views
5

我想在用戶點擊推送通知時打開瀏覽器。點擊推送通知時打開瀏覽器

在我的應用程序的委託,我有:

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秒?

謝謝。

+1

弄來這個問題解決了? – WannaBeGeek

+0

不...最後,一個新的UIViewController與webView – ilan

+0

好的感謝分享替代方式。 :)! – WannaBeGeek

回答

0

您無法直接打開其他應用程序 - 只能使用快速應用程序切換。 20秒的黑屏聽起來很奇怪 - 它在多個設備上是否一致?

如果是這樣 - 你應該真的運行儀器,看看哪些功能需要很長時間才能工作。這聽起來像你的應用程序出現之前的加載是非常重的出於某種原因。

如果Instruments沒有給你任何東西(我敢肯定它會),你應該看看你的應用再次鏈接了什麼 - 它是一個巨大的框架列表?

作爲快速入侵的情況下,加載故事板是很重要的部分 - 您可以嘗試在加載故事板之前執行openURL本身。

確保應用程序委託中的shouldOpenURL方法非常高效,並且不執行任何同步網絡任務或類似的東西。

+0

我將運行工具,但應用程序加載爐排和快速與不同的推我讓打開應用程序本身(我沒有發佈全部代碼)。只有當我打電話給UIApplication.sharedApplication()。openURL(NSURL(string:url)!)我得到黑屏 – ilan

+1

你可以按幾秒鐘停止Xcode後,你得到黑屏,並檢查調試堆棧上的調試導航,也許這可以幫助。 –

1

雖然我只是打開一個URL,但有同樣的問題。我試圖在不將代碼放入後臺線程的情況下打開URL(這是網絡任務)的問題。只要使用這一點,它打開了推送通知被點擊之後:

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

好像當一個應用程序帶來的是到Active狀態的問題與RunLoop連接。所以你只需要把你的代碼放到當前循環的最後。

下面是展示了雨燕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:基於馬科斯雷博薩斯回答

相關問題