[objective-c] didRegisterForRemoteNotificationsWithDeviceToken이 호출되지 않는 이유

애플 푸시 알림 서비스를 구현하고 싶은 앱을 만들고 있습니다. 이 자습서에 제공된 단계별 지침을 따르고 있습니다 .

그러나 여전히 메서드는 호출되지 않습니다. 문제의 원인을 모르겠습니다. 누구든지 나를 도울 수 있습니까?

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        //NSString * token = [[NSString alloc] initWithData:deviceTokenencoding:NSUTF8StringEncoding];
        NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
        NSLog(@"Device Token:%@",str);

        //NSLog(@"Device token is called");
        //const void *devTokenBytes = [deviceToken bytes];
        //NSLog(@"Device Token");
    }

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
        NSString *str = [NSString stringWithFormat: @"Error: %@", err];
        NSLog(@"Error:%@",str);
    }



답변

나는 같은 문제가 있었다 : 호출도 registerForRemoteNotificationTypes:호출 application:didRegisterForRemoteNotificationsWithDeviceToken:application:didFailToRegisterForRemoteNotificationsWithError:

나는 결국 Apple의 기술 노트 TN2265 의 도움으로이 문제를 해결했습니다 .

이것이 내가 한 일입니다.

먼저, “aps-environment”키에 대한 프로비저닝 프로필 및 .app 파일 자체의 코드 서명을 확인하는 것을 포함하여 실제로 Push Notifications에 올바르게 등록 하고 있는지 다시 확인했습니다 . 나는 모든 것을 올바르게 설정했습니다.

그런 다음 콘솔에서 푸시 알림 상태 메시지를 디버깅해야했습니다 (장치에 PersistentConnectionLogging.mobileconfig 프로비저닝 프로파일을 설치하고 재부팅해야합니다. “푸시 상태 메시지 관찰”에서 TN2265 참조 ). apns 프로세스가 타이머를 시작하고 최소 실행 날짜를 계산하는 것으로 나타났습니다. 이로 인해 일반적으로이 시점에 표시되는 Push-Notification 등록 확인 메시지가 TN2265에 표시된대로 APNS에 의해 억제되는 것으로 의심됩니다.

iOS에서 푸시 알림 권한 경고 재설정

푸시 지원 앱이 처음으로 푸시 알림을 등록하면 iOS는 사용자에게 해당 앱에 대한 알림을받을 것인지 묻습니다. 사용자가이 경고에 응답하면 기기가 복원되거나 앱이 적어도 하루 동안 제거되지 않는 한 다시 표시되지 않습니다.

앱을 처음 실행하는 것을 시뮬레이션하려면 하루 동안 앱을 제거한 상태로 둘 수 있습니다. 시스템 시계를 하루 이상 앞으로 설정하고 장치를 완전히 껐다가 다시 켜면 실제로 하루를 기다리지 않고도 후자를 얻을 수 있습니다.

그래서 기기에서 앱을 제거한 다음 설정에서 iPhone 날짜를 수동으로 변경하고 기기를 재부팅 한 다음 앱을 다시 설치했습니다.

다음에 내 코드가를 호출 registerForRemoteNotificationTypes했을 때 예상대로 콜백을 받았습니다.

이것은 나를 위해 문제를 해결했습니다. 도움이 되었기를 바랍니다.


답변

iOS 8에서는 일부 메서드가 더 이상 사용되지 않습니다. iOS 8 호환성을 위해 아래 단계를 따르십시오.

1. 등록 통지

if([[UIDevice currentDevice] systemVersion].floatValue >= 8.0)
{
    UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge)];
}

2. 새로운 2 가지 방법 추가

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
}

//For interactive notification only
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
    //handle the actions
    if ([identifier isEqualToString:@"declineAction"]){
    }
    else if ([identifier isEqualToString:@"answerAction"]){
    }
}

참고 : 위의 두 가지 새로운 메서드는 iOS 8에서 didRegisterForRemoteNotificationsWithDeviceTokendidReceiveRemoteNotification.. 그 외에는 델리게이트 메서드가 호출되지 않습니다.

참조 : 원격 알림 iOS 8


답변

iOS 8 에서는 푸시 알림 액세스를 다르게 요청하는 것 외에도 다르게 등록해야합니다.

접근 요청:

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // iOS 8
    UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
    // iOS 7 or iOS 6
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}

등록 된 장치 처리 :

// New in iOS 8
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [application registerForRemoteNotifications];
}

// iOS 7 or iOS 6
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    // Send token to server
}


답변

시뮬레이터에서는 원격 알림이 지원되지 않습니다. 따라서 시뮬레이터에서 앱을 실행하면 didRegisterForRemoteNotificationsWithDeviceToken호출되지 않습니다.


답변

코드를 호출해야합니다 (지원되는 알림 종류에 따라 업데이트).

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];

프로비저닝 프로파일은 APNS가 활성화되어 있습니다. APNS를 설정 한 후 프로비저닝 프로파일을 다시 다운로드해야 할 수 있습니다. 문제가 발생하고 오류가 발생하면 Entitlements.plist를 만들고 빌드 종류에 따라 값이 “development”또는 “production”인 “aps-environment”키를 추가해야합니다 (일반적으로이 키-값 쌍은 프로비저닝 프로파일에 포함되어 있지만 때때로 Xcode가 엉망으로 만듭니다).


답변

Apple 푸시 알림 서비스를 활성화 및 구성하기 전에 프로비저닝 프로파일이 사용 된 경우 프로비저닝 프로파일을 다시 다운로드해야합니다.

Xcode Organizer 및 iPhone / iPad에서 프로비저닝 프로파일을 삭제합니다. 로 이동하십시오 Settings -> General -> Profiles -> [Your provisioning] -> Remove.

새로 다운로드 한 프로비저닝 프로파일을 설치하십시오. 그런 다음 XCode에서 프로젝트를 정리하고 실행하십시오. 이제 didRegisterForRemoteNotificationsWithDeviceToken호출해야합니다.


답변

나는 실수를 저질렀 고 여기로 이끄는 구현 세부 사항을 간과했습니다. 나중에 응용 프로그램 온 보딩 프로세스에서 사용자에게 푸시 알림을 요청하고 멋지게 만들려고했기 때문에 사용자 지정 UIView에 registerForRemoteNotificationTypes, didRegisterForRemoteNotificationsWithDeviceToken그리고 didFailToRegisterForRemoteNotificationsWithError모두를 포함했습니다.

FIX 다음 didRegisterForRemoteNotificationsWithDeviceTokendidFailToRegisterForRemoteNotificationsWithError필요가있을하는 UIApplicationDelegate( YourAppDelegate.m) 트리거합니다.

지금 당연해 보인다.