SAP CP Mobile Services (Cloud Foundry) のPush通知APIを叩いてみた

# はじめに

この記事は[「SAP S/4HANAで購買発注が登録されるたびiPhoneに「アイーン」とPush通知が来たらぜったいどきどきしちゃう」シリーズ](https://qiita.com/monamona/items/0e4c38ce315282e73b96)の2つ目の記事です。

## 前回までの実装

[前回の記事](https://qiita.com/monamona/items/a1b065ca245aa5d8b2be)では、「SAP S/4HANAで伝票登録されたら「あい〜〜ん」Push通知が来たらぜったいどきどきしちゃう」という奇特な業務ユーザからの要望をかなえるべく、SAP Cloud Platform (Cloud Foundry) Mobile Servicesから「アイーン」というPush通知を受け取れるiOSアプリを構築してみました。

このアプリをS/4HANAのプロセスと統合するためには、なにはともあれAPIを活用してこの「アイーン」通知機能を呼び出すことが必要になります。

そこで今回は、**Mobile Servicesの[Push API](https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/9252ba82338947fc9bd699b0465d15cc.html)を活用して**iPhoneアプリに「アイーン」通知を送ってみようと思います。

## 今回の目標

今回の記事のゴールは、PostmanからMobile ServicesのAPIを叩いてPush通知リクエストを送り、「アイーン」通知をiPhoneアプリで受け取ることです。
<img width="997" alt="スクリーンショット 2020-02-11 22.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/9dca3e02-6995-9ea9-232f-6faa445f9aed.png">


# 前提条件

## 開発実行環境
- フロントエンド実行環境: iPhone11 pro iOS 13.3
- フロントエンド開発環境: macOS Mojave 10.14.6 / Xcode 11.3 ※ Apple Developer Account(有料)を取得していること。
- バックエンド開発実行環境: SAP S/4HANA 1809
- クラウド開発実行環境: SAP Cloud Platform (Cloud Foundry trial account) ※ 無料
    - Mobile Services
    - Integration Service

## 事前手順

[前回の記事](https://qiita.com/monamona/items/a1b065ca245aa5d8b2be)と同様の手順でPush Notification関連設定を済ませたiOSアプリケーションをMobile Servicesを活用して構築済みであること。


# 構築手順

それでは構築を始めていきましょう。
前回の記事ですでにだいたい作っているので、実は手順は（答えが分かってさえいれば）大したことありません。

## 権限設定

前回の記事での権限設定（Role Collection `MobileServiceNotification`の割当）をしたと思うのですが、年末に仕様変更があったのかこの権限が出てこなくなっていたので（うーん）、自分でRole Collectionを作って割り当てることにしましょう。

SAP Cloud Platform Cockpitの"Security" > "Role Collection" > "New Role Collection"ボタンより、
名前はなんでもいいのですが`Mobile_Notification`というRole Collectionを作成しました。

作成したRolle Collectionの名前をクリックします。
<img width="1389" alt="スクリーンショット 2020-02-08 16.16.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/a8239650-304e-cd5e-f0fa-4d8175f185c4.png">

"Add Role"ボタンを押してRoleを紐づけていきます。
<img width="1338" alt="スクリーンショット 2020-02-08 16.18.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/4d90e7d6-1ade-0322-db10-7d9b631a8f31.png">

場合によっては様々なApplication Identifierが選択可能だと思われますが、Mobile Servicesの[アプリケーションインスタンスを作成](https://qiita.com/monamona/items/a1b065ca245aa5d8b2be#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E7%94%9F%E6%88%90)したときに命名したインスタンスの名称を含んでいるApplication Identifier配下のRoleを紐づけていきます。

<img width="1331" alt="スクリーンショット 2020-02-08 16.24.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/94c0448a-2dfa-a053-2397-b0dbf52bdae7.png">

（今回はとりあえず疎通できるようにしたかったのでApplication Identifier配下のRoleを全部紐づけてしまいましたが、本当はきちんと選択する必要がありますね。）

最後に、"Security" > "Trust Configuration" > "SAP ID Service" にて、
対象のユーザのメールアドレスを入力して"Assign Role Collection"ボタンを押下し、Role Collectionを紐づけます。

<img width="1338" alt="スクリーンショット 2020-02-09 8.56.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/76dbadb7-28c1-93f6-dbc5-9bbca445f1c2.png">
<img width="1338" alt="スクリーンショット 2020-02-09 8.58.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/9a8fd329-a76e-275e-f7a5-b401329fc8a8.png">


## API仕様の確認

### Mobile ServicesのPush通知関連APIの種類

SAPのAPIのリファレンスといえばもちろん[SAP API Business Hub](https://api.sap.com/)です。
まずこちらを見るのが王道であると思われるので検索してみると、確かに[Remote Push Notification API](https://api.sap.com/api/mob_PushRuntimeAndAdminV1/resource)と呼ばれるAPIのリファレンスが存在しています。

ところがCloud Foundry環境のMobile Servicesのヘルプドキュメントを見てみると、似て非なるPush API情報（[Native Push Notification for Backend](https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/9252ba82338947fc9bd699b0465d15cc.html)）が記載されています。

迷わしいですが、SAP API Business Hubの情報がNeo環境のサービス向けなのかCloud Foundry環境のサービス向けなのか判然としなかったので、Cloud Foundryを前提としたHelpドキュメントに載っている[Native Push Notification for Backend](https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/9252ba82338947fc9bd699b0465d15cc.html)の方を参照することにしました（その結果疎通しました）。

APIをぜんぶ動確する元気はなかったので、この辺りのしゃっきりした情報をお持ちの方はぜひ教えてください。。

### APIエンドポイント

上記のドキュメントを参照し、下記の比較的シンプルなエンドポイント（通知先のユーザもデバイスも指定しない）を用いることにします。
`https://<mobile services host>/restnotification/application/<applicationId>`

今回は一人遊びで実装しているので気にしないことにしますが、エンドポイントやパラメータによって通知先のユーザやデバイスを個別に指定することもできるようです。興味のある方はぜひ[Help ドキュメント](https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/aaec2dbe78ec4fc08ef0a605a899e3dd.html)をご確認ください。

### APIホスト

Mobile ServicesのAPIのホストが分からなくてずっと泣いていたのですが、結論としては下記のように作ることができるようです。
`https://<subaccount name>-<space name>-<mobile app instance name>.cfapps.eu10.hana.ondemand.com`

今回でいえばおよそ下記のような感じです。
`https://s0099999999trial-dev-mobileaiiiiin.cfapps.eu10.hana.ondemand.com`

### APIリクエストbody

[Native Push Notification for Backend](https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/9252ba82338947fc9bd699b0465d15cc.html)は、その名の通りさまざまなNative通知サービスの仕様に対応できるよう、かなり柔軟に色々なパラメータをbodyに設定することができます。

今回はiOSの通知なので、APNs(Apple Push Notification Service)と呼ばれる通知の仕様に合わせたパラメータを設定してあげると、iOSっぽい通知の情報を設定することができます。

[SAPのドキュメント]
(https://help.sap.com/viewer/468990a67780424a9e66eb096d4345bb/Cloud/en-US/1a74d910d7634a43bb53a37a5060d429.html)と[Appleのドキュメント](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification)などを参考にしてbodyの中身を決めていきました（具体的な設定値は次のセクション参照）。

## APIの動作確認

それでは上記の情報を元に、下記の設定内容でPostmanからAPIを叩いてみましょう！

### 設定内容

**Method:** POST

**Request URL:**
`https://s0099999999trial-dev-mobileaiiiiin.cfapps.eu10.hana.ondemand.com/restnotification/application/mobileaiiiiin`

**Authorization:**

|                  |設定値              | 
|:-----------------|:----------------- |
| TYPE             |Basic              |
| Username         |SAP Cloud Platformユーザのログインメールアドレス|
| Password         |SAP Cloud Platformユーザのログインパスワード   |

**Headers:**

|                  |設定値              | 
|:-----------------|:----------------- |
| `Content-Type`   |`application/json` |


**Body:**

```
{
    "alert": "{\"title\": \"あい〜〜〜〜〜ん\",\"body\" : \"ドリフ大爆笑DVDの〇〇〇〇伝票(999999999999)が登録されました！\"}",
    "badge": 1,
    "sound": "sumikko_aiiiin.aiff"
}
```
※ 通知のSoundをカスタムしたい場合、XCode側での設定が必要ですが、今回の記事では手順の紹介を割愛します。

### 叩いてみた

"Send"ボタンを押すと……
<img width="1068" alt="スクリーンショット 2020-02-09 9.58.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/b035830e-74c9-d2b1-82d9-c1e0afa0d8cb.png">

あい〜〜〜〜〜ん
<img width="375" alt="IMG_0354.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/1d2f028c-be43-6c9a-dd52-d8b40ec7204e.png">



# 次回は・・・

というわけで、Mobile ServicesのPush通知APIをじょうずに使うことができました！

次回以降の記事にて、このAPIをSAP Cloud Platform Integration ServiceのIntegration Flowから呼び出せるようにしていきたいと思います。