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)")
これが解決策です
まず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)
}
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
_
答えは正しいです、それらはステップです、しかしまた、あなたのデバイス時間をチェックしてください。あなたの時間と日付があまりにもずれている場合、それは動作しませんので
トリプルで統合全体をチェックした後、私にとって問題は、テストデバイスに日付があったが1週間前に変更されたことでした。おそらく、FCM SDKは日付ベースのチェックを行います。
Firebase側では、解決策を探すのにほぼ1日かかったため、エラーはあまり一般的ではありません。お役に立てれば。