gpt4 book ai didi

ios - Firebase 消息传递方法 swizzling 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:55:45 24 4
gpt4 key购买 nike

您好,我正在实现 FCM(基于 Fire 的云消息传递)。我已经让应用程序接收来自 FCM 控制台的通知和数据。我有我的服务器通知和 firebase 通知。我想分别处理两种类型的通知(来 self 的服务器和来自 FCM)。我已经阅读了文档,这可以通过调整 AppDelegate 中的通知处理程序来实现

但问题是我只能在

中获取FCM消息数据(IOS 10)
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {}

FCM委托(delegate)的回调

// The callback to handle data message received via FCM for devices running iOS 10 or above.
- (void)applicationReceivedRemoteMessage:(nonnull FIRMessagingRemoteMessage *)remoteMessage {

// Print full message
NSLog(@"Can get here firebase?%@", [remoteMessage appData]);
}

上面的回调永远不会被调用

我们如何使用 swizzling 单独设置 FCM 处理程序消息?

这是我的 Appdelegate didfinishlaunchingwith 选项

    application.applicationIconBadgeNumber = 0;

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
// iOS 10 or later
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
UNAuthorizationOptions authOptions =
UNAuthorizationOptionAlert
| UNAuthorizationOptionSound
| UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:authOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
}
];

// For iOS 10 display notification (sent via APNS)
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
// For iOS 10 data message (sent via FCM)

[[FIRMessaging messaging] setRemoteMessageDelegate:self];
#endif
}

[[UIApplication sharedApplication] registerForRemoteNotifications];

// [START configure_firebase]
[FIRApp configure];
// [END configure_firebase]
// Add observer for InstanceID token refresh callback.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:)
name:kFIRInstanceIDTokenRefreshNotification object:nil];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];

_rootViewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];


[self.window setRootViewController:_rootViewController];
[self.window makeKeyAndVisible];

NSDictionary *remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotification)
[self handleRemoteNotification:remoteNotification shouldPrompt:NO];

self.isFirstTime = true;
self.isJustForRefresh = 0;

return YES;

有人知道如何让它工作吗?

编辑:这里是我的观察者观察函数和 didregisterRemoteNotification 函数

// [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 application 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)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
NSString *sanitizedDeviceToken = [[[[deviceToken description]
stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""];

DLog(@"sanitized device token: %@", sanitizedDeviceToken);
[PushNotificationManager API_registerAPNSToken:sanitizedDeviceToken
onCompletion:^(BOOL success, NSError *error){}];

[[FIRInstanceID instanceID]setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeSandbox];

}

已更新:我已经添加了这个功能,但仍然无法正常工作

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
if (userInfo[@"gcm.message_id"] != nil) {
NSLog(@"Should get here FCM?");
[[FIRMessaging messaging]appDidReceiveMessage:userInfo];
}else {
NSLog(@"test fetchCompletion handler: %@",userInfo.description);
}

}

最佳答案

你可以看看这个答案吗?好像您错过了行 FIRMessaging.messaging().connect(){....

https://stackoverflow.com/a/40881754/1005570

还有委托(delegate)函数..

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// If you are receiving a notification message while your app is in the background,
// this callback will not be fired till the user taps on the notification launching the application.
// TODO: Handle data of notification

// Print message ID.
print("Message ID: \(userInfo["gcm.message_id"]!)")

// Print full message.
print(userInfo)

FIRMessaging.messaging().appDidReceiveMessage(userInfo)

关于ios - Firebase 消息传递方法 swizzling 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com