2016-09-16 198 views
1

使用Firebase發送IOS通知。我點擊我的iphone上的通知消息,它​​啓動應用程序並立即關閉應用程序。我不知道我做錯了什麼,你能幫忙解決這個問題嗎?firebase通知,立即啓動和關閉ios應用程序

在這裏與AppDelegate.swift

的代碼
import UIKit 
import Firebase 
import FirebaseMessaging 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 


    //add it for firebase 
    FIRApp.configure() 

    let notificationTypes : UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound] 
    let notificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil) 
    application.registerForRemoteNotifications() 
    application.registerUserNotificationSettings(notificationSettings) 


    // Override point for customization after application launch. 
    return true 
} 

func applicationWillResignActive(application: UIApplication) { 
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
} 

func applicationDidEnterBackground(application: UIApplication) { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
} 

func applicationWillEnterForeground(application: UIApplication) { 
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
} 

func applicationDidBecomeActive(application: UIApplication) { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
} 

func applicationWillTerminate(application: UIApplication) { 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
} 

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 


    print("MessgaeID : \(userInfo["gcm_message_id"]!)") 
    print(userInfo) 


} 

}

2016年9月17日00:25:35.709調解[922:20184]配置默認應用。 2016-09-17 00:25:35.724調解[922:] Firebase Analytics v.3402000開始 2016-09-17 00:25:35.725調解[922:]要啓用調試日誌記錄,請設置以下應用程序參數:-FIRAnalyticsDebugEnabled 2016-09-17 00:25:35.729:FIRInstanceID啓用了AppDelegate代理,將swizzle應用委託給遠程通知處理程序。要禁用將「FirebaseAppDelegateProxyEnabled」添加到Info.plist並將其設置爲NO 2016-09-17 00:25:35.729:無法獲取APNS令牌Error Domain = com.firebase.iid Code = 1001「(null)」 2016-09-17 00:25:35.731:FIRMessaging庫版本1.2.0 2016-09-17 00:25:35.734:FIRMessaging AppDelegate代理啓用後,將調試應用委託遠程通知接收處理程序。將「FirebaseAppDelegateProxyEnabled」添加到Info.plist並將其設置爲NO 2016-09-17 00:25:35.752中介[922:]自動成功創建Firebase Analytics應用程序委託代理。要禁用代理,請將Info.plist中的標誌FirebaseAppDelegateProxyEnabled設置爲NO 2016-09-17 00:25:35.785調解[922:]啓用了Firebase Analytics 2016-09-17 00:25:35.813:無法提取APNS令牌錯誤域= NSCocoaErrorDomain代碼= 3010 「REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR_DESCRIPTION」 的UserInfo = {NSLocalizedDescription = REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR_DESCRIPTION}

+1

你能發佈完整的錯誤信息嗎?另外,首先打印出userinfo,我猜gcm_message_id鍵不存在。 – ohr

+0

請參閱錯誤消息 –

+0

請讓我知道如何打印userinfo –

回答

0

雖然我個人認爲你的錯誤可能歸因於的誤拼寫代碼中的「MESSAGEID」:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 


print("MessgaeID : \(userInfo["gcm_message_id"]!)") 
print(userInfo) 

} 

在不發生是問題的情況下,試試這個:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
       fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    // If you are receiving a notification message while your app is in the background, 
    // this callback will not be fired till the user taps on the notification launching the application. 
    // TODO: Handle data of notification 
    // Let FCM know about the message for analytics 
    FIRMessaging.messaging().appDidReceiveMessage(userInfo) 

    // Print message ID. 
    print("Message ID: \(userInfo["gcm.message_id"]!)") 

    // Print full message. 
    print("%@", userInfo) 


} 

在任何情況下,你的的AppDelegate應該看起來像下面這樣:

import UIKit 
import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 
var alertTitle: String? 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Continue to play users music from iTunes/Apple Music/ third party music streaming services 
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 
    // Register for remote notifications 
    if #available(iOS 8.0, *) { 
     // [START register_for_notifications] 
     let settings: UIUserNotificationSettings = 
      UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 
     // [END register_for_notifications] 
    } else { 
     // Fallback 
     let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound] 
     application.registerForRemoteNotificationTypes(types) 
    } 

    FIRApp.configure() 

    // Add observer for InstanceID token refresh callback. 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification), 
                name: kFIRInstanceIDTokenRefreshNotification, object: nil) 

    return true 
} 

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
    print("didRegisterForRemoteNotificationsWithDeviceToken()") 
    // if FirebaseAppDelegateProxyEnabled === NO: 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .Sandbox) 
    print("APNS: <\(deviceToken)>") 
} 

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 
    print("Registration for remote notification failed with error: \(error.localizedDescription)") 
} 

// [START receive_message] 
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
       fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    // If you are receiving a notification message while your app is in the background, 
    // this callback will not be fired till the user taps on the notification launching the application. 
    // TODO: Handle data of notification 

    // Let FCM know about the message for analytics 
    FIRMessaging.messaging().appDidReceiveMessage(userInfo) 

    // Print message ID. 
    print("Message ID: \(userInfo["gcm.message_id"]!)") 

    // Print full message. 
    print("%@", userInfo) 


} 
// [END receive_message] 

// [START refresh_token] 
func tokenRefreshNotification(notification: NSNotification) { 
    if let refreshedToken = FIRInstanceID.instanceID().token() { 
     print("InstanceID token: \(refreshedToken)") 
    } 

    // Connect to FCM since connection may have failed when attempted before having a token. 
    connectToFcm() 
} 
// [END refresh_token] 

// [START connect_to_fcm] 
func connectToFcm() { 
    FIRMessaging.messaging().connectWithCompletion { (error) in 
     if (error != nil) { 
      print("Unable to connect with FCM. \(error)") 
     } else { 
      print("Connected to FCM.") 
     } 
    } 
} 
// [END connect_to_fcm] 

func applicationDidBecomeActive(application: UIApplication) { 
    connectToFcm() 
} 

// [START disconnect_from_fcm] 
func applicationDidEnterBackground(application: UIApplication) { 
    FIRMessaging.messaging().disconnect() 
    print("Disconnected from FCM.") 
} 
func applicationWillEnterForeground(application: UIApplication) { 
    NSNotificationCenter.defaultCenter().postNotificationName("continueVideo", object: nil) 
} 

func applicationWillTerminate(application: UIApplication) { 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    // Saves changes in the application's managed object context before the application temrinates. 
    } 

} 

要麼工作。我也使用FCM從我的火力地堡的控制檯實現我的應用程序遠程推送通知和我使用火力地堡版本3.5.2,這完全適用於我,因爲事實上,我只是測試瞭然後再將它運行到我的設備中,我可以收到通知,輕掃並重新導入應用。

0

我覺得你的gcm_message_id不存在! gcm_message_id在userInfo中!

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    print("MessgaeID : \(userInfo["gcm_message_id"]!)") 
    print(userInfo) 
} 

嘗試打印您的userInfo以顯示所有您收到的數據。 :)

+0

請讓我知道如何打印userinfo –

+0

請讓我知道如何打印userinfo –

+0

模擬器無法收到通知,我只能在真正的iphone機器收到通知。 –

相關問題