Проблема с push-уведомлениями в iOS 10
Я разработал одно приложение, в котором реализовал push-уведомления. В настоящее время он живет в магазине Apple. До iOS 9 push работает нормально, но после iOS 10 не работает.
В чем проблема с кодом?
6 ответов
Для iOS 10 используется xCode 8 GM.
Я решил свою проблему с помощью следующих шагов, используя xCode 8 GM для iOS 10:
1) В целях в разделе "Возможности" включите push-уведомления, чтобы добавить права на push-уведомления.
2) Внедрите UserNotifications.framework в свое приложение. Импортируйте UserNotifications.framework в ваш AppDelegate.
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>
@end
3) В методе didFinishLaunchingWithOptions назначьте UIUserNotificationSettings
и реализовать UNUserNotificationCenter
делегировать.
#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
if( !error ){
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}];
}
return YES;
}
4) Теперь, наконец, реализуем эти два метода делегата.
// ============ Для iOS 10=============
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
//Called when a notification is delivered to a foreground app.
NSLog(@"Userinfo %@",notification.request.content.userInfo);
completionHandler(UNNotificationPresentationOptionAlert);
}
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
//Called to let your app know which action was selected by the user for a given notification.
NSLog(@"Userinfo %@",response.notification.request.content.userInfo);
}
Пожалуйста, оставьте код таким, какой вы его используете для iOS 9. Добавляйте только строки кода для поддержки Push-уведомлений для iOS 10 с помощью UserNotifications.framework.
До iOS 10 все работало нормально, в моем случае только настройки возможностей вызывают эту проблему.
Он должен быть включен для push-уведомлений.
У меня была проблема с тихими push-уведомлениями iOS10. В iOS9 и более ранних версиях отправка push-уведомлений с дополнительными полями данных, но пустыми aps
Атрибут в данных работал нормально. Но в iOS10 push-уведомление с пустым aps
Атрибут вообще не затрагивает метод делегата приложения didReceiveRemoteNotification, что означает, что все мои тихие push-уведомления (уведомления, которые мы просто используем для запуска действий, когда приложение открыто) перестали работать в iOS10.
Мне удалось это исправить, не отправляя обновление в мое приложение, добавив хотя бы один атрибут в aps
часть push-уведомления, в моем случае я просто добавил badge: 0
и мои тихие push-уведомления снова начали работать в iOS10. Надеюсь, это поможет кому-то еще!
Быстрая 3 версия кода @Ashish Shah:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//notifications
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
if error == nil{
UIApplication.shared.registerForRemoteNotifications()
}
}
} else {
// Fallback on earlier versions
}
return true
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
}
Не забывайте, что при тестировании вы должны использовать sandbox
адрес для ваших уведомлений для работы.
На iOS приложение обращается к клиенту для авторизации, чтобы получить push-предупреждения, вызвав registerUserNotificationSettings:
стратегия для UIApplication
,
Приложение вызывает registerForRemoteNotifications:
техника для UIApplication
(iOS) или стратегия registerForRemoteNotificationTypes:
из NSApplication
(OS X).
Приложение выполняет application:didRegisterForRemoteNotificationsWithDeviceToken:
техника для UIApplicationDelegate
(iOS) или NSApplicationDelegate
(OS X), чтобы получить единственный в своем роде токен гаджета, созданный с помощью push-преимущества.
Приложение выполняет application:didFailToRegisterForRemoteNotificationsWithError:
техника для UIApplicationDelegate
(iOS) или NSApplicationDelegate
(OS X), чтобы получить ошибку, если регистрация провалилась.