0

Phpfox và gửi notification đến Android và iOs (Phần 1)

Như ở bài này thì chúng ta đều biết Phpfox là 1 platform mạng xã hội, như với các mạng xã hội mà chúng ta đều biết rõ như Facebook, Google plus, ta đều thấy ngoài trang web thì đều phát triển thêm về các ứng dụng sử dụng trên Android và iOs. Thì Phpfox cũng vậy, chúng ta có thể tạo API để cho việc tạo ứng cho cho 2 dòng thiết bị là Android và iOs. Trong nhiều điều cần làm trong mạng xã hội thì có 1 chức năng khá là cần thiết đó là làm notification cho các thiết bị, như là 1 ai đó lilke, comment vào các bài viết hoặc các phần thì sẽ có thông báo lên thiết bị. Hôm nay chúng ta sẽ cùng tìm hiểu cách hoạt động của chức năng này. Để gửi các thông báo lên các thiết bị ta cần đi qua các serivce trung gian như với Android là GCM (Google Cloud Message) nhưng hiện giờ đã được đổi sang 1 version mới là FCM (Firebase Cloud Message). Trong bài viết này mình vẫn đi theo hướng GCM, khi có dịp sẽ thử tìm hiểu FCM sau. Còn với iOs thì sẽ thông qua 1 dịch vụ đó là APNs (Apple Push Notification services). Để hình dung rõ hơn về hoạt động service này thì các bạn có thể xem qua hình sau mình lấy bên trang APNs Theo như hình ở đây thì để gửi các thông báo đến các thiết bị thì từ các dịch vụ khác như website, ... sẽ gửi thông tin đến service trung gian này, tại đây service trung gian sẽ xác định rõ thiết bị mà bạn gửi đến và thông tin cũng như nội dung truyền tải. Như vậy để sử dụng được việc gửi thông báo đến các thiết bị ta cần làm rõ các bước:

  • Xác định được rõ là gửi từ ứng dụng nào.
  • Xác định được là gửi đến thiết bị nào.
  • Gửi thông tin đi như thế nào.
  • Và các thiệt bị nhận thông tin sẽ xử lý như thế nào. Trong bài viết này tôi sẽ chỉ hướng dẫn các bạn nhiều hơn về Android còn về iOs do hạn chế thiết bị tôi chỉ chia sẻ phần nào đó tôi biết được.

Đăng ký ứng dụng gửi notification

Đăng ký GCM

Để sử dụng được gửi notification đến thiết bị Android ta cần có 1 tài khoản Gmail (Tạo hoàn toàn miễn phí) sau đó vào trang develop của Google rồi các bạn tạo 1 app riêng cho việc sử dụng notificaiton, Sau khi tạo xong 1 app thì các bạn có thể vào phần Enable Api (Phần này có thể thay đổi theo thời gian do Google cập nhật liên tục). Sau đó các bạn tìm đên dịch vụ GCM, rồi chọn phần public access, Sau khi kích hoạt thì sẽ cung cấp cho ta 2 key là public key với private key. Dựa vào 2 key này sẽ xác định được app nào gửi notification đến cũng như xác định được rõ thiết bị mà ta cần gửi thông báo đến.

Đăng ký APNs

Chúng ta vào trang develop của Apple, sau đó dùng tài khoản develop rồi tạo app cho iOs, sau khi tạo app thì sẽ sinh ra 2 file .pem. Đây là 2 file mã hóa cho việc xác định rõ việc gửi từ app nào đến di động. Tại thời điểm tôi biết thì trong 2 file .pem này có 1 file dùng cho sandbox và 1 file cho bản chính thức. Vậy sự khác nhau giữa 2 file nào là như thế nào? Ở bản sandbox bạn có thể dụng được gửi notification cho những app mà được biên dịch từ máy Apple của bạn để kiểm tra, còn khi đưa lên App Store thì ta phải dụng file pem của Production. Đó là sự khác nhau duy nhất mà kiến thức bản thân mình biết được.

Vậy là sau khi đăng ký 2 dịch vụ trên ta đã có những phần mã hóa cho việc sử dụng gửi thông tin.

Đăng ký thiết bị nhận thông báo

Với thiết bị Anroid

Sau khi tao có 2 key đã đăng ký ở trên, bên lập trình Android (Tôi sẽ trình bày sau) sẽ tạo ra 1 key riêng cho từng thiết bị, mỗi thiết bị sẽ tạo ra 1 key riêng dựa vào public key và private key đã được tạo ra khi lấy từ develop của Google. Trong quá trình làm của bản thân (cũng khá lâu rồi), tôi thấy Android tạo ra key trên cùng 1 máy lại khác nhau sau mỗi lần cài lại app, hi vọng vấn đề này đã được xử lý vì đôi khi vì như vậy mà trong 1 máy tôi nhận được 2 lần gửi thông báo (haiz).

Xử lý bên Phpfox để lấy thông tin thiết bị nhận thông báo

Trong Phpfox thì việc gửi thông báo là chỉ dành cho các thành viên đã đăng nhập, do vậy khi nào đăng nhập thành công thì phía bên ứng dụng sẽ gửi ngoài thông tin đăng nhập thì sẽ cần gửi thêm cả key được sinh ra khi sử dụng GCM (Phần này tôi sẽ trình bày rõ hơn khi làm về Android). Như vậy ta cần tiếp nhận key sinh ra để gửi notification từ app Androi. Và sẽ được lưu vào 1 bảng riêng, vì 1 user có thể dùng cả thiết bị Android hay iOs do vậy ta sẽ tạo các bảng riêng cho việc lưu các key này. Vậy ta sẽ tạo các bảng này khi cài đặt 1 module mới vào Phpfox và bảng đó như sau:

$aSql = array(
                "DROP TABLE IF EXISTS `". Phpfox::getT('accountapi_user'). "`",
				
				"CREATE TABLE `". Phpfox::getT('accountapi_user'). "` (
				  `id` int(11) NOT NULL AUTO_INCREMENT,
				  `user_id` int(11) DEFAULT NULL,
				  `cloud_id` varchar(50) DEFAULT NULL,
				  `timestamp` int(11) DEFAULT NULL,
				  PRIMARY KEY (`id`)
				)",

                "DROP TABLE IF EXISTS `" . Phpfox::getT('accountapi_gcm_user') . "`",
                "CREATE TABLE IF NOT EXISTS `" . Phpfox::getT('accountapi_gcm_user') . "` (
                  `id` int(11) NOT NULL AUTO_INCREMENT,
                  `gcm_regid` text,
                  `user_id` int(11) DEFAULT NULL,
                  `email` varchar(255) NOT NULL,
                  `timestamp` int(11) DEFAULT NULL,
                  PRIMARY KEY (`id`)
                )",

                "DROP TABLE IF EXISTS `" . Phpfox::getT('accountapi_apns_user') . "`",
                "CREATE TABLE IF NOT EXISTS `" . Phpfox::getT('accountapi_apns_user') . "` (
                  `id` int(11) NOT NULL AUTO_INCREMENT,
                  `token` text,
                  `user_id` int(11) DEFAULT NULL,
                  `email` varchar(255) NOT NULL,
                  `timestamp` int(11) DEFAULT NULL,
                  PRIMARY KEY (`id`)
                )",

Nhìn qua đây ta có thể thấy rõ, ta sẽ tạo 3 bảng, 1 bảng thông tin của user cũng như api liên quan, 1 bảng lưu key của thiết bị android cũng như 1 bảng lưu thông tin thiết bị iOs. Để lưu thông tin này ta sử dụng 2 hàm để lưu GCM cũng như APNs:

/**
     * register gcm
     */
    public function registergcm() {
        //get email
        $sEmail = $this->_oApi->get('email');
        //get user id
        $iUserId = (int) $this->_oApi->get('userId');
        //get gcm reg id
        $sRegId = $this->_oApi->get('regId');

        if(!empty($sEmail) && !empty($iUserId) && !empty($sRegId)) {
            Phpfox::getService('accountapi.gcm')->storeGCMUser($sEmail, $sRegId, $iUserId);
            return array('registerGCM' => 'success');
        }

        return array('registerGCM' => 'fail');
    }

    /**
     * Register Apple push notification service
     */
    public function registerAPNS() {
        $sEmail = $this->_oApi->get('email');
        //get user id
        $iUserId = (int) $this->_oApi->get('userId');
        //get apns reg id
        $sToken = $this->_oApi->get('token_apns');

        if(!empty($sEmail) && !empty($iUserId) && !empty($sToken)) {
            Phpfox::getService('accountapi.apns')->storeAPNSUser($sEmail, $sToken, $iUserId);
            return array('APNS' => 'success');
        }

        return array('APNS' => 'fail');
    }

Sau khi đăng nhập thành công, để lưu thông tin cũng như để biết user đang đăng nhập từ thiết bị là user nào thì ta cần tạo 1 key để gửi lại cho thiết bị. Phpfox hỗ trợ mã hóa cho phần này do vậy ta sử dụng lại phần mã hóa đó, nó sẽ sinh ra 2 key, publickey và private key và Phpfox sẽ gửi lại public key cho bên thiết bị :

public function checkKey($sAppId, $aUser) {
        $oServiceAccountapiCore = Phpfox::getService('accountapi.core');
        $oServiceAccountapi = Phpfox::getService('accountapi');
		$oServiceAccountapi->setThrough(1);
		$aApp = $oServiceAccountapi->getAppById($sAppId, $aUser['user_id']);

        if (empty($aApp['is_installed'])) {
            $oServiceAccountapi->install($aApp['app_id'], $aUser['user_id'], array());
        }

        $sKey = $oServiceAccountapi->getKey($aApp['app_id'], $aUser);
        $aKey = json_decode(Phpfox::getService('api')->createToken($sKey), true);
        $this->database()->update(Phpfox::getT('log_session'), array('user_id' => $aUser['user_id']), 'session_hash = \'' .Phpfox::getLib('session')->get('session') .'\'');
        $aKey['user_id'] = $aUser['user_id'];

        Phpfox::getService('user.auth')->setUser($aUser);

        $aKey['phrases'] = $oServiceAccountapiCore->getPhrases($aUser['language_id']);

        if(Phpfox::getParam('accountapi.admob_publish_key') && Phpfox::getUserParam('accountapi.can_see_ads')) {
            $aKey['key_admob'] = Phpfox::getParam('accountapi.admob_publish_key');
        }

        if (Phpfox::isModule('messenger') && Phpfox::getParam('messenger.key')) {
            $aKey['chat_server_key'] = Phpfox::getParam('messenger.key');
            $aKey['chat_server_secret'] = Phpfox::getParam('messenger.secret');
            $aKey['chat_server_url'] = Phpfox::getParam('messenger.api_url');
            $aKey['apns_token'] = Phpfox::getService('accountapi.apns')->getAPNSToken($aUser['user_id']);
        }

        $aKey['enable_check_in'] = false;
        if (Phpfox::getParam('feed.enable_check_in')) {
            $aKey['enable_check_in'] = Phpfox::getParam('feed.enable_check_in');
        }

        $aKey['google_key'] = Phpfox::getParam('accountapi.gcm_api_key');

		return $aKey;
	}
    ```
    Vây sau khi đăng nhập xong, Phpfox sẽ kiểm tra thông tin user nếu có thông tin rồi sẽ gửi lại key, nếu không sẽ tạo key mơi gửi lại cho thiết bị, Từ sau thiết bị chỉ cần gửi lại key này ta sẽ biết được user nào đang đăng nhập ở thiết bị đó.
    Vậy ta đã xác định được thiết bị cũng như user nào đăng nhập ở thiêt bị đó. Bài sau chúng ta sẽ đi rõ hơn gửi thông tin từ Phpfox lên và bên thiết bị sẽ xử lý như thế nào.




All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí