我已经在我的 iOS 应用程序中集成了 Firebase 云消息传递,而没有使用 cocoa pod。 Firebase 分析工作正常。但是 FCM 令牌是在模拟器上收到的,而不是在真实设备上收到的。在真实设备上我不断收到错误
无法获取默认令牌错误域=com.firebase.iid代码=501 “(空)”
这是我的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[FIRApp configure];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:) name:kFIRInstanceIDTokenRefreshNotification object:nil];
}
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
// For iOS 10 display notification (sent via APNS)
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
// For iOS 10 data message (sent via FCM)
[FIRMessaging messaging].remoteMessageDelegate = self;
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeSandbox];
}
- (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 application server.
}
- (void)connectToFcm {
// Won't connect since there is no token
if (![[FIRInstanceID instanceID] token]) {
return;
}
// Disconnect previous FCM connection if it exists.
[[FIRMessaging messaging] disconnect];
[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Unable to connect to FCM. %@", error);
} else {
NSLog(@"Connected to FCM. FCM token - %@", [[FIRInstanceID instanceID] token] );
}
}];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBSDKAppEvents activateApp];
[self connectToFcm];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[FIRMessaging messaging] disconnect];
NSLog(@"Disconnected from FCM");
}
请帮忙。
我自己的问题得到了解决。设备的日期和时间不正确。当我将其更改为当前日期和时间时,Firebase 开始向我提供 FCM 令牌并正确连接。我还从 Firebase 通知控制台检查了推送通知。它的工作方式比我想象的要好。
Swati的回答给我指出了一个解决方案。我已多次尝试重新启动设备,更不用说对我的代码进行各种重写。 Swati 说她的设备日期错误,就我而言,我使用 NordVPN。我暂停了服务,运行了项目,FCMToken 被打印并上传到我的数据库。
问题可能是由于版本问题。实际上我也遇到了同样的问题。我在模拟器上获得了 FCM 令牌,但在设备上没有。原因是由于在 didFinishLaunchingWithOptions 上注册了用户通知设置.....我们必须检查设备和模拟器上的版本...如果两者不相同..请检查“ [[UIApplication sharedApplication] registerUserNotificationSettings:settings] ” 当前设备版本的条件... Bcz 我在 didFinishLaunchingWithOptions 中将此限制为 >= 10 个版本...
以上方法均无效,因为我需要在获取令牌之前请求用户许可。
Future<void> getToken2() async {
try {
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
// Check if permission is granted
if (settings.authorizationStatus == AuthorizationStatus.authorized) {
String? token = await messaging.getToken();
print("fcm token: $token");
} else {
if (kDebugMode) {
print('Permission denied');
}
}
} catch (e) {
if (kDebugMode) {
print('Error getting token: $e');
}
}
}