Различное поведение didReceiveRemoteNotification между производством APNS и средой разработки

Я заметил различное поведение didReceiveRemoteNotification между производством APNS и средой разработки.

В режиме разработки (сборка с использованием профиля обеспечения разработки) этот метод вызывается, когда пользователь нажимает на уведомление. Как в фоновом, так и в активном состоянии.

но в рабочем режиме (сборка с использованием профиля обеспечения adhoc) этот метод вызывается, когда пользователь нажимает на уведомление, если приложение находится в фоновом режиме или неактивно, но когда приложение находится в активном состоянии, этот метод вызывается немедленно при получении уведомления.

Может ли кто-нибудь помочь мне понять это другое поведение?

Я хочу, чтобы мой пользователь перенаправлял на другой экран, когда он нажимал на уведомление (в активном состоянии), но из-за этого поведения он автоматически перенаправлял на другой экран.

1 ответ

Ваш вопрос заставил меня задуматься, и я провел тест: " В режиме разработки (сборка с использованием профиля обеспечения разработки) этот метод вызывается, когда пользователь нажимает на уведомление. Как в фоновом, так и в активном состоянии ". Документация WatchKit говорит: если удаленный уведомление приходит, когда ваше приложение активно, WatchKit вызывает этот метод для доставки полезной нагрузки уведомления. Используйте этот метод для ответа на уведомление (без вашего нажатия). Я проверил его на своем iphone, результат тот же, он запускается без моего нажатия. И он устарел в iOS 10.

Я использовал LNNotificationsUI для имитации уведомлений iOS 9 на iOS 9, когда приложение находится на переднем плане. В iOS 10 теперь вы можете отображать системные уведомления внутри своего приложения. Пожалуйста, обратитесь к документу, если требуется.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    ...
    //iOS9
    [[LNNotificationCenter defaultCenter] registerApplicationWithIdentifier:@"123" name:@"YourAppName" icon:nil defaultSettings:[LNNotificationAppSettings defaultNotificationAppSettings]];
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
        if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
            [self handelRemoteNotification:[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]];
        }
    }
    return YES;
}
//iOS9
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    PrintLog(@"%@",userInfo);
    [self handelRemoteNotification:userInfo];
}

//iOS10
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
   willPresentNotification:(UNNotification *)notification
     withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { 
    NSDictionary *userInfo = notification.request.content.userInfo;
    PrintLog(@"%@", userInfo);
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    PrintLog(@"%@", response.notification.request.content);
    [self handelRemoteNotification:response.notification.request.content.userInfo];
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound);
}
#endif

- (void)handelRemoteNotification:(NSDictionary*)userInfo {
    NSDictionary *alert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
        if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive) {
            NSString* chatAction = [userInfo objectForKey:_remoteNotificationClick_action];
            if ([chatAction isEqualToString:_remoteNotificationClickActionTypeChat]) {
                if ([ChatViewController isOnTop] && [[userInfo objectForKey:_remoteNotificationReceiver_uid] isEqualToString:[ChatViewController userID]]) {
                    return;
                }
            }
            LNNotification* notification = [LNNotification notificationWithMessage:[alert objectForKey:@"body"]];
            notification.title           = [alert objectForKey:@"title"];
            notification.date            = [NSDate date];
            notification.icon            = [UIImage imageNamed:@"ios_9_notification_20"];
            notification.defaultAction   = [LNNotificationAction actionWithTitle:@"View" handler:^(LNNotificationAction *action) {
            [self actionForRemoteNotification:userInfo];
        }];
        [JSQSystemSoundPlayer jsq_playMessageReceivedAlert];
        [[LNNotificationCenter defaultCenter] presentNotification:notification forApplicationIdentifier:@"123"];
        }
        else {
            [self actionForRemoteNotification:userInfo];
        }
    }
    else {
        [self actionForRemoteNotification:userInfo];
    }
}
- (void)actionForRemoteNotification:(NSDictionary*)userInfo {
    ...
    Manage your code here
}
Другие вопросы по тегам