12/08/2018, 14:43

Gửi thông báo tới ứng dụng di động từ Rails server bằng Firebase Cloud Message

Trên trang viblo và một số diễn đàn đã có một vài bài viết hướng dẫn sữ dụng FCM, tuy nhiên các bài viết còn chưa cụ thế và rời rạc, rất khó cho những người mới bắt đầu tìm hiểu, nên trong bài viết này, mình xin tổng hợp lại một số bài viết để có một bài hướng dẫn chi tiết về gửi thông báo từ ...

Trên trang viblo và một số diễn đàn đã có một vài bài viết hướng dẫn sữ dụng FCM, tuy nhiên các bài viết còn chưa cụ thế và rời rạc, rất khó cho những người mới bắt đầu tìm hiểu, nên trong bài viết này, mình xin tổng hợp lại một số bài viết để có một bài hướng dẫn chi tiết về gửi thông báo từ Rails server tới ứng dụng Android, hi vọng sẽ có ích cho những bạn có ý định sữ dụng FCM ^^

1. Client Android

Vào https://console.firebase.google.com để tạo một Project

Chọn add Firebase to your Android app:

Copy Package bên Project Android vào package name:

Tải file google_services.json, và lưu vào bên trong thư mục app:

Sao chép các cấu hình vào Projecttheo hướng dẫn rồi nhấn Finish:

Manage Project:

Chọn tab CLOUD MESSAGEING:

Các bạn chú ý Server Key để sau này sữ dụng trong Rails server

Code Demo Android:

Khởi tạo Manifest.xml với receiver, service để nhận notification:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.mateuyabar.gcmsampleclient.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<application >
  ...
  <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" />

          <category android:name="com.freedom.augmentedreality" />
      </intent-filter>
  </receiver>

  <service
    android:name=".gcm.MyGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
  </service>
  ...
</application>

Tạo MyGcmListenerService class nhận messages và hiển thị notification khi nhận được messages:

public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";

    @Override
    public void onMessageReceived(String from, Bundle data) {
        String title = data.getString("title");
        String body = data.getString("body");
        sendNotification(title, body);
    }

    private void sendNotification(String title, String body) {

        NotificationManager notificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_menu_gallery)
                .setContentTitle(title)
                .setContentText(body)
                .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
        notificationManager.notify(1, mBuilder.build());

    }
}

Để gửi messages tới Android app cần reg_tokens của thiết bị, chúng ta sẽ tạo RegistrationIntentService class để lấy reg_tokens của thiết bị

public class RegistrationIntentService extends IntentService {

    private static final String TAG = "RegIntentService";
    private static final String[] TOPICS = {"global"};
    private String token = "";
    public RegistrationIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        try {

            InstanceID instanceID = InstanceID.getInstance(this);
            token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

            Log.i(TAG, "GCM Registration Token: " + token);

            sendRegistrationToServer(token);

        } catch (Exception e) {
            Log.d(TAG, "Failed to complete token refresh", e);

        }
        Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE);
        registrationComplete.putExtra("reg_token", token);
        LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
    }

    private void sendRegistrationToServer(String token) {
        // Send token to server
    }
}

Lần chạy đầu tiên kiểm tra Log để nhận được Registration Id của thiết bị

2. Rails server

Thêm gem "fcm" như các gem khác

Tạo function send_message helper thực hiện gửi message tới Android thông qua reg_tokens

require 'fcm'

module ApplicationHelper

  def send_message title, body, reg_tokens
    fcm = FCM.new("YOUR_SERVER_KEY")

    registration_ids= reg_tokens

    options = { :data => { :title => title, :body => body } }
    response = fcm.send(registration_ids, options)
  end
end

YOUR_SERVER_KEY: bạn thay bằng server key lấy ở bước trên reg_tokens là ** Registration Id** của thiết bị android Gọi function send_message mỗi khi muốn gửi thông báo tới client android

Bài viết này mình tổng hợp từ các bài viết đã có, các bạn có thể tham khảo thêm: https://duythanhcse.wordpress.com/2016/08/11/bai-72-hoc-firebase-cloud-messagefcm/ https://viblo.asia/phannh_58/posts/APqzeaAVzVe https://viblo.asia/bui.xuan.hien/posts/bxjeZYJXGJZ

0