Различное поведение 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
}