web-dev-qa-db-ja.com

「エラー」:プッシュ通知の送信中に「InvalidRegistration」

Xamarin.FormsFirebasePushNotificationPlugin を使用してFCMプッシュ通知を実装しています。 iOSプロジェクトでは、AppDelegateメソッドがRegisteredForRemoteNotificationsを生成すると、deviceTokenが生成されますが、Postmanによって生成されたtokenの通知を送信すると、エラーが発生します。

{"multicast_id":8631208504861228784、 "success":0、 "failure":1、 "canonical_ids":0、 "results":[{"error": "InvalidRegistration"}]}

これは私がAppDelegateに持っているコードです ここ から取得しました:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App());

    FirebasePushNotificationManager.Initialize(options, new NotificationUserCategory[]
    {
        new NotificationUserCategory("message",new List<NotificationUserAction> {
            new NotificationUserAction("Reply","Reply",NotificationActionType.Foreground)
        }),
        new NotificationUserCategory("request",new List<NotificationUserAction> {
            new NotificationUserAction("Accept","Accept"),
            new NotificationUserAction("Reject","Reject",NotificationActionType.Destructive)
        })
    });

    return base.FinishedLaunching(app, options);
}

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    FirebasePushNotificationManager.DidRegisterRemoteNotifications(deviceToken);
    Console.WriteLine("Token- - - :  "+deviceToken);
}

public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
{
    FirebasePushNotificationManager.RemoteNotificationRegistrationFailed(error);
}

public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    FirebasePushNotificationManager.DidReceiveMessage(userInfo);
    System.Console.WriteLine(userInfo);
    completionHandler(UIBackgroundFetchResult.NewData);
}

サンプル通知を送信するときのPostmanのデータobject

{ 
 "to":"79f64b43339859a329a935f7a3e417ecc1599fbb5d6935afbooa3b4291c07fa7", 
 "notification" : {
 "body" : "New task",
 "content_available" : true,
 "priority" : "high",
 "color":"Page1",
 "title":"Announcement"
 },
 "data" : {
 "color":"Page1",
 "title":"title",
 "content_available" : true,
 "body" : "New Announcement ad"

}
}

郵便配達員の体

enter image description here

これらは、VisualStudioからのプロビジョニングプロファイル設定です

enter image description here

この問題を解決するにはどうすればよいですか?

8

Xamarinに精通していません。しかし、私はFCMをよく使用しました。

トークンが間違っていると思います。 deviceTokenを使用しても、FCMからのプッシュ通知では機能しません。私は検索をしました、そして多分あなたはそれをから得なければなりません

var fcmToken = FirebaseInstanceId.Instance.Token;

詳細: https://docs.Microsoft.com/en-us/xamarin/Android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=macos

1
tuledev

RegisteredForRemoteNotificationsに関する最初の回答が間違っていたため編集しました

文書化されているように ここ 、実際のトークンは受け取ったトークンの説明にあります:

public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
    // Get current device token
    var DeviceToken = deviceToken.Description;
    if (!string.IsNullOrWhiteSpace(DeviceToken)) {
        DeviceToken = DeviceToken.Trim('<').Trim('>');
    }

    // Get previous device token
    var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

    // Has the token changed?
    if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
    {
        //TODO: Put your own logic here to notify your server that the device token has changed/been created!
    }

    // Save new device token
    NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}

したがって、トークンは上記のDeviceTokenです。

_ RegisteredForRemoteNotifications_を実装する代わりに、次の操作を実行できます。

  1. AppDelegateにIMessagingDelegateインターフェースを実装させます。
  2. 次のメソッドを実装します。

    //このコールバックは、新しいトークンが生成されるたびに発生します-呼び出されるには、AppDelegateがIMessagingDelegateである必要があります

    [Export( "messaging:didReceiveRegistrationToken:")]

    public async void DidReceiveRegistrationToken(メッセージングメッセージング、文字列トークン){

            // Subscribe to a 'news' topic so we can send to just those subscribed to this topic
            messaging.Subscribe("news");
    
    
            // Log this to debug output so that we can capture it for testing
            Debug.WriteLine($"DidReceiveRegistration Token:'{token}'");
    
    
        }
    
0
James Lavery