Firebase 云消息传递开发和发布配置文件
Firebase Cloud Messaging development and release profile
我最近从 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 应用程序中不再收到任何推送通知。
当我在设备上调试时,在我的调试控制台中,一个输出是这样的:
<FIRInstanceID/WARNING> APNS Environment in profile: development
这对本地调试很有用,但在 TestFlight 中不需要。 (我不知道 TestFlight 应用程序是否会发生这种情况,因为我没有适用于它们的控制台。)
所以我的问题是:有人知道我是否可以在 Firebase 中手动更改此 Sandbox 选项吗?
谢谢,
西蒙
我按照提供的文档进行操作,但遇到了同样的问题,然后我尝试了快速启动应用程序,它成功了。关键似乎是在获取令牌后添加连接到 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)
}
此外,如果您只想删除警告,您可以使用生产配置文件。
我通过将下面的代码添加到项目中解决了这个问题。
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 类型,反之亦然。
我最近从 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 应用程序中不再收到任何推送通知。
当我在设备上调试时,在我的调试控制台中,一个输出是这样的:
<FIRInstanceID/WARNING> APNS Environment in profile: development
这对本地调试很有用,但在 TestFlight 中不需要。 (我不知道 TestFlight 应用程序是否会发生这种情况,因为我没有适用于它们的控制台。)
所以我的问题是:有人知道我是否可以在 Firebase 中手动更改此 Sandbox 选项吗?
谢谢,
西蒙
我按照提供的文档进行操作,但遇到了同样的问题,然后我尝试了快速启动应用程序,它成功了。关键似乎是在获取令牌后添加连接到 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)
}
此外,如果您只想删除警告,您可以使用生产配置文件。
我通过将下面的代码添加到项目中解决了这个问题。
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 类型,反之亦然。