我一直試圖在我現有的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。
錯誤:https://github.com/leolin310148/SortcutBadger/issues/90 – SushiHangover
感謝您的回答。不幸的是,我已經閱讀過這篇文章,正如他們最後說的那樣,這個問題已經關閉,沒有有效的解決方案。 –
它的開放源代碼,您可以隨時修改源代碼以使用您正在使用的啓動器。核心問題是你正在使用的啓動器沒有'android.intent.action.BADGE_COUNT_UPDATE'意圖定義 – SushiHangover