Подтвердить что ты не робот

Получить токен устройства в iOS 8

Мне нужен токен устройства, чтобы реализовать push-уведомление в моем приложении.
Как я могу получить токен устройства, так как метод didRegisterForRemoteNotificationsWithDeviceToken не работает на iOS 8. Я пробовал этот код в делетете приложения, но он не дает мне токен устройства.

    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
4b9b3361

Ответ 1

Прочтите код в UIApplication.h.

Вы будете знать, как это сделать.

Во-первых:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

добавить код, подобный этому

#ifdef __IPHONE_8_0
  //Right, that is the point
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
    //register to receive notifications
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif

, если вы не используете как Xcode 5, так и Xcode 6, попробуйте этот код

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

(Спасибо за @zeiteisen @dmur)


Во-вторых:

Добавьте эту функцию

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

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

И вы можете получить deviceToken в

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

если он все еще не работает, используйте эту функцию и NSLog ошибка

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

Ответ 2

Добавление небольшой проверки в ответ @Madao в случае, если у вас возникли сбои в более старых версиях iOS:

#ifdef __IPHONE_8_0
if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
#endif

UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound |     UIRemoteNotificationTypeNewsstandContentAvailability;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

Что делает макрос __IPHONE_8_0, просто позволяет вам скомпилировать в старых версиях xCode/iOS, вы не получаете ошибок компиляции или предупреждений, но запуск кода на устройствах с iOS 7 или ниже приведет к сбою.

Ответ 3

Чтобы получить токен устройства в iOS8 +

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//This code will work in iOS 8.0 xcode 6.0 or later
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
return YES;
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString* deviceToken = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""]
                         stringByReplacingOccurrencesOfString: @">" withString: @""]
                         stringByReplacingOccurrencesOfString: @" " withString: @""] ;
NSLog(@"Device_Token     -----> %@\n",deviceToken);
}

Ответ 4

Помимо остальных снисходительных ответов на этот вопрос, наиболее вероятная причина того, что эта проблема может возникнуть для информированного разработчика, который применил все необходимые методы делегирования, заключается в том, что они используют профиль профилирования дикой карты (почему бы и нет?) Так легко создавать и тестировать приложения для разработки!)

В этом случае вы, вероятно, увидите ошибку Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application"

Чтобы протестировать уведомления, вам действительно нужно вернуться к 2000 году и опоздать, зайдите на сайт developer.apple.com и настройте профиль подготовки приложений для приложений с включенными push-уведомлениями.

  • Создайте идентификатор приложения, соответствующий идентификатору вашего пакета приложений. Обязательно отметьте "push notifications" (в настоящее время второй вариант снизу).
  • Создайте профиль обеспечения для этого идентификатора приложения.
  • Пройдите все остальные шаги, которые мы все хотели бы забыть.
  • Profit!

Ответ 5

В своей учетной записи разработчика убедитесь, что у вас есть настройки push-уведомлений правильно в вашем идентификаторе приложения, а затем вам необходимо восстановить и загрузить профиль обеспечения. Моя проблема заключалась в том, что я загрузил профиль подготовки, но xcode работал некорректно. Чтобы исправить это, перейдите к настройкам целевой сборки, прокрутите вниз до пункта "Подписание кода" в разделе "Профиль подготовки" убедитесь, что вы используете правильный профиль подготовки, который соответствует имени созданного вами (должно быть выпадающее меню с параметрами, если вы установили более одного).

Ответ 6

@madoa ответ абсолютно правильный. Просто отметьте, что он не работает в симуляторе.

В этом случае

-(void)application:(UIApplication *)application
     didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

вызывается с ошибкой REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR

Ответ 7

Вот решение.

в applicationDidFinishLaunchingWithOptions:

{

 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}


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


- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
    NSLog(@" Error while registering for remote notifications: %@", error);
}

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