私は最近、GoogleクラウドメッセージングからFirebaseクラウドメッセージングに切り替えました。
GCMでは、サンドボックスオプションを選択する必要がありました。ここで説明されているように: https://developers.google.com/cloud-messaging/ios/client#obtain_a_registration_token ポイント3を参照してください。
デバッグモードでプッシュ通知を受信するには、次のようなことをしなければなりませんでした
[[GGLInstanceID sharedInstance] startWithConfig:instanceIDConfig];
_registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
kGGLInstanceIDAPNSServerTypeSandboxOption:@YES};
AppStore(TestFlightなど)からアプリでプッシュ通知を受信するには、次のように言わなければなりませんでした。
kGGLInstanceIDAPNSServerTypeSandboxOption:@NO};
現在、Firebaseでこのようなものを見つけることができません。最初、私はこれらの愚かな値をもう切り替えないのは素晴らしいと思いました。しかし、TestFlightアプリでプッシュ通知を受信しなくなりました。
デバイスでデバッグするときのデバッグコンソールでは、1つの出力は次のようになります。
<FIRInstanceID/WARNING> APNS Environment in profile: development
これはローカルデバッグには適していますが、TestFlightでは不要です。 (TestFlightアプリのコンソールがないため、これが発生するかどうかはわかりません。)
だから私の質問は:Firebaseでこのサンドボックスオプションを手動で変更できるかどうか誰かが知っていますか?
ありがとう、
サイモン
以下のコードをプロジェクトに追加することで問題を解決しました。
FIRInstanceIDAPNSTokenType.Sandboxは、TestFlightを介してアプリをインストールするときに使用されます。
およびFIRInstanceIDAPNSTokenType.Prod(アプリがApp Storeで公開されたとき)。
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod)
}
安全に、以下を使用してください:
#if DEBUG
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox)
#else
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod)
#endif
サンドボックストークンをprodタイプに不必要に設定したり、その逆を行ったりしないでください。
提供されたドキュメントに従い、同じ問題が発生していました。その後、クイックスタートアプリを試してみましたが、機能しました。重要なのは、トークンを取得した後にFCMに接続するロジックを追加することのようですが、この手順はセットアップドキュメントにありません。これを行った後、他の特別なサンドボックススイッチなしでTestFlightの外部の開発デバイスで動作しました。
https://github.com/firebase/quickstart-ios/blob/master/messaging/FCM/AppDelegate.m#L85
// [START refresh_token]
- (void)tokenRefreshNotification:(NSNotification *)notification {
// Note that this callback will be fired everytime a new token is generated, including the first
// time. So if you need to retrieve the token as soon as it is available this is where that
// should be done.
NSString *refreshedToken = [[FIRInstanceID instanceID] token];
NSLog(@"InstanceID token: %@", refreshedToken);
// Connect to FCM since connection may have failed when attempted before having a token.
[self connectToFcm];
// TODO: If necessary send token to appliation server.
}
// [END refresh_token]
// [START connect_to_fcm]
- (void)connectToFcm {
[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Unable to connect to FCM. %@", error);
} else {
NSLog(@"Connected to FCM.");
}
}];
}
// [END connect_to_fcm]
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self connectToFcm];
}
// [START disconnect_from_fcm]
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[FIRMessaging messaging] disconnect];
NSLog(@"Disconnected from FCM");
}
// [END disconnect_from_fcm]
setAPNSToken()
関数についてです。デバイストークンを追加するときに、FIRInstanceIDAPNSTokenType
をProd
に設定する必要があります。私はSwiftを使用します、私が使用したコードはこれです:
func application(application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod)
}
また、警告を削除したいだけの場合は、本番プロビジョニングプロファイルを使用できます。