2017-07-31 43 views
0

我一直試圖在我現有的Xamarin Forms(PCL)項目中實現PushWoosh的推送通知系統,到目前爲止,它與iOS完美協作。 當涉及到將其添加到Android,儘管事實上我已經按照字母the guide for Xamarin Forms for Android的字母順序,但我仍然面臨崩潰。PushWoosh Xamarin在註冊時形成Android異常

由於未處理的異常,應用程序在啓動時崩潰。

我已經開始逐行評論,發現是什麼原因導致了這個錯誤,好像它是manager.RegisterForPushNotifications();,它執行負責該崩潰的代碼。

後的調試日誌進一步調查,這似乎是與ShortcutBadger是無法解決的意圖問題。

我已經跑了物理設備的應用程序,完全處於最新:

  • 三星Galaxy S4
  • (華碩)谷歌Nexus 7

我使用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$2.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 

請不e爲了保密的目的,我重命名了項目名稱,軟件包,PushWoosh應用程序ID和FCM應用程序ID。

+0

錯誤:https://github.com/leolin310148/SortcutBadger/issues/90 – SushiHangover

+0

感謝您的回答。不幸的是,我已經閱讀過這篇文章,正如他們最後說的那樣,這個問題已經關閉,沒有有效的解決方案。 –

+0

它的開放源代碼,您可以隨時修改源代碼以使用您正在使用的啓動器。核心問題是你正在使用的啓動器沒有'android.intent.action.BADGE_COUNT_UPDATE'意圖定義 – SushiHangover

回答

0

我解決了我的問題,通過更新Xamarin.GooglePlayServices.Gcm依賴關係到最新版本42.1021.1而我的是29.x.x

正如Mike在評論中所說的,我必須確保一切都是最新的,因爲PushWoosh不需要高版本的關鍵依賴關係,例如Google Play服務,但它們可能會在應用程序過時時崩潰。在這一點上他們應該更具限制性!