Push-уведомление с Xamarin.Forms и Azure: устройства не зарегистрированы - PullRequest
0 голосов
/ 26 сентября 2018

Шаг за шагом я следовал следующему руководству: https://docs.microsoft.com/it-it/azure/notification-hubs/xamarin-notification-hubs-push-notifications-android-gcm

Я запустил приложение Android на физическом устройстве с Android 8.0.0.Затем также на 3 эмуляторах (API 23, 25 и 27).

На панели управления Azure зарегистрированные устройства всегда равны нулю.В результате тест на отправку прошел успешно, но на устройства не пришло уведомление (« Сообщение было успешно отправлено, но не было подходящих целей »).

Я пропустил несколько шаговкасательно регистрации устройств?

* Интеграция кода * *** [стартовый код]

MainActivity.cs

namespace test021_push.Droid
{
    [Activity(Label = "test021_push", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public const string TAG = "MainActivity";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            //push notification
            if (Intent.Extras != null)
            {
                foreach (var key in Intent.Extras.KeySet())
                {
                    if (key != null)
                    {
                        var value = Intent.Extras.GetString(key);
                        Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
                    }
                }
            }

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
    }
}

Constants.cs

namespace test021_push.Droid
{
    public static class Constants
    {
        public const string ListenConnectionString = "Endpoint=sb://namespacepodo.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=lN8fZnQYlYQ/ELVrgnzUD16MBw9bOTH/Yxaw2LANA58=";
        public const string NotificationHubName = "notificationHubPodo";
    }
}

MyFirebaseIIDService.cs

namespace test021_push.Droid
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class MyFirebaseIIDService : FirebaseInstanceIdService
    {
        const string TAG = "MyFirebaseIIDService";
        NotificationHub hub;

        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "FCM token: " + refreshedToken);
            SendRegistrationToServer(refreshedToken);
        }

        void SendRegistrationToServer(string token)
        {
            // Register with Notification Hubs
            hub = new NotificationHub(Constants.NotificationHubName, Constants.ListenConnectionString, this);

            var tags = new List<string>() { };
            var regID = hub.Register(token, tags.ToArray()).RegistrationId;

            Log.Debug(TAG, $"Successful registration of ID {regID}");
        }
    }
}

MyFirebaseMessagingService.cs

namespace test021_push.Droid
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        const string TAG = "MyFirebaseMsgService";
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
            if (message.GetNotification() != null)
            {
                //These is how most messages will be received
                Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
                SendNotification(message.GetNotification().Body);
            }
            else
            {
                //Only used for debugging payloads sent from the Azure portal
                SendNotification(message.Data.Values.First());

            }

        }

        void SendNotification(string messageBody)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

            //var notificationBuilder = new Notification.Builder(this)  //Notification.Builder è deprecato
            var notificationBuilder = new NotificationCompat.Builder(this)
                        .SetContentTitle("FCM Message")
                        .SetSmallIcon(Resource.Drawable.ic_launcher)
                        .SetContentText(messageBody)
                        .SetAutoCancel(true)
                        .SetContentIntent(pendingIntent);

            var notificationManager = NotificationManager.FromContext(this);

            notificationManager.Notify(0, notificationBuilder.Build());
        }
    }
}

*** [код конца]

Теперь уведомления приходят только на устройство (эмулятор Android API 25).В других эмуляторах (API 23 и 27) и на физическом устройстве ничего не происходит.Несмотря на то, что проделал одинаковую процедуру на всех 4 устройствах.

И в Azure я вижу 3 зарегистрированных устройства.

Большое спасибо за ваши ответы.

1 Ответ

0 голосов
/ 26 сентября 2018

Вы проверили в консоли Firebase, регистрируются ли устройства?

Также проверьте журнал при запуске приложения.Возможно, что регистрация на firebase не удалась.Просто ищите в журналах "firebase".Также попробуйте добавить точку останова в OnTokenRefresh()

Если это не удастся, возможно, ваш google-services.json неверен или имеет неверное действие сборки.

Изменить: документы Azure устарели.В Android 8.0 добавлена ​​функция канала уведомлений.И у вас есть , чтобы использовать его, иначе уведомление не будет отображаться.Это, однако, исправляет только отображение уведомления.Если уведомление не приходит в OnMessageReceived(RemoteMessage message), есть еще одна ошибка.

Я решил это следующим образом: SendNotification метод

        var channelId = "testChannelId";
        var channelDescription = "Test Description";

        var builder = Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O
            ? new Notification.Builder(Android.App.Application.Context, channelId)
            : new Notification.Builder(Android.App.Application.Context);

        var notification = builder
                    .SetContentTitle("Test")
                    .SetContentText(messageBody)
                    .SetSmallIcon(Resource.Drawable.ic_notification)
                    .SetAutoCancel(true)
                    .SetWhen(DateTime.Now.ToUnixMillisecondTime())
                    .SetShowWhen(true)
                    .Build();
        var notificationManager = NotificationManager.FromContext(Application.Context);

        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
        {
            var channel = new NotificationChannel(channelId,
                    channelDescription,
                    NotificationImportance.Default);
            notificationManager.CreateNotificationChannel(channel);
        }
...