07/09/2018, 16:15

Push notifications tới Android application từ Rails backend

Trong bài viết này, chúng ta sẽ tạo một ứng dụng Ruby on Rails gửi messages tới Android sử dụng Google Cloud Messaging(GCM). Chúng ta sẽ xây dựng ứng dụng đơn giản nhất có thể . Để bắt đầu đi vào xây dựng ứng dụng chúng ta nên tìm hiểu qua GCM documents. Tạo server key và client key cho GCM ...

google-cloud-messaging.jpg

Trong bài viết này, chúng ta sẽ tạo một ứng dụng Ruby on Rails gửi messages tới Android sử dụng Google Cloud Messaging(GCM). Chúng ta sẽ xây dựng ứng dụng đơn giản nhất có thể . Để bắt đầu đi vào xây dựng ứng dụng chúng ta nên tìm hiểu qua GCM documents.

Tạo server key và client key cho GCM

Đầu tiên chúng ta sẽ tạo Google Api Project. Sau khi thực hiện điều này chúng ta sẽ có:

  • project id: Định danh cho project Google Api
  • server key: Key cho ứng dụng server(RoR app)
  • client key: Key cho ứng dụng client(Android app)

Tạo Ruby on Rails server

Chúng ta sẽ tạo Ruby on Rails app cho phép tạo vào gửi một gcm message đến các thiết bị Android thông qua registration_id của Android app.

GCM là một gem được dùng để gửi thông báo từ server cho client trong Ruby. Ngoài những ưu điểm là dễ sử dụng, tính chính xác cao. GCM còn cũng cấp rất nhiều những tính năng mới mà không có ở những gem khác.

Tạo RoR server app

$ rails new gcm_server

Thêm gem gcm tới Gemfile

gem 'gcm'

Thực hiện bundle install để cài đặt gem gcm

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

require 'gcm'

module ApplicationHelper

  def send_message title, body, reg_tokens
    gcm = GCM.new("AIzaSyDj8o0B-plxM2SurQqQOG75OvKpiU4YaSE")

    registration_ids= reg_tokens

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

Tạo notifications controller cùng view thực hiện push notification tới Android app

rails generate controller notifications create
class NotificationsController < ApplicationController
  include ApplicationHelper

  def index

  end

  def create
    reg_tokens = User.pluck(:reg_token)
    send_message(params[:title], params[:body], reg_tokens)
    redirect_to notifications_path
  end
end
<div class="site-content" >
  <div class="entry">
    <div class="entry-meta">
      <h3>Send notification</h3>
    </div>

    <div class="entry-content">
      <%= form_tag notifications_path do %>

        <%= label_tag :reg_tokens %>
        <%= text_field_tag :reg_tokens, params[:reg_tokens] %>

        <%= label_tag :title %>
        <%= text_field_tag :title, params[:title] %>

        <%= label_tag :body %>
        <%= text_field_tag :body, params[:body] %>

        <%= submit_tag "Send", class: "btn btn-large btn-primary" %>
      <% end %>

    </div>
  </div>
</div>

Kết thúc RoR server app thực hiện start server

$ rails s

Tạo ứng dụng Android nhận notification

Google cloud message yêu cầu google play services > 3.1. Thêm google play services tới gradle dependency

compile 'com.google.android.gms:play-services:3.1.+'

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
    }
}

Android app sử dụng Google services do đó thiết bị phải được cài đặt google play services. Lần chạy đầu tiên kiểm tra Log để nhận được Registration Id của thiết bị

0