Я только что обновил все свои push-уведомления iOS, регистрируемые для iOS 10, с помощью этого кода:
-(void)registerForNotifications{
if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
dispatch_async(dispatch_get_main_queue(), ^(void){
if(!error){
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
});
}];
}
else {
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}
}
Все мои делегаты установлены в моем AppDelegate.
EDIT: теперь я смог определить проблему. Когда приложение возвращается на передний план после отправки уведомления, делегат:
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
вызывается только через 10-15 секунд, в то время как обычно он вызывается немедленно. Как это возможно?
Сейчас я тестирую push-уведомления с помощью Localytics и реализую:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
в моем AppDelegate для глубинных ссылок. Когда я добавляю точки останова, я вижу, что это происходит: я правильно получаю push-уведомление, я нажимаю на него, и пользовательский интерфейс приложения зависает примерно на 10 секунд. Затем, наконец, вызывается didReceiveNotificationResponse, и диплинкинг работает.
Как я могу избежать этой огромной задержки, которая зависает в приложении?
РЕДАКТИРОВАТЬ: это даже хуже, чем я. Когда я подключаю свой iPhone к xCode и запускаю сборку на своем телефоне, он зависает на десять секунд, прежде чем начать работу. Затем, если я просто запущу точно такую же сборку, не запуская ее на xCode (то есть без точек останова), приложение зависнет на 10 секунд, а затем вылетит.
EDIT: вот скриншот моего основного потока, когда я приостанавливаю работу с xCode, пока он зависает:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
выполняется 10 секунд или это время для достижения этого метода? Почему бы вам не добавить точку останова в первую строку этого метода и проверить, требуется ли 10 секунд, чтобы достичь ее или нет. - person Poles   schedule 22.03.2017LLPushManager requestPushTest
выглядит подозрительно. - person A-Live   schedule 28.11.2017