2015-01-25 9 views
1

Моих IOS приложения перестало получать уведомление толчка, хотя я модернизировал код в соответствии с документациями и this.уведомление Push-перестало работать на прошивке 8

Вот код, я использую:

В моих AppDelegate'sdidFinishLaunchingWithOptions:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { 

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | 
    UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; 
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
} 
else { 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | 
    UIRemoteNotificationTypeBadge | 
    UIRemoteNotificationTypeSound]; 
} 

Метод didRegisterForRemoteNotificationsWithDeviceToken получил название, как было раньше, поэтому все кажется прекрасным.

Кроме того, мое тестовое устройство имеет уведомления.

Но при отправке толчка от Parse.com он больше не поступает.

РЕДАКТИРОВАТЬ 1:

Ни один из ответов не работает. Я обновил свою инфраструктуру Parse.com до версии 1.6.2 (последняя), которая тоже не помогает, и я снова копирую свой код - на этот раз обновленная версия основана на ответах:

Внутри didFinishLaunchingWithOptions:

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { 
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge 
                         |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil]; 
    [application registerUserNotificationSettings:settings]; 
    //  [application registerForRemoteNotifications]; 
} else { 
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; 
    [application registerForRemoteNotificationTypes:myTypes]; 
} 

и эти методы делегата:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken { 
    NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken CALLED"); 

    // Store the deviceToken in the current installation and save it to Parse. 
    PFInstallation *currentInstallation = [PFInstallation currentInstallation]; 
    [currentInstallation setDeviceTokenFromData:newDeviceToken]; 
    [currentInstallation addUniqueObject:@"Test8Channel" forKey:@"channels"]; 

    if([PFUser currentUser]/* && [[PFUser currentUser] objectId] != nil*/) { 
     [currentInstallation addUniqueObject:[PFUser currentUser] forKey:kOwnerKey]; 
    } 
    [currentInstallation saveInBackground]; 

} 

#ifdef IS_OS_8_OR_LATER 
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { 
    [application registerForRemoteNotifications]; 
    NSLog(@"didRegisterUserNotificationSettings CALLED"); 
} 

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString*)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { 
NSLog(@"handleActionWithIdentifier CALLED"); 
//handle the actions 
if ([identifier isEqualToString:@"declineAction"]){ 
    NSLog(@"handleActionWithIdentifier %@", @"declineAction"); 
} 
else if ([identifier isEqualToString:@"answerAction"]){ 
    NSLog(@"handleActionWithIdentifier %@", @"answerAction"); 
} 
} 
#endif 


- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 
    if (error.code == 3010) { 
     NSLog(@"Push notifications are not supported in the iOS Simulator."); 
    } else { 
     // show some alert or otherwise handle the failure to register. 
     NSLog(@"application:didFailToRegisterForRemoteNotificationsWithError: %@", error); 
    } 
} 

Оба didRegisterUserNotificationSettings и didRegisterForRemoteNotificationsWithDeviceToken становятся называются и, кажется, хорошо. Но толчок не приходит.

EDIT 2:

Я заметил, что если я позвоню как

[application registerUserNotificationSettings:settings]; 

и

[application registerForRemoteNotifications]; 

внутри если ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {

делегата didRegisterForRemoteNotificationsWithDeviceToken становится вызывается дважды , Я не уверен, насколько это значимо.

Отчаяние здесь.

+0

как вы отправляете с консоли i.e, plain text/json? и ожидаете ли вы его получить на заднем плане или переднем плане? – soulshined

+0

Я беру по умолчанию, это обычный текст, и я пробовал как на заднем плане, так и на переднем плане. Я также поместил printf в метод didReceiveRemoteNotification, но он не вызван. – Eddy

+0

И профили или сертификаты обеспечения не были изменены? – soulshined

ответ

0
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [self enableNotifications:application]; 
    return YES; 
} 


#define iOS8_OR_NEWER ([ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 8.0) 

- (void)enableNotifications:(UIApplication *)application 
{ 
    if (iOS8_OR_NEWER) { 
     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories:nil]; 
     [application registerUserNotificationSettings:settings]; 
     [application registerForRemoteNotifications]; 
    } else { 
     [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 
    } 
} 

#ifdef __IPHONE_8_0 
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 
{ 
    [application registerForRemoteNotifications]; 
} 

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler 
{ 
    // https://nrj.io/simple-interactive-notifications-in-ios-8 
} 
#endif 

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
    NSLog(@"Push Token : %@", deviceToken); 
} 

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 
{ 
    NSLog(@"Failed to get token, error: %@", error); 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    NSLog(@"didReceiveRemoteNotification : %@", userInfo); 
} 
+0

Я редактировал вопрос, чтобы отразить код после консультации здесь. Он все еще не работает. – Eddy

+0

Должно быть что-то не так, если вы попробуете вышеуказанный код на другом Xcode и все еще не работаете, это определенно устройство? Вы пробовали разные устройства? Вышесказанный - это единственный код, который я получил и работает на 100%. Каждый раз, когда я запускаю приложение, все методы вызываются. – emotality

0
//-- Set Notification 
    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) 
    { 
     // iOS 8 Notifications 
     [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
     [application registerForRemoteNotifications]; 
    } 
    else 
    { 
     // iOS < 8 Notifications 
     [application registerForRemoteNotificationTypes: 
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; 
    } 
+0

Я редактировал вопрос, чтобы отразить код после консультации здесь. Он все еще не работает. – Eddy

0

Используйте этот простой условный блок для ручки его. потому что некоторые методы/классы обновляются с помощью версии

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
{ 
    //ios8 
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) 
    { 

     UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; 

     [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; 

     ....... 
    } 
} 
else 
{ 
    // ios7 
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotificationTypes:)]) 
    { 
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 
     ......... 
    } 
} 
+0

«условный блок» Это определенно не блок, и блок в этом случае даже не нужен. И ваш ответ точно такой же, как и все остальные ответы, всего в 10 раз больше кода ... – emotality

Смежные вопросы