При попытке зарегистрироваться для push-уведомлений под iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Я получаю следующую ошибку:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Любые идеи, каков новый способ сделать это? Это работает, когда я запускаю это приложение Swift на iOS 7.x.
РЕДАКТИРОВАТЬ
На iOS 7.x, когда я включаю условный код, который я получаю (либо условный SystemVersion, либо #if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Войтек Турович
источник
источник
Ответы:
Как вы описали, вам нужно будет использовать другой метод, основанный на разных версиях iOS. Если ваша команда использует Xcode 5 (который не знает ни о каких селекторах iOS 8) и Xcode 6, вам нужно использовать условную компиляцию следующим образом:
Если вы используете только Xcode 6, вы можете придерживаться только этого:
Причина в том, что способ получения разрешений на уведомления изменился в iOS 8. A
UserNotification
- это сообщение, отображаемое пользователю, как удаленно, так и локально. Вам нужно получить разрешение, чтобы показать один. Это описано в видео WWDC 2014 «Что нового в iOS-уведомлениях»источник
__IPHONE_OS_VERSION_MAX_ALLOWED
для проверки этого, потому что это проверка во время компиляции.registerUserNotificationSettings:
документирована здесьДля iOS <10
Для iOS10
источник
systemVersion
, вы должны проверить[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
не будет ни переходить,application:didRegisterForRemoteNotificationsWithDeviceToken:
либоapplication:didFailToRegisterForRemoteNotificationsWithError:
если пользователь отключил «Разрешить уведомления» в Настройках -> Уведомления -> <Мое приложение>.Опираясь на ответ @ Prasath. Вот как вы делаете это в Swift :
источник
iOS 8 изменила регистрацию уведомлений не обратно совместимым способом. Хотя вам необходимо поддерживать iOS 7 и 8 (а приложения, созданные с использованием 8 SDK, не принимаются), вы можете проверить нужные селекторы и условно правильно вызвать их для работающей версии.
Вот категория на UIApplication, которая скроет эту логику за чистым интерфейсом для вас, который будет работать как в Xcode 5, так и в Xcode 6.
Заголовок:
Реализация:
источник
Settings
и отключаю уведомления,isRegisteredForRemoteNotifications
все равно возвращаетсяYES
Я думаю, что это лучший способ сохранить обратную совместимость, если мы будем использовать этот подход, он работает для моего случая, и надежда будет работать для вас. Также довольно легко понять.
источник
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
как показано здесьДля Swift-склонных:
источник
Я не мог понять, какую переменную NSSet для «категорий» следует установить, поэтому, если кто-то сможет меня заполнить, я с удовольствием отредактирую этот пост. Следующее, однако, вызывает диалоговое окно push-уведомлений.
Изменить: я получил push-уведомление для отправки на телефон с этим кодом, поэтому я не уверен, что параметр категорий необходим.
источник
categories
используется для настройки действий уведомлений в iOS 8. Вы можете посмотреть видео WWDC 2014 «Что нового в iOS-уведомлениях» для более подробной информацииТаким образом, получается, что поскольку AnyObject является духовным преемником идентификатора, вы можете вызвать любое сообщение на AnyObject. Это эквивалентно отправке сообщения на id. Хорошо, достаточно справедливо. Но теперь мы добавляем в концепцию, что все методы в AnyObject являются необязательными , и у нас есть кое-что, с чем мы можем работать.
Учитывая вышесказанное, я надеялся, что смогу просто привести UIApplication.sharedApplication () к AnyObject, затем создать переменную, равную сигнатуре метода, установить эту переменную в необязательный метод, а затем протестировать переменную. Это не похоже на работу. Я предполагаю, что при компиляции с iOS 8.0 SDK компилятор знает, где, по его мнению, должен быть метод , поэтому он оптимизирует все это вплоть до поиска в памяти. Все работает нормально, пока я не попробую проверить переменную, после чего я получу EXC_BAD_ACCESS.
Тем не менее, в том же докладе WWDC, где я нашел жемчужину о том, что все методы являются необязательными, они используют Optional Chaining для вызова необязательного метода - и это, похоже, работает. Хромая часть заключается в том, что вам нужно на самом деле попытаться вызвать метод, чтобы узнать, существует ли он, что в случае регистрации для уведомлений является проблемой, поскольку вы пытаетесь выяснить, существует ли этот метод, прежде чем приступить к созданию UIUserNotificationSettings объект. Кажется, что вызов этого метода с nil, хотя все в порядке, поэтому решение, которое, кажется, работает для меня:
После долгих поисков, связанных с этим, ключевая информация пришла из этого выступления на WWDC https://developer.apple.com/videos/wwdc/2014/#407 прямо посередине в разделе «Необязательные методы в протоколах».
В бета-версии Xcode 6.1 вышеуказанный код больше не работает, код ниже работает:
источник
Если вы хотите добавить поддержку IOS7 в IOS7, вы можете применить этот код в своем проекте.
источник
После запуска Xcode 6.1 Beta приведенный ниже код немного редактирует код Tom S, который перестал работать с бета-версией 6.1 (работал с предыдущей бета-версией):
источник
Вы можете использовать это
источник
Swift 2.0
источник
Если все, что вам нужно, это код ios 8, это должно сделать это.
источник
Это более чистый способ, которым я занимаюсь, и он просто отлично работает
источник
для iOS 8 и выше
источник