【问题标题】:receiving push notifications when app is closed in xamarin在 xamarin 中关闭应用程序时接收推送通知
【发布时间】:2016-05-02 16:48:48
【问题描述】:

当应用程序完全关闭时,我正在尝试在 Xamarin 中处理 GCM 推送通知。按照 Xamarin 推送通知教程,我能够从 GCM 接收远程/推送通知,但是一旦我关闭应用程序,我就没有收到。到目前为止,这是我尝试过的:

1.广播接收器:

    public class MyGCMBroadcastReceiver : BroadcastReceiver {

    public override void OnReceive (Context context, Intent intent)
    {
        Intent gcmListenerServiceIntent = new Intent(context,typeof(MyGcmListenerService));
        Console.WriteLine ("Starting Broadcast Receiver...");
        context.StartService (gcmListenerServiceIntent);
    }
}
  1. 清单:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="za.co.snappyhome.snappy.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <application android:label="My App" android:theme="@style/AppTheme" android:icon="@drawable/icon">
    <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" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="za.co.myapp.app" />
        </intent-filter>
    </receiver>
    <receiver android:name="MyApp.Droid.Notifications.MyGCMBroadcastReceiver">
        <intent-filter>
           <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>                  
        </intent-filter>
    </receiver>
    </application>
    
  2. GCMListenerService:

    [Service (Exported = false), IntentFilter (new [] { "com.google.android.c2dm.intent.RECEIVE" })]
    public class MyGcmListenerService : GcmListenerService
    {
    
    public override void OnMessageReceived (string from, Bundle data)
    {
        if (data.ContainsKey ("data")) {
    
            if (Xamarin.Forms.Application.Current != null) {
                String json = data.GetString("data");
    
                MessagingCenter.Send<Xamarin.Forms.Application, string> (Xamarin.Forms.Application.Current,
                    "NOTIFICATION_MESSAGE_RECEIVED", json);                 
            }
        }
    }
    

    }

我仍在处理 Xamarin 和 GCM 通知,所以我的理解可能是错误的。我的理解是我可以在应用程序启动时启动广播接收器。这将反过来启动一个可以监听推送通知的服务(在我的例子中是 MyGcmListenerService)。我的第一个问题是广播接收器没有在应用程序启动时启动(按照这个答案:Trying to start a service on boot on Android)。其次,是否可以调用 MyGcmListenerService 以开始收听通知,就像我正在尝试做的那样。我尝试过使用 GCMIntentService,但这似乎在一段时间前已被弃用: Push Notifications when app is closed

提前谢谢你!!

【问题讨论】:

    标签: android google-cloud-messaging xamarin.forms


    【解决方案1】:

    我在 Xamarin Native - Android 中使用了以下配置和一段代码,并且可以在应用关闭时看到通知。

    1. Android manifest.xml

      <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
              <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
                  <intent-filter>
                      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                      <category android:name="${applicationId}" />
                  </intent-filter>
              </receiver>
      
      <service android:name="HEET.Droid.ViewController.Login.FireBaseIIDService" android:permission="false" android:stopWithTask="false">
                  <intent-filter>
                      <action android:name="com.google.firebase.messaging_event" />
                  </intent-filter>
              </service>
      
      1. FireBaseIIDService.cs

    根据最新版本,在 FireBaseIIDService 意图服务类中, onMessageReceived(RemoteMessage msg) 将在接收到每条消息时被调用。

            [Service]
            [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
            public class FireBaseIIDService : FirebaseMessagingService{
    
       public override void OnMessageReceived (RemoteMessage msg) {
    Notification.Builder builder = new Notification.Builder(this, "my_notification_channel");
                builder.SetSmallIcon(Resource.Drawable.circle);
                var intent = new Intent(this, typeof(DashboardActivity));
                intent.AddFlags(ActivityFlags.ClearTop);
                PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);
                builder.SetContentIntent(pendingIntent);
                builder.SetLargeIcon(BitmapFactory.DecodeResource(Resources, Resource.Drawable.circle));
                builder.SetContentTitle(Header);
                builder.SetContentText(body);
                builder.SetDefaults(NotificationDefaults.Sound);
                builder.SetAutoCancel(true);
                NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);
                notificationManager.Notify(1, builder.Build());
        }
        }
    

    【讨论】:

    • 我所关注的示例是 C#/ Xamarin,据我所知,其他方面与此相同,但如果应用程序已停止,它肯定不会发送通知,只有前景和背景。有什么想法吗?
    • 当应用程序以发布模式打包而处于调试模式时,我能够接收通知,即使应用程序停止时我也无法接收。
    • 不错的提示,但不幸的是,我刚刚尝试过结果并没有改变 - 一旦应用程序被强制停止,仍然无法在系统托盘中接收通知
    • 请发布您的代码详细信息。我会检查是否可以帮助您完成我构建的逻辑
    • 谢谢 - 在这里查看现有线程stackoverflow.com/questions/57824810/…
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多