Angular + ionic のアプリに Kii Cloudを利用したプッシュ通知の定期配信処理を実装してみた。

# はじめに
運用保守しているハイブリッドアプリに定期的にプッシュ通知配信する処理を実装しました。
その過程について記述していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293311/cc097e95-fe00-e5f2-e4b9-1f73ef5bf244.png" width="40%">

:::note
Angular とは？
:::
　　Googleが開発しているJavaScriptフレームワーク。
　　WEBアプリケーションの開発のために使用。
　　MVC・双方向データバインディングといった特徴がある。

:::note
ionic とは？
:::
　　Ionic FrameworkはオープンソースのUIツールキットで、
　　HTML、CSS、JavaScriptなどの<font color="blue">**ウェブ技術を使って**</font>、 高性能で高品質な
　　モバイルアプリやデスクトップアプリを作ることが可能。

:::note
Kii Cloud とは？
:::
　　Kii Cloud は Kii 株式会社が提供する MBaaS(Mobile Backend as a Service） のクラウドプラットフォーム。
　　今回はKii Cloud が提供するプッシュ機能を利用している。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293311/fedb8be5-2e52-f508-c8aa-baf6ad912a46.png" width="80%">
https://docs.kii.com/ja/starts/mobile-functions/push/
(※Kii ドキュメントから画像流用)

# 環境
```
　Angular           : 12.0.1
　ionic             : 5.6.9
　Cordova CLI       : 10.0.0
　Cordova Platforms : android 9.1.0 / iOS :6.2.0
　Node.js           : 16.0.0
```
# 結論
Kii Cloud を用いてハイブリッドアプリなどに定期的にプッシュ配信できる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293311/d1c06824-ec00-4321-927e-43f7e51f4042.png" width="90%">

# 手順
## 1 アプリにログインする際に KiiCloud へのユーザ作成処理 / ログイン処理を実装
・Kii REST APIをアプリ側から実行する(Kiiに端末を登録)
```
KiiCloudログインAPI:
https://api-jp.kii.com/api/apps/ {APP_ID} /oauth2/token

プッシュ通知用登録API:
https://api-jp.kii.com/api/apps/ {APP_ID} /installations
```
KiiCloud側にアカウントが作成される
※(APP_IDは KiiCloldのアカウントID)

https://docs.kii.com/ja/guides/cloudsdk/rest/managing-users/login/

#### Angular + ionic  サンプルコード
　　(ハイブリッドアプリなので、1ソース[ Typescript ]で iOS Androidへ実装内容が反映)
```typescript:kii-api.service.ts
  /**
   * Kii REST API を実行
   */
   KiiPushApi = <T>(
    body: string,     // ログイン情報格納  (usernameとpassword)
    headers: HttpHeaders,
    params?: HttpParams
  ): Observable<T> => {

	// パス情報
    const url = `https://api-jp.kii.com/api/apps/ {APP_ID} /oauth2/token`;

    // オプション情報
    const options = {};

    // ヘッダー情報
    headers = headers.set('X-Kii-AppID', { KiiCloudのID });
    headers = headers.set('X-Kii-AppKey', { KiiCloudのAPP_KEY });
    options.headers = headers;

    // リクエストにヘッダー情報を含める設定
    options.observe = 'response';

    const ob = new Observable<T>(observer => {
      this.httpClient
        .post(url, body, options)
        .subscribe(
          this.success(observer, 'POST'),
          this.failure(observer, 'POST')
        );
    });
    return ob;
  };
```

## 2  KiiCloud拡張機能 <font color="red">**[ServerCode]**</font> にプッシュ配信の処理を実装
https://docs.kii.com/ja/guides/serverextension/function/


・トピックの購読処理
 対象ユーザーのTOPICに指定したユーザーが送信できる権限[SEND_MESSAGE_TO_TOPIC]を付与する

https://docs.kii.com/ja/guides/cloudsdk/rest/securing-data/topic/settings-topic-acl/#:~:text=%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%81%AE%E8%AC%9B%E8%AA%AD%E3%80%82-,SEND_MESSAGE_TO_TOPIC,-%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5

・プッシュ通知処理
　講読されたトピックにメッセージが送信されたとき、そのユーザーのデバイスに対してプッシュ通知が送信されます。

https://docs.kii.com/ja/guides/cloudsdk/ios/managing-push-notification/push-overview/push-kiicloud/

##  3  WEB側にcron処理を実装　
・KiiCloudへのログインを実施
・対象データの件数分、以下のServerCodeの処理をリクエストする
```
https://api-jp.kii.com/api/apps/{APP_ID}/server-code/versions/current/ {プッシュ送信関数名}
```
##  4  プッシュ通知イメージ (Android実機)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293311/0d47127a-7c43-43a9-981d-12e168c115f2.png" width="30%">

iOS / Androidに定期的にプッシュ通知が配信されるようになりました！

# おわりに
コミュニケーションサービスなどにおいてエンドユーザ様からの返信などにいち早く気付けることは大事なので、
プッシュ通知を配信し、お知らせやリマインドできることは強み。

WEBサービスではメール配信などでしかアラートできない部分を、
アプリを使用することで情報を早くキャッチアップできる、取りこぼしを防止できる部分などを今後も機能として取り入れていきたいと思います。

# 参考資料
##### KiiCloud
https://docs.kii.com/ja/starts/kiicloud/

https://docs.kii.com/ja/guides/cloudsdk/rest/managing-users/login/

https://docs.kii.com/ja/guides/serverextension/function/

https://docs.kii.com/ja/guides/cloudsdk/rest/securing-data/topic/settings-topic-acl/		
##### Angular
https://angular.jp/

https://qiita.com/NS19960207/items/961ddfa32bd1faa43b80
##### ionic
https://ionicframework.com/docs/ja/