OGeek|极客世界-中国程序员成长平台

标题: ios - Firebase 消息传递方法 swizzling 不起作用 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:12
标题: ios - Firebase 消息传递方法 swizzling 不起作用

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

但问题是我只能在

中获取FCM消息数据(IOS 10)
-(void)userNotificationCenterUNUserNotificationCenter *)center willPresentNotificationUNNotification *)notification withCompletionHandlervoid (^)(UNNotificationPresentationOptions))completionHandler {}

-(void)userNotificationCenterUNUserNotificationCenter *)center didReceiveNotificationResponseUNNotificationResponse *)response withCompletionHandlervoid (^)())completionHandler {}

FCM 委托(delegate)的回调

// The callback to handle data message received via FCM for devices running iOS 10 or above.
- (void)applicationReceivedRemoteMessagenonnull 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 selectorselector(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)tokenRefreshNotificationNSNotification *)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)applicationUIApplication*)application didRegisterForRemoteNotificationsWithDeviceTokenNSData*)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);
    }

}



Best Answer-推荐答案


你可以看看这个答案吗?好像你错过了 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4