Push Notification trên android với Azure Notification Hubs (ANH)

Việc push notification trên android không còn quá xa lạ với các ứng dụng đặc biệt với các ứng dụng sử dụng internet. Có rất nhiều library, hay các service hỗ trợ như

  • Google Cloud Message (GCM)
  • Amazon Simple Notification Service (ADM)

Với ANH cũng tương tự như các service trên nhưng sử dụng hệ thống của microsoft, và có thể kết hợp tất cả các server trên vào, với các ứng dụng có đa nền tảng, có thể trên môi trường iOS sử dụng ADM để push notification nhưng trên Android người quản lý muốn sử dụng GCM mà lại muốn quản lý chung cả notification cả 2 nền tảng trên 1 môi trường. Việc xử lý đó thật dễ dàng khi sử dụng ANH vào làm service push notification trên Android và thêm key của ADM vào đó

Các bước thực hiện

I. Cấu hình ứng dụng hỗ trợ GCM Service

Xem tại: https://viblo.asia/bac.ngoc.hoai/posts/3KbvZ11XGmWB

II. Cấu hình notify hub

  1. Đăng nhập Azure Portal và click +New góc trái màn hình
  2. Click New, sau đó vào Web + Mobile kéo xuống và chọn Notification Hub

alt

  1. Cài đặt chọn package cho ứng dụng muốn sử dụng dịch vụ

alt

  1. Tiếp tục sau khi tạo thành công

alt

  1. Sau đó vào Setting và chọn Access Policies lưu các chuỗi để sau sử dụng nó vào trong code

alt

  1. Tại đây chọn Notification Service và chọn Google (GCM). Nhập API Key ở bước I và Save

alt

Bạn đã cấu hình thành công để sử dụng dịch vụ của Azure Notification Hub, cùng kết nối với GCM để thực hiện đẩy notification

III. Tạo ứng dụng trên Android Studio

  1. Tạo ứng dụng mới và build với google play serice (gcm) trong build.gradle

alt

  1. Cấu hình 'meta-data' trong mainifest

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

  2. Add Azure Notification Hub Library vào ứng dụng

  • Tải notification-hubs-0.4.jar tại Notification-Hubs-Android-SDK on Bintray. Copy nó vào trong thư mục libs của Android Studio

  • Trong build.gradle add thư viện ANH vào Project

    compile 'com.microsoft.azure:azure-notifications-handler:[email protected]'

  • Và thêm thuộc tính maven của ANH vào build.gradle sau dependencies

repositories {
    maven {
            url "http://dl.bintray.com/microsoftazuremobile/SDK"
        }
    }
  • Khai báo Service ANH trong mainifest
<service android:name="<your package>.MyInstanceIDService" android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.gms.iid.InstanceID"/>
    </intent-filter>
</service>
  • Thêm service của GCM vào trong mainifest
<service
    android:name="com.example.microsoft.getstarted.RegistrationIntentService"
    android:exported="false">
</service>
  • Khai báo receiver để lắng nghe notification trả về từ 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>
  • Thêm các permission cần thiết cho ứng dụng
<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"/>
  • Đinh nghĩa NotificationSettings khai báo các id đã config trên GCM và ANH
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>";
}
  • Tạo MyInstanceIDService lắng nghe khi có service
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);
    }
};
  • Đăng ký và lưu trữ tocken id qua RegistrationIntentService
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);
        }
    }
}
  • Tại Main Activity NotificationManager khi nhận được message trả về từ service
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainActivity = this;
    NotificationsManager.handleNotifications(this, NotificationSettings.SenderId, MyHandler.class);
    registerWithNotificationHubs();
}

IV. Gửi notification

Truy cập vào Azure Port và thấy Troubleshooting như bên dưới

alt

  • Push notification thường được sử dụng các dịch vụ như Mobile Apps hoặc ASP.NET, ngoài ra cũng có thể viết API sử dụng các dụng vụ thông qua API được cung cấp sẵn từ Google, hoặc Amazon hay ANH

  • Code sample được viết post tại

Notification Hubs on Android


All Rights Reserved