11

Ứng dụng của tôi nhận được Thông báo đẩy qua Firebase. Bây giờ có 3 tình huống khác nhau có thể xảy ra khi thông báo đến:Trạng tháiBarNotification cách nhận dữ liệu hoặc gửi lại ý định?

  1. Ứng dụng là ở mặt trước
  2. Ứng dụng trong nền
  3. Các ứng dụng không chạy

Tình 1 là không có vấn đề. Thông báo được nhận trong ứng dụng ok. Tình huống 2 và 3 hoạt động tốt miễn là bạn nhấn vào thông báo trong ngăn kéo. Trong trường hợp 2 và 3 khi biểu tượng ứng dụng được nhấn thay vì biểu tượng ngăn, ứng dụng không nhận được bất kỳ thông báo nào. Tôi đã cố gắng để có được các thông báo hoạt động từ StatusBar và hoạt động nhưng tôi không thể lấy dữ liệu từ Extras hoặc gửi lại thông báo đến dịch vụ thông báo đẩy đang chờ. Đây là mã thử nghiệm để nhận Thông báo.

 NotificationManager notificationManager = (NotificationManager)Application.Context.GetSystemService(Context.NotificationService); 

     var notifications = notificationManager.GetActiveNotifications() 
      .Where(notif => notif.PackageName == Application.Context.PackageName); 

     foreach (var notification in notifications) 
     { 
      Log.Info(TAG, "OnActivityResumed: Notification in active in Status Bar: {0}", notification.Notification.ToString()); 

      var data = notification.Notification.Extras.GetString("data"); 

      Log.Debug("Notifier", "Data received: {0}", data); 

      //if (data != null) 
      //{ 
      // Settings.Notification = JsonConvert.DeserializeObject<LoginNotificationParameter>(data); 
      //} 
     } 

     // Canceling all notifications 
     notificationManager.CancelAll(); 

Câu hỏi:

  1. Có hành vi đúng khi cho rằng các ứng dụng không nhận được bất kỳ ý đồ khi một thông báo là trong ngăn kéo?
  2. Nếu vậy, làm cách nào để xử lý các tình huống 2 và 3 khi người dùng nhấn vào biểu tượng ứng dụng thay vì thông báo ngăn kéo?

Tôi thấy dữ liệu này trong het Notification khi in tất cả các Extras Các giá trị chính:

06-28 16:34:13.174 20792 20792 I Notifier: OnActivityResumed: Notification is active in Status Bar: Notification(pri=0 contentView=null vibrate=null sound=content://settings/system/notification_sound defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0) 
06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.title Data: Login 
06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.subText Data: 
06-28 16:34:13.191 20792 20792 I Notifier: KeyIn: Extras Key: android.template Data: android.app.Notification$BigTextStyle 
06-28 16:34:13.192 20792 20792 I Notifier: KeyIn: Extras Key: android.showChronometer Data: false 
06-28 16:34:13.192 20792 20792 I Notifier: KeyIn: Extras Key: android.text Data: Er is een inlogverzoek voor u ontvangen. 
06-28 16:34:13.194 20792 20792 I Notifier: KeyIn: Extras Key: android.progress Data: 0 
06-28 16:34:13.194 20792 20792 I Notifier: KeyIn: Extras Key: android.progressMax Data: 0 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.appInfo Data: ApplicationInfo{a27f281 nl.natuurnetwerk.notifier} 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.showWhen Data: true 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.largeIcon Data: 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.bigText Data: Er is een inlogverzoek voor u ontvangen. 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.infoText Data: 
06-28 16:34:13.195 20792 20792 I Notifier: KeyIn: Extras Key: android.originatingUserId Data: 0 
06-28 16:34:13.196 20792 20792 I Notifier: KeyIn: Extras Key: android.progressIndeterminate Data: false 
06-28 16:34:13.196 20792 20792 I Notifier: KeyIn: Extras Key: android.remoteInputHistory Data: 
+0

Bạn có muốn cập nhật dữ liệu trong ứng dụng của mình bằng thông báo không? – apineda

+0

Chức năng của ứng dụng này là để xác minh thông tin đăng nhập từ một trang web. Khi người dùng đăng nhập vào một trang web cụ thể với UserId/Password, một thông báo sẽ được gửi đến ứng dụng. Khi ứng dụng mở nó bắt đầu quét mã QR được hiển thị sau khi đăng nhập trên trang web. Thông tin trong thông báo phải bằng thông tin trong mã QR. Khi đó phù hợp với trang web tiếp tục đến trang chủ của nó. Nếu không, thông tin đăng nhập sẽ bị từ chối. –

Trả lời

7

Ok, điều này làm việc cho tôi cho tất cả các quốc gia ứng dụng tôi có thể nghĩ đến:

using Android.App; 
using Android.Content; 
using Android.OS; 
using MvvmCross.Droid.Platform; 
using MvvmCross.Droid.Support.V4; 

namespace Notifier.Android.Classes.Services 
{ 
    /// <summary> 
    /// This class receives all Firebase intents. 
    /// </summary> 
    [BroadcastReceiver(Enabled = true, Permission = "com.google.android.c2dm.permission.SEND")] 
    [IntentFilter(new[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.yourdomain.yourapp" })] 
    public class FirebaseBroadcastReceiver : MvxWakefulBroadcastReceiver 
    { 
     public override void OnReceive(Context context, Intent intent) 
     { 
      var setup = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context); 
      setup.EnsureInitialized(); 

      var service = new Intent(context, typeof(FirebaseBroadcastReceiver)); 

      PowerManager.WakeLock sWakeLock; 
      var pm = PowerManager.FromContext(context); 
      sWakeLock = pm.NewWakeLock(WakeLockFlags.Full, "FirebaseBroadcastReceiver"); 
      sWakeLock.Acquire(); 


      if (intent.Extras != null) 
      { 
       // Your code to handle the intent 
      } 

      sWakeLock.Release(); 

      StartWakefulService(context, service); 
     } 
    } 
} 
1

Tôi đã thử điều này:

private void HandlePendingNotifications() 
    { 
     NotificationManager notificationManager = (NotificationManager)Application.Context.GetSystemService(Context.NotificationService); 

     var notifications = notificationManager.GetActiveNotifications() 
      .OrderByDescending(notif => notif.PostTime) 
      .Where(notif => notif.PackageName == Application.Context.PackageName); 

     var notification = notifications.FirstOrDefault(); 

     if (notification != null) 
     { 
      Log.Debug(TAG, "OnActivityResumed: Notification is active in Status Bar: {0}", notification.Notification.ToString()); 

      NotificationManagerCompat nm = NotificationManagerCompat.From(this); 

      notification.Notification.Sound = null; 
      notification.Notification.Vibrate = null; 

      // nm.Cancel(notification.Id); 
      nm.Notify(0, notification.Notification); 
     } 

     //Timer timer = new Timer((state) => 
     //{ 
     // // Canceling all notifications 
     // notificationManager.CancelAll(); 
     // timer = null; 
     //}, null, 2000, 2000); 
    } 

Nhưng đối với một số lý do các thông báo được gửi nhưng không bao giờ đến ứng dụng của tôi.

+0

Thông báo mới gửi được hiển thị trong ngăn kéo nhưng nhấn vào nó sẽ không kích hoạt ứng dụng của tôi. –

+0

Sau Thông báo() có 2 thông báo trong ngăn kéo. Bản gốc và cái tôi gửi. Bản gốc kích hoạt ứng dụng của tôi. Cái thứ hai thì không. –

1

Mở rộng FirebaseMessagingService và ghi đè lên onMessageReceivedonDeletedMessages callbacks. Để tự động mở một ứng dụng/hoạt động khi nhận được thông báo, bạn cần sử dụng thuộc tính data (thứ gì đó như {"data" : { "some_key" : "some_value"}}) trong tải trọng của mình, đảm bảo luôn gọi phương thức FirebaseMessagingService.onMessageReceived().

Xin lưu ý rằng việc mở một hoạt động/ứng dụng trên thông báo mà không có sự tương tác của người dùng thực sự là xấu và nên tránh.

+0

@Paul Sinnema: Câu trả lời của tôi là dành cho Android, bạn điều chỉnh câu trả lời với các lớp tương đương có sẵn trong Xamarin. –

+0

Đó chính là cách tôi triển khai nó. Vấn đề là khi ứng dụng ở chế độ nền và người dùng nhấn vào biểu tượng thay vì thông báo khay mà không có thông báo nào nhận được và chúng tôi sẽ phải tự lấy nó bằng cách nào đó. WakefulBroadcastReceiver như được hiển thị trong câu trả lời của riêng tôi giải quyết vấn đề đó tốt. –

Các vấn đề liên quan