iOS 10의 푸시 알림 문제
푸시 알림을 구현 한 애플리케이션을 하나 개발했습니다. 현재 애플 스토어에서 라이브입니다. 최대 iOS 9 푸시는 제대로 작동하지만 iOS 10 이후에는 작동하지 않습니다.
코드의 문제는 무엇입니까?
xCode 8 GM을 사용하는 iOS 10의 경우.
iOS 10 용 xCode 8 GM을 사용하여 다음 단계로 문제를 해결했습니다.
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 용 푸시 알림을 지원하는 코드 줄만 추가하십시오.
iOS 10 이전에는 모든 것이 잘 작동했지만 제 경우에는 기능 설정 만이 문제를 일으켰습니다.
푸시 알림을 위해 켜져 있어야합니다.
iOS 10 자동 푸시 알림에 문제가 있습니다. iOS9 및 이전 버전에서는 추가 데이터 필드가 있지만 데이터에 빈 aps
속성 이있는 푸시 알림을 보내면 제대로 작동했습니다. 그러나 iOS10에서 빈 aps
속성이 있는 푸시 알림 은 didReceiveRemoteNotification 앱 델리게이트 메서드에 전혀 영향을주지 않습니다. 즉, 모든 자동 푸시 알림 (앱이 열려있는 동안 내부적으로 작업을 트리거하는 데 사용하는 알림)이 iOS10에서 작동을 멈췄습니다.
I was able to fix this without pushing an update to my app by adding at least one attribute to the aps
part of the push notification, in my case I just added badge: 0
and my silent push notifications started working again in iOS 10. I hope this helps someone else!
The swift 3 version of @Ashish Shah code is:
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) {
}
Don't forget, when testing, you must use sandbox
address for your notifications to work.
On iOS, the application approaches the client for authorization to get push warnings by calling the registerUserNotificationSettings:
strategy for UIApplication
.
The application calls the registerForRemoteNotifications:
technique for UIApplication
(iOS) or the strategy registerForRemoteNotificationTypes:
of NSApplication
(OS X).
The application executes the application:didRegisterForRemoteNotificationsWithDeviceToken:
technique for UIApplicationDelegate
(iOS) or NSApplicationDelegate
(OS X) to get the one of a kind gadget token produced by the push benefit.
The application executes the application:didFailToRegisterForRemoteNotificationsWithError:
technique for UIApplicationDelegate
(iOS) or NSApplicationDelegate
(OS X) to get a blunder if the enrolment fizzled.
ReferenceURL : https://stackoverflow.com/questions/39490605/push-notification-issue-with-ios-10
'programing' 카테고리의 다른 글
두 배열을 해시로 결합 (0) | 2021.01.05 |
---|---|
TextInputLayout은 EditText에서 프로그래밍 방식으로 힌트를 제공하는 데 효과가 없습니다. (0) | 2021.01.05 |
프로그래밍 방식으로 창을 최소화하는 방법이 있습니까? (0) | 2021.01.05 |
Python에서 클래스를 정의하는 방법은 무엇입니까? (0) | 2021.01.05 |
Android-OnDateChangedListener-어떻게 설정합니까? (0) | 2021.01.05 |