iOS 10 的推送通知问题
Push notification issue with iOS 10
我开发了一个应用程序,其中实现了推送通知。目前它在苹果商店上线。直到 iOS 9 推送工作正常,但在 iOS 10 之后它不起作用。
代码有什么问题?
对于 iOS 10 使用 xCode 8 GM。
我已经通过使用 xCode 8 GM for iOS 10 的以下步骤解决了我的问题:
1) 在目标中,在功能下启用推送通知以添加推送通知授权。
2) 在您的应用中实施 UserNotifications.framework。在您的 AppDelegate 中导入 UserNotifications.framework。
#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 的代码,
使用 UserNotifications.framework.
仅添加代码行以支持 iOS 10 的推送通知
在 iOS10 之前一切正常,在我的情况下,只有功能设置会导致此问题。
必须开启推送通知。
@Ashish Shah 代码的swift 3 版本是:
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) {
}
我遇到了 iOS 10 个静默推送通知的问题。在 iOS9 及更早版本中,发送具有附加数据字段但数据中具有空 aps
属性的推送通知工作正常。但是在 iOS10 中,具有空 aps
属性的推送通知根本不会命中 didReceiveRemoteNotification 应用程序委托方法,这意味着我所有的静默推送通知(我们只是在内部使用的通知触发操作,而应用程序已打开)在 iOS10.
后停止工作
通过向推送通知的 aps
部分添加至少一个属性,我能够在不推送更新到我的应用程序的情况下解决此问题,在我的情况下,我只是添加了 badge: 0
和我的静默推送通知在 iOS 10 日再次开始工作。我希望这对其他人有帮助!
在 iOS,应用程序通过调用 UIApplication
的 registerUserNotificationSettings:
策略接近客户端以获得推送警告的授权。
应用调用UIApplication
(iOS)的registerForRemoteNotifications:
技术或NSApplication
(OSX)的策略registerForRemoteNotificationTypes:
.
应用程序为UIApplicationDelegate
(iOS)或NSApplicationDelegate
(OS X)执行application:didRegisterForRemoteNotificationsWithDeviceToken:
技术以获得独一无二的小工具推送收益产生的代币。
应用程序为 UIApplicationDelegate
(iOS) 或 NSApplicationDelegate
(OS X) 执行 application:didFailToRegisterForRemoteNotificationsWithError:
技术,以便在注册失败时出错.
不要忘记,在测试时,您必须使用 sandbox
地址才能让您的通知正常工作。
我开发了一个应用程序,其中实现了推送通知。目前它在苹果商店上线。直到 iOS 9 推送工作正常,但在 iOS 10 之后它不起作用。
代码有什么问题?
对于 iOS 10 使用 xCode 8 GM。
我已经通过使用 xCode 8 GM for iOS 10 的以下步骤解决了我的问题:
1) 在目标中,在功能下启用推送通知以添加推送通知授权。
2) 在您的应用中实施 UserNotifications.framework。在您的 AppDelegate 中导入 UserNotifications.framework。
#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 的代码, 使用 UserNotifications.framework.
仅添加代码行以支持 iOS 10 的推送通知在 iOS10 之前一切正常,在我的情况下,只有功能设置会导致此问题。
必须开启推送通知。
@Ashish Shah 代码的swift 3 版本是:
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) {
}
我遇到了 iOS 10 个静默推送通知的问题。在 iOS9 及更早版本中,发送具有附加数据字段但数据中具有空 aps
属性的推送通知工作正常。但是在 iOS10 中,具有空 aps
属性的推送通知根本不会命中 didReceiveRemoteNotification 应用程序委托方法,这意味着我所有的静默推送通知(我们只是在内部使用的通知触发操作,而应用程序已打开)在 iOS10.
通过向推送通知的 aps
部分添加至少一个属性,我能够在不推送更新到我的应用程序的情况下解决此问题,在我的情况下,我只是添加了 badge: 0
和我的静默推送通知在 iOS 10 日再次开始工作。我希望这对其他人有帮助!
在 iOS,应用程序通过调用 UIApplication
的 registerUserNotificationSettings:
策略接近客户端以获得推送警告的授权。
应用调用UIApplication
(iOS)的registerForRemoteNotifications:
技术或NSApplication
(OSX)的策略registerForRemoteNotificationTypes:
.
应用程序为UIApplicationDelegate
(iOS)或NSApplicationDelegate
(OS X)执行application:didRegisterForRemoteNotificationsWithDeviceToken:
技术以获得独一无二的小工具推送收益产生的代币。
应用程序为 UIApplicationDelegate
(iOS) 或 NSApplicationDelegate
(OS X) 执行 application:didFailToRegisterForRemoteNotificationsWithError:
技术,以便在注册失败时出错.
不要忘记,在测试时,您必须使用 sandbox
地址才能让您的通知正常工作。