【问题标题】:Cloud messaging handing terminate app云消息处理终止应用程序
【发布时间】:2016-09-16 22:06:51
【问题描述】:

我有一个将用户会话存储在 NSUserDefaults 中的应用程序。当应用程序被强制关闭时,在初始验证数据控制器用户会话是否存在,如果有则发送到启动窗口如下:

override func viewWillAppear(animated: Bool) {

    self.view.hidden = true

    let defaults = NSUserDefaults.standardUserDefaults()
    if   defaults.stringForKey("user") != nil
    {

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("vistaInicio") as! ViewControllerInicio
            self.presentViewController(viewController, animated: true, completion: nil)
        })


    }else
    {
    self.view.hidden = false

    }

}

直到今天,当我决定按照本教程 Setting up a Firebase Cloud Messaging Client App on iOS 更新 firebase 来实现推送通知时,这一直很顺利。当他杀死应用程序并再次输入时出现问题,并给出以下错误代码:

 2016-05-19 16:05:27.647: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(full)"
 2016-05-19 16:05:27.659: <FIRMessaging/INFO> FIRMessaging library version 1.1.0
 2016-05-19 16:05:27.831: <FIRMessaging/WARNING> FIRMessaging registration is not ready with auth credentials
Unable to connect with FCM. Optional(Error Domain=com.google.fcm Code=501 "(null)")

【问题讨论】:

  • 你是否正确初始化了通用的firebase框架?
  • 是的,我的 AppDelegate 与此示例 Firebase Messaging Quickstart 的相同。我正确收到通知,问题是当我杀死应用程序并重新打开时发生崩溃,然后重试并正常运行。

标签: ios swift firebase apple-push-notifications


【解决方案1】:

这是解决方案,

首先在 Firebase 控制台中上传必要的证书,然后在您的应用中启用推送通知和后台模式 -> 远程通知

之后在 App Delegate 中使用下面的代码(我指定了棘手的行):

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    registerForPushNotifications(application)
    // Override point for customization after application launch.
    // Use Firebase library to configure APIs
    FIRApp.configure()
    return true
}

func registerForPushNotifications(application: UIApplication) {
    let notificationSettings = UIUserNotificationSettings(
        forTypes: [.Badge, .Sound, .Alert], categories: nil)
    application.registerUserNotificationSettings(notificationSettings)
}

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    if notificationSettings.types != .None {
        application.registerForRemoteNotifications()
    }
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    //Tricky line
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
    print("Device Token:", tokenString)
}

【讨论】:

  • 这样就解决了问题,不再报错。现在我可以在应用程序处于后台时控制数据的下载了吗?
  • @LoGoCSE ..我现在也面临同样的问题。
【解决方案2】:

不要忘记在 AppDelegate 中:

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

    registerForPushNotifications(application)
    FIRApp.configure()

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

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

func registerForPushNotifications(application: UIApplication) {
      let settings: UIUserNotificationSettings =
        UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
      application.registerUserNotificationSettings(settings)
      application.registerForRemoteNotifications()
  }


  func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                   fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    print("===== didReceiveRemoteNotification ===== %@", userInfo)
  }


 func tokenRefreshNotificaiton(notification: NSNotification) {
    let refreshedToken = FIRInstanceID.instanceID().token()!
    print("InstanceID token: \(refreshedToken)")

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

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

请务必在 Info.plist 中做:FirebaseAppDelegateProxyEnabled = NO

我现在不知道,但我在didReceiveRemoteNotification 中得到了print(...),但没有得到弹出窗口。我从 Firebase -> Console -> Notification -> Single device 发送消息,并在此处复制我从 Xcode Console -> func tokenRefreshNotificaiton

获得的令牌

【讨论】:

  • 丢失的部分:.addObserver,救了我!
  • @Mr.Bista。请指导我关于推送通知,使用 FCM。我可以从服务器发送数据消息,但通知方法没有调用。请检查我的问题stackoverflow.com/questions/41198651/…
【解决方案3】:

答案是正确的这些是步骤,但也请检查您的设备时间。因为如果你的时间和日期太差了,它就不会起作用

【讨论】:

    【解决方案4】:

    在对整个集成进行三次检查后,对我来说,问题是测试设备的日期提前一周更改。 FCM SDK 可能会进行一些基于日期的检查。

    Firebase 方面的错误可能不那么普遍,因为我花了将近一天的时间来寻找解决方案。希望这会有所帮助。

    【讨论】:

    • 非常感谢,这也是我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2016-08-06
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多