«ошибка»: «InvalidRegistration» при отправке push-уведомлений - PullRequest
8 голосов
/ 09 апреля 2019

Я внедряю push-уведомления FCM, используя FirebasePushNotificationPlugin in Xamarin.Forms. В проекте iOS в AppDelegate при генерации RegisteredForRemoteNotifications вызова метода deviceToken генерация, но когда я отправляю почтальону уведомление для сгенерированного token, я получаю ошибку.

{"multicast_id": 8631208504861228784, "success": 0, "fail": 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);
}

данные 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

Это настройка профилей обеспечения из Visual Studio

enter image description here

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Я не знаком с Xamarin.Но я много работал с FCM.

Я думаю, вы ошибаетесь.Использование deviceToken не будет работать с push-уведомлениями от FCM.Я выполнил поиск, и, возможно, вам нужно получить его от

var fcmToken = FirebaseInstanceId.Instance.Token;

Подробнее: https://docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=macos

0 голосов
/ 09 апреля 2019

Отредактировано, поскольку мой первоначальный ответ относительно 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 ("message: 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}'");
    
    
        }
    
...