6

Để biết thông tin nhanh chóng, tôi đang sử dụng các hướng dẫn sau:thông báo đẩy Azure không nhận được khi ứng dụng Android bị đóng

https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-android-push-notification-google-gcm-get-started/

Vấn đề tôi có thể nhận được các thông báo đẩy (được gửi từ máy chủ Nodejs của tôi) khi ứng dụng được mở. Tuy nhiên, khi tôi đóng ứng dụng và xóa nó khỏi các lần gần đây thì tôi không nhận được bất kỳ thông báo đẩy nào. Tôi đang sử dụng Trung tâm thông báo đẩy của Azure.

Tất cả mã đều ở trên liên kết, tuy nhiên, tôi cũng đặt nó ở đây như cách tôi đã triển khai.

thêm các khối sau đây trong tập tin Android Manifest: (thẻ không được hiển thị vì đơn giản, tôi đã thêm khối ở những nơi đúng)

<meta-data android:name="com.google.android.gms.version" 
    android:value="@integer/google_play_services_version" /> 

<service android:name="<your package>.MyInstanceIDService" android:exported="false"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.iid.InstanceID"/> 
    </intent-filter> 
</service> 

<service 
    android:name="<your package>.RegistrationIntentService" 
    android:exported="false"> 
</service> 

<receiver android:name="com.microsoft.windowsazure.notifications.NotificationsBroadcastReceiver" 
android:permission="com.google.android.c2dm.permission.SEND"> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="<your package name>" /> 
    </intent-filter> 
</receiver> 

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<permission android:name="<your package>.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="<your package>.permission.C2D_MESSAGE"/> 

Sau đây là các lớp mà tôi thêm vào theo hướng dẫn:

public class NotificationSettings { 
    public static String SenderId = "<Your project number>"; 
    public static String HubName = "<Your HubName>"; 
    public static String HubListenConnectionString = "<Your default listen connection string>"; 
} 

dịch vụ InstanceID nghe:

import android.content.Intent; 
import android.util.Log; 
import com.google.android.gms.iid.InstanceIDListenerService; 

public class MyInstanceIDService extends InstanceIDListenerService { 

    private static final String TAG = "MyInstanceIDService"; 

    @Override 
    public void onTokenRefresh() { 

     Log.i(TAG, "Refreshing GCM Registration Token"); 

     Intent intent = new Intent(this, RegistrationIntentService.class); 
     startService(intent); 
    } 
}; 

Registra tionIntentService Class:

import android.app.IntentService; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.util.Log; 

import com.google.android.gms.gcm.GoogleCloudMessaging; 
import com.google.android.gms.iid.InstanceID; 
import com.microsoft.windowsazure.messaging.NotificationHub; 

public class RegistrationIntentService extends IntentService { 

    private static final String TAG = "RegIntentService"; 

    private NotificationHub hub; 

    public RegistrationIntentService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) {  
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
     String resultString = null; 
     String regID = null; 

     try { 
      InstanceID instanceID = InstanceID.getInstance(this); 
      String token = instanceID.getToken(NotificationSettings.SenderId, 
        GoogleCloudMessaging.INSTANCE_ID_SCOPE);   
      Log.i(TAG, "Got GCM Registration Token: " + token); 

      // Storing the registration id that indicates whether the generated token has been 
      // sent to your server. If it is not stored, send the token to your server, 
      // otherwise your server should have already received the token. 
      if ((regID=sharedPreferences.getString("registrationID", null)) == null) {  
       NotificationHub hub = new NotificationHub(NotificationSettings.HubName, 
         NotificationSettings.HubListenConnectionString, this); 
       Log.i(TAG, "Attempting to register with NH using token : " + token); 

       regID = hub.register(token).getRegistrationId(); 

       // If you want to use tags... 
       // Refer to : https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-routing-tag-expressions/ 
       // regID = hub.register(token, "tag1", "tag2").getRegistrationId(); 

       resultString = "Registered Successfully - RegId : " + regID; 
       Log.i(TAG, resultString);  
       sharedPreferences.edit().putString("registrationID", regID).apply(); 
      } else { 
       resultString = "Previously Registered Successfully - RegId : " + regID; 
      } 
     } catch (Exception e) { 
      Log.e(TAG, resultString="Failed to complete token refresh", e); 
      // If an exception happens while fetching the new token or updating our registration data 
      // on a third-party server, this ensures that we'll attempt the update at a later time. 
     } 

     // Notify UI that registration has completed. 
     if (MainActivity.isVisible) { 
      MainActivity.mainActivity.ToastNotify(resultString); 
     } 
    } 
} 

Và Notification Handler:

public class MyHandler extends NotificationsHandler { 
    public static final int NOTIFICATION_ID = 1; 
    private NotificationManager mNotificationManager; 
    NotificationCompat.Builder builder; 
    Context ctx; 

    @Override 
    public void onReceive(Context context, Bundle bundle) { 
     ctx = context; 
     String nhMessage = bundle.getString("message"); 
     sendNotification(nhMessage); 
     if (MainActivity.isVisible) { 
      MainActivity.mainActivity.ToastNotify(nhMessage); 
     } 
    } 

    private void sendNotification(String msg) { 

     Intent intent = new Intent(ctx, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     mNotificationManager = (NotificationManager) 
       ctx.getSystemService(Context.NOTIFICATION_SERVICE); 

     PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, 
       intent, PendingIntent.FLAG_ONE_SHOT); 

     Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(ctx) 
         .setSmallIcon(R.mipmap.ic_launcher) 
         .setContentTitle("Notification Hub Demo") 
         .setStyle(new NotificationCompat.BigTextStyle() 
           .bigText(msg)) 
         .setSound(defaultSoundUri) 
         .setContentText(msg); 

     mBuilder.setContentIntent(contentIntent); 
     mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
    } 
} 

vẫn còn một số khối mã mà tôi đã không bao gồm ở đây nhưng họ có thể được nhìn thấy từ trên liên kết.

Vui lòng cho tôi biết nếu có bất kỳ quyền đặc biệt nào để nghe thông báo đẩy khi ứng dụng không chạy.

EDIT

Tôi nghĩ rằng nếu bằng cách nào đó chúng tôi tiếp tục chức năng này onReceive sống ngay cả khi ứng dụng được đóng sau đó chúng ta có thể đạt được điều này. Vẫn không chắc chắn làm thế nào để làm điều này.

+0

Bạn đã bao giờ tìm ra câu trả lời cho điều này chưa? – portfoliobuilder

+0

Chưa. Tôi vẫn đang cố gắng tìm ra. –

Trả lời

0

Tôi gặp sự cố tương tự, không chắc chắn nguyên nhân gốc có giống với nguyên nhân gốc của bạn hay không.

Ứng dụng sẽ nhận được thông báo đẩy khi ứng dụng được khởi chạy hoặc ở chế độ nền nhưng sẽ ngừng nhận thông báo khi tôi giết ứng dụng từ trình quản lý tác vụ.

Hóa ra, sự cố xảy ra trong Tệp kê khai của tôi. Từ documentation,

của bạn + ".permission.C2D_MESSAGE" phép để ngăn chặn các ứng dụng Android khác từ việc đăng ký và nhận thông điệp ứng dụng của Android. Tên cho phép phải chính xác là khớp với mẫu này — nếu không ứng dụng Android sẽ không nhận được thư.

tôi đã định nghĩa cho phép của tôi như

<permission 
    android:name=".permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name=".permission.C2D_MESSAGE" /> 

Lý do tôi sử dụng . ký hiệu thay vì tên gói hoàn chỉnh là tôi đã sử dụng applicationIdSuffix cho debug build của tôi. Tôi cho rằng Gradle sẽ hoàn thành tên gói chính xác dựa trên loại xây dựng.

Đây là nơi tôi đã nhầm lẫn. Rõ ràng Gradle không cập nhật gói với hậu tố trong Quyền. Để khắc phục điều này, tôi đã thay thế mã bằng,

<permission 
    android:name="${applicationId}.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

Với ứng dụng này, ứng dụng bắt đầu nhận thông báo ngay cả khi bị giết.

+0

Tôi đang sử dụng gói hoàn chỉnh như 'com.app.permission.C2D_MESSAGE'. Nó vẫn không hoạt động. Tôi không sử dụng ký hiệu '.' –

+0

Bạn đã đặt' applicationIdSuffix' trong 'build.gradle' chưa? – basilisk

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