FCM (FirebaseMessagingService) OnNewToken не получает Android - PullRequest
0 голосов
/ 24 февраля 2020

Я следую инструкциям на этой странице , чтобы создать уведомления pu sh. На самом деле я уже делал это раньше и смог заставить его работать (несколько недель назад), отнял некоторое время и решил, что снова буду заниматься этим уроком, только сейчас, по какой-то причине, могу ». Я даже не смог получить код для запуска метода OnNewToken, чтобы сгенерировать мой токен и зарегистрировать устройство в центре уведомлений.

Я просмотрел десятки видео, прочитал другие учебные пособия, и все они говорят / показывают довольно почти то же самое, поэтому я думаю, что мне нужна новая пара глаз, чтобы показать мне, что я пропускаю во второй раз.

Я пытался извлечь конкретную c информацию, но все еще держу ее как читается как мог.

Установленные пакеты NuGet:

  1. Xamarin.Firebase.Messaging - v71.1740.0
  2. Xamarin.GooglePlayServices.Base - v71.1610.0
  3. Xamarin.Forms - v4.4.0.991640

Файлы в Android проекте
AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="(my firebase package / project package name)" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<!--
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
-->
<application>
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
</application>
</manifest>

AppConstants

public static class AppConstants
{
    public static string NotificationChannelName { get; set; } = "XamarinNotifyChannel";
    public static string NotificationHubName { get; set; } = "(my azure notification hub name)";
    public static string ListenConnectionString { get; set; } = "(my default listen shared access signature from azure portal)";
    public static string DebugTag { get; set; } = "XamarinNotify";
    public static string[] SubscriptionTags { get; set; } = { "default" };
    public static string FCMTemplateBody { get; set; } = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    public static string APNTemplateBody { get; set; } = "{\"aps\":{\"alert\":\"$(messageParam)\"}}";
}

* 10 34 * FirebaseService

[Service(Name = "(my package name).MyFirebaseMessagingService")]
[IntentFilter(new[] {  "com.google.firebase.MESSAGING_EVENT" })]
public class FirebaseService : FirebaseMessagingService
{
    public override void OnNewToken(string token)
    {
        base.OnNewToken(token);
        Console.WriteLine("NEW_TOKEN", token);
        SendRegistrationToServer(token);
    }

    void SendRegistrationToServer(string token)
    {
        NotificationHub hub = new NotificationHub(AppConstants.NotificationHubName, AppConstants.ListenConnectionString, this);
        // register device with Azure Notification Hub using the token from FCM
        Registration reg = hub.Register(token, AppConstants.SubscriptionTags);
        // subscribe to the SubscriptionTags list with a simple template.
        string pnsHandle = reg.PNSHandle;
        hub.RegisterTemplate(pnsHandle, "defaultTemplate", AppConstants.FCMTemplateBody, AppConstants.SubscriptionTags);
    }

    public override void OnMessageReceived(RemoteMessage message)
    {
        base.OnMessageReceived(message);
        string messageBody = string.Empty;
        if (message.GetNotification() != null)
        {
            messageBody = message.GetNotification().Body;
        }
        else
        {
            messageBody = message.Data.Values.First();
        }
        try
        {
            MessagingCenter.Send(messageBody, "Update");
        }
        catch (Exception e)
        { }
        SendLocalNotification(messageBody);
    }

    void SendLocalNotification(string body)
    {
        var intent = new Intent(this, typeof(MainActivity));
        intent.AddFlags(ActivityFlags.ClearTop);
        intent.PutExtra("message", body);

        //Unique request code to avoid PendingIntent collision.
        var requestCode = new Random().Next();
        var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);

        var notificationBuilder = new NotificationCompat.Builder(this)
            .SetContentTitle("XamarinNotify Message")
            .SetSmallIcon(Resource.Drawable.ic_launcher)
            .SetContentText(body)
            .SetAutoCancel(true)
            .SetShowWhen(false)
            .SetContentIntent(pendingIntent);

        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
        }

        var notificationManager = NotificationManager.FromContext(this);
        notificationManager.Notify(0, notificationBuilder.Build());
    }
}

google-services. json
Я только что скачал этот файл из Firebase, добавил его в проект Android и установил Создать действие для GoogleServices Json.

Надеюсь, кто-нибудь увидит, что мне не хватает, так как у меня уже работал этот учебник.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Пожалуйста, удалите приложение из вашего android, затем повторно разверните его.

onNewToken() будет вызываться только один раз за установку.

Если вам нужно, чтобы он вызывался снова, удалите приложение с устройства и перезапустите его.

1 голос
/ 24 февраля 2020

Вы забыли [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]

[Service()]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class FirebaseService : FirebaseMessagingService
    {
...