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 ...
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
- Đăng nhập Azure Portal và click +New góc trái màn hình
- Click New, sau đó vào Web + Mobile kéo xuống và chọn Notification Hub
- Cài đặt chọn package cho ứng dụng muốn sử dụng dịch vụ
- Tiếp tục sau khi tạo thành công
- Sau đó vào Setting và chọn Access Policies lưu các chuỗi để sau sử dụng nó vào trong code
- Tại đây chọn Notification Service và chọn Google (GCM). Nhập API Key ở bước I và Save
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
- Tạo ứng dụng mới và build với google play serice (gcm) trong build.gradle
Cấu hình 'meta-data' trong mainifest
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
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
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