programing

iOS 10의 푸시 알림 문제

nasanasas 2021. 1. 5. 08:10
반응형

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 이전에는 모든 것이 잘 작동했지만 제 경우에는 기능 설정 만이 문제를 일으켰습니다.

푸시 알림을 위해 켜져 있어야합니다.

enter image description here


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

반응형