web-dev-qa-db-ja.com

クラウドメッセージング処理終了アプリ

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

    }

}

これは、このチュートリアルに従ってFirebaseを更新してプッシュ通知を実装することにした今日までスムーズに機能しました iOSでのFirebase Cloud Messaging Clientアプリのセットアップ 。この問題は、彼がアプリケーションを強制終了して再度入力すると、次のエラーコードが表示されたときに発生します。

 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)")

Screenshot

20
Felipe Parra

これが解決策です

まずFirebase Consoleで必要な証明書をアップロードし、次にアプリでプッシュ通知とバックグラウンドモードを有効にします->リモート通知

その後、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)
}
35
LoGoCSE

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_

今のところわかりませんが、didReceiveRemoteNotificationprint(...)を取得しましたが、ポップアップを取得しません。 Firebase-> Console-> Notification-> Single deviceからメッセージを送信し、Xcode Consoleから取得したトークンをここにコピーします-> _func tokenRefreshNotificaiton_

5
Svitlana

答えは正しいです、それらはステップです、しかしまた、あなたのデバイス時間をチェックしてください。あなたの時間と日付があまりにもずれている場合、それは動作しませんので

4
Mr.G

トリプルで統合全体をチェックした後、私にとって問題は、テストデバイスに日付があったが1週間前に変更されたことでした。おそらく、FCM SDKは日付ベースのチェックを行います。

Firebase側では、解決策を探すのにほぼ1日かかったため、エラーはあまり一般的ではありません。お役に立てれば。

2
raver99