неявное преобразование 'unsigned long 'UIUserNotificationSettings *' запрещено с дугой

Push-уведомление в iOS 8 не работает.

Отображение ошибки:

implicit conversion of 'unsigned long 'UIUserNotificationSettings *' is disallowed with arc

Код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [application registerUserNotificationSettings:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)];
    return YES;
}

введите здесь описание изображенияЯ использую бета-версию iOS 8.0 и xcode 6.


person user3701584    schedule 03.06.2014    source источник
comment
Да noreferrer">image.noelshack.com/fichiers/2014/23/   -  person user3701584    schedule 03.06.2014
comment
Похоже, что API может NDA'd, поэтому не просматривал документы, но ошибка компиляции выглядит так, как будто registerUserNotificationSettings ожидает указатель на настройки вместо самих настроек. Другими словами, вы можете внимательно изучить документы.   -  person Joachim Isaksson    schedule 03.06.2014
comment
Это является нарушением соглашения Apple NDA. Вы не можете размещать вопросы на общедоступном форуме об iOS 8 или Xcode 6. Эти вопросы необходимо задавать на форумах разработчиков Apple до тех пор, пока продукты не будут официально выпущены.   -  person Johnathon Sullinger    schedule 03.06.2014
comment
@JohnathonSullinger Так ли это? В этом году Apple отменила соглашение о неразглашении... даже документация общедоступна.   -  person The Paramagnetic Croissant    schedule 12.06.2014


Ответы (5)


Я получаю информацию из ниже из официальной документации iOS 8. .

  • Приложения, использующие локальные или push-уведомления, должны явно регистрировать типы предупреждений, которые они отображают для пользователей, с помощью объекта UIUserNotificationSettings. Этот процесс регистрации отделен от процесса регистрации удаленных уведомлений, и пользователи должны предоставить разрешение на доставку уведомлений с помощью запрошенных параметров.
  • Локальные и push-уведомления могут включать настраиваемые действия как часть предупреждения. Пользовательские действия отображаются в виде кнопок в предупреждении. При нажатии ваше приложение получает уведомление и просит выполнить соответствующее действие. Локальные уведомления также могут быть вызваны взаимодействием с регионами Core Location.

А также читать

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIUserNotificationSettings_class/index.html#//apple_ref/occ/cl/UIUserNotificationSettings

А ТАКЖЕ

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/registerUserNotificationSettings:

Поэтому ответ должен быть...

/// First register notification setting with settings type like 
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications]; // you can also set here for local notification.
person iPatel    schedule 03.06.2014
comment
я не понимаю - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Let the device know we want to receive push notifications [[UIApplication sharedApplication] registerUserNotificationSettings: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)]; return YES; } - person user3701584; 03.06.2014
comment
То есть вы упомянули о NDA, а затем тут же его нарушили? ;) - person borrrden; 03.06.2014
comment
Нет, это не под NDA. §10.1 Лицензионное соглашение программы для разработчиков iOS: Вы не будете связаны вышеуказанными условиями конфиденциальности в отношении технической информации о предварительных версиях Программного обеспечения и услуг Apple, раскрытой Apple на WWDC (Всемирная конференция разработчиков Apple), за исключением того, что Вы не можете публиковать скриншот снимки, писать публичные обзоры или распространять какие-либо предварительные версии Программного обеспечения или услуг Apple. - person cldrr; 05.06.2014

- (void)registerForRemoteNotificationTypes:(NSUInteger)notificationTypes categories:(NSSet *)categories
{
    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
    {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:notificationTypes categories:categories]];
    }
    else if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotificationTypes:)])
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
    }
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
    {
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
}

Попробуйте UIUserNotificationSettings-Extension, предоставляющий вспомогательные методы, которые значительно облегчат вам работу с новым #iOS8 # Интерактивные #Уведомления.

person alexruperez    schedule 04.06.2014
comment
Обратите внимание, что Apple рекомендует вызывать registerForRemoteNotifications только после завершения registerUserNotificationSettings: (а именно, когда был вызван application:didRegisterUserNotificationSettings:). - person Jeremy Wiebe; 20.09.2014

Вот:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
// are you running on iOS8?

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) 
  {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound) categories:nil];
    [application registerUserNotificationSettings:settings];
  } 
else // iOS 7 or earlier
  {
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [application registerForRemoteNotificationTypes:myTypes];
  }
}
person Nagarjun    schedule 19.11.2014

Пожалуйста, взгляните на журнал, предоставленный во время выполнения. Сначала, без регистрации пользователем локальных событий, журнал действительно предлагает

UILocalNotificationInfiniteRepeatCount, next fire date = Wednesday, 4 June 2014 9:27:24 pm India Standard Time, user info = (null)} with an alert but haven't received permission from the user to display alerts.

Это iOS 8.

Так вот, в этом случае тоже нужно использовать

[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories:nil]];

in didFinishLaunchingWithOptions.

person Abhilash Gopal    schedule 04.06.2014

Это то, что вам нужно для работы как с iOS 8, так и с чем-то меньшим, чем iOS 8.

if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert];
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNone];
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge];
} else {
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
person BlueGuy    schedule 02.10.2014