推送通知未到达

时间:2014-05-01 06:51:17

标签: xamarin.android xamarin pushsharp

我正在使用Xamarin开发一个Android应用程序,并且我正在使用PushSharp进行推送通知。 我在应用程序未运行时接收推送通知时遇到一些问题(例如重启后)。这是服务代码:

[BroadcastReceiver(Permission=GCMConstants.PERMISSION_GCM_INTENTS)]
    [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_MESSAGE }, Categories = new string[] { "com.xxx" })]
    [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new string[] { "com.xxx" })]
    [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new string[] { "com.xxx" })]
    [IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
    public class PushHandlerBroadcastReceiver : PushHandlerBroadcastReceiverBase<PushHandlerService>
    {
        //IMPORTANT: Change this to your own Sender ID!
        //The SENDER_ID is your Google API Console App Project ID.
        //  Be sure to get the right Project ID from your Google APIs Console.  It's not the named project ID that appears in the Overview,
        //  but instead the numeric project id in the url: eg: https://code.google.com/apis/console/?pli=1#project:785671162406:overview
        //  where 785671162406 is the project id, which is the SENDER_ID to use!
        public static string[] SENDER_IDS = new string[] {"1234"};

        public const string TAG = "PushSharp-GCM";
    }

以下是创建的appManifest:

 <receiver android:permission="com.google.android.c2dm.permission.SEND" android:name="xxx.PushHandlerBroadcastReceiver">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.xxx" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.xxx" />
      </intent-filter>
      <intent-filter>
        <action android:name="com.google.android.gcm.intent.RETRY" />
        <category android:name="com.xxx" />
      </intent-filter>
    </receiver>
    <service android:name="xxx.PushHandlerService" />

我的服务代码非常基础:

[Service] //Must use the service tag
    public class PushHandlerService : PushHandlerServiceBase
    {
        public PushHandlerService () : base (PushHandlerBroadcastReceiver.SENDER_IDS)
        {
        }

        protected override void OnRegistered (Context context, string registrationId)
        {
            ...
        }

        protected override void OnUnRegistered (Context context, string registrationId)
        {
            ...

        }

        protected override void OnMessage (Context context, Intent intent)
        {
            ...
        }

        protected override bool OnRecoverableError (Context context, string errorId)
        {
            ...
        }

        protected override void OnError (Context context, string errorId)
        {
            ...
        }

        void createNotification (string title, string desc, Intent intent)
        {
            ...
        }
    }

我错过了什么吗?为什么电话重启后服务没有启动。我应该在广播接收器中做些什么吗?我应该注册服务构造函数中的推送通知(以处理应用程序尚未启动的情况)吗?

1 个答案:

答案 0 :(得分:0)

如果您的服务在重新启动时没有启动,您可以在项目中添加BroadcastReceiver来启动它:

[BroadcastReceiver]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class MyBootReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        MyNotificationService.RunIntentInService(context, intent);
        SetResult(Result.Ok, null, null);
    }
}

如果您使用的是PushSharp,则可能会将该过滤器添加到PushHandlerBroadcastReceiverBase实施中。