2016-05-19 25 views
19

ユーザーのセッションを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)") 

Screenshot

+0

一般的なfirebaseフレームワークを正しく初期化しましたか? –

+0

はい、私のAppDelegateはこの例[Firebase Messaging Quickstart](https://github.com/firebase/quickstart-ios/tree/master/messaging)と同じです。私は正しく通知を受け取ります、問題は私がアプリケーションを終了し、クラッシュが発生した後、再試行して正常に動作しているときです。 –

答えて

34

を解決、

まずアプリに続いてFirebaseコンソールで必要な証明書をアップロードしていますプッシュ通知と背景モードを有効にする - >リモート通知

その後、アプリケーションデリゲートで、以下のコードを使用します(私はトリッキーな線を指定します):

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) 
} 
+0

これは問題を解決し、エラーを出さなくなりました。アプリケーションがバックグラウンドにあるときにデータのダウンロードを制御できるようになりましたか? –

+0

これも私にとってそれを解決しました!ありがとう! – Jorsh

+3

このコードの目的コードはありますか? –

5

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

私は今のところわかりませんが、私は中print(...)を得ましたdidReceiveRemoteNotificationですが、ポップアップが表示されません。 >コンソール - - >通知 - 私はFirebaseからメッセージを送信>シングルデバイス、ここで私はXcodeのコンソールからもらったトークンをコピー - >func tokenRefreshNotificaiton

+0

欠けている: '.addObserver'、保存されました! –

+0

@ Mr.Bista FCMで作業しているプッシュ通知について教えてください。通知メソッドは呼び出していません。私の質問http:// stackoverflowを確認してください。com/questions/41198651/xcode-8-1-push-notification-in-swift-2-3とfirebase-integration-not-getting –

4

回答がそれらの正しいステップであり、しかし、また、お使いのデバイスを確認してください時間。あなたの時間と日付があまりにも離れている場合は、それは動作しません

2

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

Firebase側でエラーが発生する可能性は低いですが、ソリューションを探す日がほとんどなくなりました。お役に立てれば。

+0

ありがとう、これはまさに私の問題でした! – manisha

関連する問題