Як я можу отримати маркер пристрою для віддаленого сповіщення в iOS 8? Я використовував метод didRegisterForRemoteNotificationsWithDeviceToken
в AppDelegate
iOS <8, і він повернув маркер пристрою. Але в iOS 8 це не так.
Як я можу отримати маркер пристрою для віддаленого сповіщення в iOS 8? Я використовував метод didRegisterForRemoteNotificationsWithDeviceToken
в AppDelegate
iOS <8, і він повернув маркер пристрою. Але в iOS 8 це не так.
Відповіді:
Ви будете знати, як це зробити.
Спочатку:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
додати такий код
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
якщо ви не використовуєте як 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
І ви можете отримати пристрій, взятий
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
якщо це все ще не працює, скористайтеся цією функцією та повідомте про помилку
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
UIUserNotificationSettings
або UIApplication
розповісти про те, як це потрібно для iOS 8. Натомість вона похована в їх API-розбіжностях.
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
перевірку, як це робить zeiteisen у своїй відповіді.
Спосіб реєстрації для iOS 8 та підтримка старих версій
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
а в додаток делегат додайте
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8 може отримувати мовчазні повідомлення без запиту дозволу. Телефонуйте
- (void)registerForRemoteNotifications
. Після цього application:didRegisterForRemoteNotificationsWithDeviceToken:
буде викликано
Примітка: зворотний виклик із маркером викликається лише в тому випадку, якщо програма успішно зареєструвалась для сповіщень користувачів за допомогою функції нижче або якщо увімкнено фонове оновлення програми.
Перевірте Налаштування для вашого додатка, якщо ввімкнено будь-який тип сповіщення. Якщо ні, то маркер пристрою ви не отримаєте.
Тепер ви можете отримувати безшумні сповіщення за допомогою
aps {
content-available: 1
}
в корисному навантаженні сповіщення
Але сповіщення, які з’являються, все ще потребують дозволу. Телефонуйте
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Цей код повинен запитувати дозволу.
Тепер ви повинні бути готові отримувати push-сповіщення
OS8 can receive silent notifications without asking for permission
біт. Це зводило мене з розуму, і це єдине місце, де я знайшов це корисне!
if
твердженні ви повинні використовувати UIUserNotificationTypeSound
замість цього UIRemoteNotificationTypeSound
, оскільки UIRemoteNotificationType
воно застаріло в iOS 8.
У моєму випадку я зробив необхідні оновлення для запиту доступу до push-сповіщень для iOS 7 та iOS 8, однак я не застосував новий зворотний виклик, коли користувач iOS 8 надає доступ. Мені потрібно було додати цей метод до делегата мого додатка.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
Якщо ви використовуєте Xamarin.iOS для створення свого мобільного додатка, ви можете використовувати цей фрагмент коду для запиту реєстрації push-сповіщень
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
Також вам потрібно буде замінити DidRegisterUserNotificationSettings
метод, щоб повернути маркер пристрою з сервера APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
Відповідь Мадао ( https://stackoverflow.com/a/24488562/859742 ) є правильною, але ....
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
має бути більш "правильним"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Ці прапори мають однакові значення бітової маски, і тому обидва вони працювали б, але не UIUserNotificationSettings
вимагаютьUIUserNotificationType
UIRemoteNotificationType
.
Окрім цього я би зателефонував
[application registerUserNotificationSettings:settings];
У AppDelegate
методі (залежно від наданих прав),
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Мені здається, що кращий спосіб зберегти зворотну сумісність, який ми можемо використати при такому підході, - це працює на мій випадок, сподіваюся, він спрацює і на вас. Також досить легко зрозуміти.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];