PushWoosh Xamarin Forms Android 注册异常

PushWoosh Xamarin Forms Android exception on registration

我一直在尝试在我现有的 Xamarin Forms (PCL) 项目中实施 PushWoosh 的推送通知系统,到目前为止,它与 iOS 完美配合。 在将其添加到 Android 时,我在启动时面临崩溃,尽管我已经一个字母一个字母地遵循 the guide for Xamarin Forms for Android

由于未处理的异常,应用程序在启动时崩溃了。

我很高兴逐行评论以找出导致此错误的原因,似乎 manager.RegisterForPushNotifications(); 执行了导致该崩溃的代码。

在调试日志中进一步调查后,似乎是 ShortcutBadger 无法解析意图的问题。

我已经 运行 物理设备上的应用程序,完全是最新的:

我正在使用 Visual Studio 2017 社区。


Android 清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.package.awesome"
          android:versionCode="1"
          android:versionName="4.0"
          android:installLocation="auto">
  <uses-sdk android:minSdkVersion="15" />
  <!-- Badges -->
    <!-- Common -->
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/>

    <!-- Apex -->
    <uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>

    <!-- Samsung -->
    <uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
    <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />

    <!-- Sony -->
    <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />

    <!-- HTC -->
    <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT" />

    <!-- Solid -->
    <uses-permission android:name="com.majeur.launcher.permission.UPDATE_BADGE"/>

    <!-- Huawei -->
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
    <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>

    <!-- ZUK -->
    <uses-permission android:name="android.permission.READ_APP_BADGE"/>

    <!-- OPPO -->
    <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/>

    <!-- EvMe -->
    <uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_READ"/>
    <uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_WRITE"/>
  <!-- /Badges -->

  <!-- Location tracking -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

  <!-- Boot permission for rescheduling local notifications and location tracking -->
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

  <!-- GCM Part -->
  <permission android:name="com.package.awesome.permission.C2D_MESSAGE"
              android:protectionLevel="signature"/>
  <uses-permission android:name="com.package.awesome.permission.C2D_MESSAGE"/>

  <application android:label="@string/app_name"
               android:icon="@mipmap/ic_launcher">
    <meta-data android:name="com.google.android.gms.version"
               android:value="8487000" />
    <meta-data android:name="PW_APPID"
               android:value="A1B2C-3D4E5" />
    <meta-data android:name="PW_PROJECT_ID"
               android:value="awesome-app" />

    <!-- GCM Part -->
    <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.package.awesome" />
      </intent-filter>
    </receiver>
  </application>
</manifest>

MainActivity.cs:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Pushwoosh;
using Android.Content.PM;
using Android.Util;

namespace Project.Droid
{
    class LocalMessageBroadcastReceiver : BasePushMessageReceiver
    {
        public MainActivity activity { get; set; }

        protected override void OnMessageReceive(Intent intent)
        {
            activity.doOnMessageReceive(intent.GetStringExtra(BasePushMessageReceiver.JsonDataKey));
        }
    }

    [Activity(Label = "@string/app_name", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    [IntentFilter(new string[] { "com.package.awesome.MESSAGE" }, Categories = new string[] { "android.intent.category.DEFAULT" })]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        LocalMessageBroadcastReceiver mMessageReceiver;

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

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);

            LoadApplication(new App());

            mMessageReceiver = new LocalMessageBroadcastReceiver();
            mMessageReceiver.activity = this;

            registerReceivers();

            PushManager manager = PushManager.GetInstance(this);
            manager.OnStartup(this);

            // Register for push!
            manager.RegisterForPushNotifications();

            // Reset application icon badge number
            manager.BadgeNumber = 0;

            checkMessage(Intent);
        }

        protected override void OnNewIntent(Intent intent)
        {
            checkMessage(intent);
        }

        public void checkMessage(Intent intent)
        {
            if (null != intent)
            {
                if (intent.HasExtra(PushManager.PushReceiveEvent))
                {
                    doOnMessageReceive(intent.Extras.GetString(PushManager.PushReceiveEvent));
                }

                resetIntentValues();
            }
        }

        public void doOnMessageReceive(String message)
        {
            // hadle push open here
            Log.Debug("PushwooshSample", "Push opened: " + message);
        }

        private void resetIntentValues()
        {
            Intent mainAppIntent = Intent;

            if (mainAppIntent.HasExtra(PushManager.PushReceiveEvent))
            {
                mainAppIntent.RemoveExtra(PushManager.PushReceiveEvent);
            }
            else if (mainAppIntent.HasExtra(PushManager.RegisterEvent))
            {
                mainAppIntent.RemoveExtra(PushManager.RegisterEvent);
            }
            else if (mainAppIntent.HasExtra(PushManager.UnregisterEvent))
            {
                mainAppIntent.RemoveExtra(PushManager.UnregisterEvent);
            }
            else if (mainAppIntent.HasExtra(PushManager.RegisterErrorEvent))
            {
                mainAppIntent.RemoveExtra(PushManager.RegisterErrorEvent);
            }
            else if (mainAppIntent.HasExtra(PushManager.UnregisterErrorEvent))
            {
                mainAppIntent.RemoveExtra(PushManager.UnregisterErrorEvent);
            }

            Intent = mainAppIntent;
        }

        protected override void OnResume()
        {
            base.OnResume();

            registerReceivers();
        }

        protected override void OnPause()
        {
            base.OnPause();

            unregisterReceivers();
        }

        public void registerReceivers()
        {
            IntentFilter intentFilter = new IntentFilter(PackageName + ".action.PUSH_MESSAGE_RECEIVE");
            RegisterReceiver(mMessageReceiver, intentFilter);
        }

        public void unregisterReceivers()
        {
            UnregisterReceiver(mMessageReceiver);
        }
    }
}

崩溃日志:

07-31 10:12:09.182 D/Pushwoosh(29231): [RequestManager] Try To send: getInApps
07-31 10:12:09.185 V/Pushwoosh(29231): [GCMRegistrationService] Intent action = com.pushwoosh.gcm.intent.REGISTER
07-31 10:12:09.190 E/Pushwoosh(29231): [ShortcutBadger] Unable to execute badge
07-31 10:12:09.190 E/Pushwoosh(29231): com.pushwoosh.thirdparty.a.b: Unable to execute badge
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.pushwoosh.thirdparty.a.c.b(Unknown Source)
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.pushwoosh.thirdparty.a.c.a(Unknown Source)
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.pushwoosh.internal.PushManagerImpl.run(Unknown Source)
07-31 10:12:09.190 E/Pushwoosh(29231):  at android.os.Handler.handleCallback(Handler.java:739)
07-31 10:12:09.190 E/Pushwoosh(29231):  at android.os.Handler.dispatchMessage(Handler.java:95)
07-31 10:12:09.190 E/Pushwoosh(29231):  at android.os.Looper.loop(Looper.java:148)
07-31 10:12:09.190 E/Pushwoosh(29231):  at android.app.ActivityThread.main(ActivityThread.java:5417)
07-31 10:12:09.190 E/Pushwoosh(29231):  at java.lang.reflect.Method.invoke(Native Method)
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-31 10:12:09.190 E/Pushwoosh(29231): Caused by: com.pushwoosh.thirdparty.a.b: unable to resolve intent: Intent { act=android.intent.action.BADGE_COUNT_UPDATE (has extras) }
07-31 10:12:09.190 E/Pushwoosh(29231):  at com.pushwoosh.thirdparty.a.a.d.a(Unknown Source)
07-31 10:12:09.190 E/Pushwoosh(29231):  ... 10 more

请注意,出于保密目的,我已经重命名了项目名称、包、PushWoosh 应用程序 ID 和 FCM 应用程序 ID。

我通过将 Xamarin.GooglePlayServices.Gcm 依赖项更新到最新版本 42.1021.1 解决了我的问题,而我的是 29.x.x.

正如 Mike 在评论中所说,我必须确保一切都是最新的,因为 PushWoosh 不需要高版本的关键依赖项,例如 Google Play 服务,而它们可能会崩溃该应用程序(如果已过时)。他们应该在这一点上更加严格!