programing

보낸 사람 ID에 대한 FCM 토큰을 검색하기 전에 APNS 장치 토큰이 설정되지 않음 - 기본 Firebase 응답

padding 2023. 6. 27. 21:51
반응형

보낸 사람 ID에 대한 FCM 토큰을 검색하기 전에 APNS 장치 토큰이 설정되지 않음 - 기본 Firebase 응답

저는 이 튜토리얼에 따라 반응 네이티브 파이어베이스 버전 5.2.0을 사용하여 반응 네이티브 애플리케이션에 원격 푸시 알림을 설정해 왔습니다.모든 것을 구성하고 애플리케이션을 실행한 후 다음과 같은 오류가 발생합니다.

보낸 사람 ID ' '에 대한 FCM 토큰을 검색하기 전에 APNS 장치 토큰이 설정되지 않았습니다.이 FCM 토큰에 대한 알림은 APNS를 통해 전달되지 않습니다.APNS 토큰이 설정되면 FCM 토큰을 다시 검색해야 합니다.

이 문제를 해결할 방법을 찾고 있었지만 성공적이지 못했습니다.react-native: 0.61.2, react-native-firebase: 5.2.0에서 실행

다음은 나의 앱 대표자입니다.

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <RNCPushNotificationIOS.h>
#import <UserNotifications/UserNotifications.h>
#import <Firebase.h>

@import Firebase;
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [FIRApp configure];
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"helloworld"
                                            initialProperties:nil];

  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];

  // define UNUserNotificationCenter
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  center.delegate = self;

  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

// Required to register for notifications
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
  [RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
}
// Required for the register event.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Required for the notification event. You must call the completion handler after handling the remote notification.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
// Required for the registrationError event.
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
  [RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
}
// Required for the localNotification event.
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
  [RNCPushNotificationIOS didReceiveLocalNotification:notification];
}

//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  NSLog(@"User Info : %@",notification.request.content.userInfo);
  completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}


@end

그리고 내 App.js에서 토큰 검색:

const messaging = firebase.messaging();

messaging.hasPermission()
  .then((enabled) => {
    if (enabled) {
      messaging.getToken()
        .then(token => { console.log("+++++ TOKEN ++++++" + token) })
        .catch(error => { console.log(" +++++ ERROR GT +++++ " + error) })
    } else {
      messaging.requestPermission()
        .then(() => { console.log("+++ PERMISSION REQUESTED +++++") })
        .catch(error => { console.log(" +++++ ERROR RP ++++ " + error) })
    }

  })
  .catch(error => { console.log(" +++++ ERROR +++++ " + error) });

어떤 도움이라도 주시면 감사하겠습니다!감사합니다!

저는 이 문제를 3일 만에 해결했습니다.당신은 당신의 소방 기지에 p8 키를 연결해야 합니다.

p8 키 생성 링크 https://stackoverflow.com/a/67533665/13033024

enter image description here

다음 코드를 AppDelegate.swift에 추가합니다.

 if #available(iOS 10.0, *) { 
     UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
   
 application.registerForRemoteNotifications()

xCode로 이동하여 "Capability" 탭을 클릭합니다.백그라운드 모드 및 푸시 알림을 추가합니다.백그라운드 모드 탭에서 백그라운드 가져오기 및 원격 알림 사용

릴리스, 디버그, 프로필을 위해 잊지 말고 추가하십시오.

enter image description here

휴대폰에서 앱을 제거하고 다시 실행합니다.

이것이 여러분에게도 도움이 되기를 바랍니다!

다른 사용자의 경우 추가하는 것을 잊은 경우에도 이 경고/오류가 나타납니다.Push Notification의력능의 Signing & CapabilitiesXcodeXcode에서을 확인할 수 .

아마 누군가가 전에 언급한 적이 있을 겁니다.시뮬레이터가 아닌 실제 장치를 사용해야 합니다. 그렇지 않으면 이 오류가 항상 표시됩니다.

Flutter의 경우 허가를 요청하는 것만으로도 효과가 있을 것입니다.

FirebaseMessaging.instance.requestPermission();

이 이상한 버그를 고치려고 하루 종일 허비한 후에, 저는 그것을 고쳐주는 해결책을 찾았습니다.저의 경우 클라우드 메시징이 APN 토큰 설정 프로세스를 망쳤기 때문에 수동으로 설정해야 했습니다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("Registered for Apple Remote Notifications")
    Messaging.messaging().setAPNSToken(deviceToken, type: .unknown)
}

사전에 원격 을 받을 수 있습니다.application.registerForRemoteNotifications()

저는 그 문제를 해결할 수 있었습니다. 솔직히 꽤 간단했습니다.제 아이폰이 인터넷 연결에 문제가 생겨서 고쳐서 이 문제도 해결되었어요! :)

저 같은 경우에는 어느 순간부터 작동이 멈췄습니다.나중에 알게 된 것은 앱 딜러에서 이 두 가지 기능을 제거했기 때문입니다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("application didRegisterForRemoteNotificationsWithDeviceToken")
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("application didFailToRegisterForRemoteNotificationsWithError")
}

Firebase Messaging은 스위즐링을 사용하여 이러한 기능을 자체 구현으로 대체합니다.그러나 코드에 이러한 기능이 없으면 코드를 스와이프할 없는같습니다.

을 에추한후에 후.Info.plist드디어 밀었어요.

    <key>FirebaseAppDelegateProxyEnabled</key>
    <false/>

Flutter를 사용하고 있는데, 제 경우 메시지를 처리할 수 있는 권한을 요청하는 것을 잊었습니다.

모든 단계를 올바르게 수행했다고 100% 확신하는 사람은 다음과 같습니다.

  • Google Service-Info.plist를 프로젝트에 추가
  • Firebase에 인증 키 p8 추가
  • 앱 기능에 "Push Notifications" 및 "Background Mode(백그라운드 가져오기, 원격 알림)" 제공
  • 앱 번들 ID가 파이어베이스에 추가된 번들 ID와 일치하는지 확인
  • 또한 Xcode가 일반 탭 "자동으로 서명 관리"에서 확인란을 선택한 다음 팀을 선택하여 서명을 자동으로 관리하도록 허용하는 것이 좋습니다. 이 경우 Xcode는 개발자 계정으로 이동할 필요 없이 적절한 인증서와 프로필을 생성합니다.
  • 당신의 전화기는 인터넷에 연결되었습니다.

이 모든 작업을 수행했는데도 원격 알림이 나타나지 않고 "APNS 장치 토큰이 보낸 사람 ID에 대한 FCM 토큰을 검색하기 전에 설정되지 않았습니다."라는 오류가 표시되는 경우

레코드 "FirebaseAppDelegateProxyEnabled"가 "false"로 설정된 경우 info.plist를 확인합니다.

    <key>FirebaseAppDelegateProxyEnabled</key>
    <false/>

그런 다음 다음 코드를 AppDelegate.m에 추가해야 합니다.

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *)deviceToken
    {
      [FIRMessaging messaging].APNSToken = deviceToken;
      NSString *fcmToken = [FIRMessaging messaging].FCMToken;
      NSLog(@"++APNST deviceToken : %@", deviceToken);
      NSLog(@"++FCM device token : %@", fcmToken);
    }

그리고나서

  • "pod install --repo-update"
  • "변속기 + 시프트 + k
  • 빌드 앤 트라이
let token = await firebase.messaging().getToken();
await firebase.messaging().ios.registerForRemoteNotifications();

나의 문제를 해결했습니다.

제 문제를 해결한 것은 실제 장치에서 이 문제를 디버깅한 것입니다.유감스럽게도, 시뮬레이터에서 알림이 작동하지 않는다는 것을 잊었습니다...

짧게 대답하고, 컴퓨터를 다시 시작했고 다시 작동했습니다.

react-native 0.59.9를 0.61.2로 업그레이드할 때 동일한 오류가 발생했습니다.

다음을 사용하여 처음부터 새 프로젝트를 만들었습니다.react-native init제가 만든 네이티브 구성을 포함하도록 수정했습니다.마지막으로 원본 프로젝트가 있는 디렉터리에 파일을 복사하여 필요한 변경 사항과 충돌을 해결했습니다.

이것의 원인이 되는 네이티브 iOS 코드에 수정 사항이 없다는 것을 알 수 있었음에도 불구하고 푸시 알림은 iOS에서 작동하지 않습니다.

삭제했습니다node_modules,ios/build그리고.ios/Pods컴퓨터를 다시 시작한 다음 모든 종속성 및 알림을 다시 설치했습니다.

이유는 모르겠지만 다른 사람이 같은 오류를 발견할 경우를 대비해 공유합니다.

플라우터 용액

  1. 백그라운드 모드 사용:

    enter image description here

  1. 알림 권한 요청:

    FirebaseMessaging.instance.requestPermission();
    
  2. 토큰 ID 가져오기(선택 사항)

    String? token = await FirebaseMessaging.instance.getToken();
    

저의 경우, 방금 Apple Developer Portal에서 APN 키를 다시 생성하여 Firebase Cloud Message에 업로드하고 작동을 시작했습니다.

POD를 업데이트했습니다. 최신 Firebase SDK가 사용되기 시작했고(Podfile.lock 파일에서 확인됨) Xcode 로그에서 다음 오류가 사라졌습니다.보낸 사람 ID 'XXXXXXXXXX'에 대한 FCM 토큰을 검색하기 전에 APNS 장치 토큰이 설정되지 않았습니다.이 FCM 토큰에 대한 알림은 APNS를 통해 전달되지 않습니다. APNS 장치 토큰이 설정되면 FCM 토큰을 다시 검색하십시오."

대상 폴더 이름을 Xcode와 Bundle ID로 변경한 후에도 비슷한 문제가 있었습니다.위에서 언급한 것처럼 많은 것을 시도했습니다.인증서를 다시 만드는 중입니다.Firebase 등에서 앱 제거 및 추가아무 것도 효과가 없었습니다.저는 결국 새로운 프로젝트를 다시 만들고 모든 자산과 코드를 복사했습니다.2시간의 작업(아주 큰 앱은 아님) 후에 드디어 작동합니다.

원격 알림에 등록하여 이 문제를 쉽게 해결했습니다.장치 포함토큰 방법:

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken
    //FCM TOken
    Messaging.messaging().token { token, error in
        if let error = error {
            print("Error fetching FCM registration token: \(error)")
        } else if let token = token {
            print(token)
        }
    }
}

저는 모든 것을 시도했지만 AppDelegate.mm 파일을 업데이트하고 다음과 같이 APNS 토큰 대기를 받을 때까지 이 오류가 계속 발생합니다.

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *)deviceToken
    {
      [FIRMessaging messaging].APNSToken = deviceToken;
      NSString *fcmToken = [FIRMessaging messaging].FCMToken;
      NSLog(@"++APNS deviceToken : %@", deviceToken);
      NSLog(@"++FCM device token : %@", fcmToken);
    }
    
    -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
      NSLog(@"!!! ERROR regisgering for APNS : %@", error);
    }

토큰을 가져오기 전에 APNS 토큰을 가져옵니다.

const apnsToken = await messaging().getAPNSToken();
var token = await messaging().getToken();

언급URL : https://stackoverflow.com/questions/58246620/apns-device-token-not-set-before-retrieving-fcm-token-for-sender-id-react-nati

반응형