Я разработал одно приложение, в котором реализовано push-уведомление. В настоящее время он живет в магазине Apple. Upto iOS 9 push работает нормально, но после iOS 10 он не работает.
В чем проблема с кодом?
Я разработал одно приложение, в котором реализовано push-уведомление. В настоящее время он живет в магазине Apple. Upto iOS 9 push работает нормально, но после iOS 10 он не работает.
В чем проблема с кодом?
Для iOS 10 с использованием xCode 8 GM.
Я решил проблему со следующими шагами, используя xCode 8 GM для iOS 10:
1) В целевых целях в разделе "Возможности" нажмите "Push Notifications", чтобы добавить 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-уведомлениями iOS 10. В iOS9 и более ранних версиях, отправляя push-уведомление с дополнительными полями данных, но имело пустой атрибут aps
в данных, которые работали нормально. Но в iOS10 push-уведомление с пустым атрибутом aps
вообще не удаляет метод делегирования приложения didReceiveRemoteNotification, что означает, что все мои молчащие push-уведомления (уведомления, которые мы просто используем для запуска действий при открытии приложения) перестали работать iOS10.
Мне удалось исправить это, не нажимая обновление для моего приложения, добавив хотя бы один атрибут в часть aps
push-уведомления, в моем случае я просто добавил badge: 0
, и мои молчащие push-уведомления снова начали работать в IOS 10. Я надеюсь, что это поможет кому-то еще!
Сначала перейдите к целевому назначению приложения. Выберите "Возможности" и убедитесь, что "Push Notifications" включен и что "Удаленные уведомления выбраны в режиме" Фоновые режимы ".
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
var token = ""
for i in 0..<deviceToken.count {
token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
}
print(token)
}
Быстрая версия 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), чтобы получить ошибку, если регистрация запустилась.