Parse Server Java SDKの使い方（Kotlinでのプッシュ通知操作）

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

Parse ServerではAndroid向けにSDKを提供していますが、言語はJavaのみとなっています。Kotlin向けには、Java SDKの内容を翻訳しながら実装する必要があります。そこで、各機能の使い方を解説します。今回はプッシュ通知の使い方です。

## Android SDKのインストール

Android SDKのインストールは幾つかの設定が必要です。

### settings.gradleの修正

プロジェクトルートにある `settings.gradle` を修正します。

```groovy
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
				// 以下を追加
        maven {
            url "https://jitpack.io"
        }
    }
}
```

### app/build.gradleの修正

app以下にある `build.gradle` を修正します。

```groovy
dependencies {
	// 以下を追加
	implementation "com.github.parse-community.Parse-SDK-Android:parse:4.2.1"
}
```

バージョンはインストールするタイミングによって異なりますが、現在は以下です。

![](https://jitpack.io/v/parse-community/Parse-SDK-Android.svg)

### AndroidManifest.xmlの修正

開発中で、ローカルのParse Serverを使う場合には、以下の設定が必要です。

```xml
<application
	android:usesCleartextTraffic="true" <!-- 追加 -->
>
```

## 初期化

SDKの初期化は `MainActivity` にて行います。Androidはエミュレーターなので、 `localhost:1337` ではなく、 `192.168.0.2:1337` などがParse ServerのURLになるでしょう。

```kotlin
import com.parse.Parse

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Parse.initialize(
            Parse.Configuration.Builder(this)
                .applicationId("appId")
                .clientKey("clientKey")
                .server("http://your_parse_server/parse/")
                .build()
        )
				// 省略
		}
}
```

## プッシュ通知の設定

プッシュ通知を送信するためには、Parse Serverの初期化時に `push` キーの指定が必要です。

```js
push: {
  android: {
    apiKey: '' // FCMのサーバーAPIキー
  },
}
```

## デバイストークンの取得

デバイストークンは、以下のようにしてParse Serverに設定します。同期、非同期のメソッドが用意されています。

```kotlin
// 非同期
ParseInstallation.getCurrentInstallation().saveInBackground();

// 同期
ParseInstallation.getCurrentInstallation().save();
```

保存されるデータは以下の通りです。ほとんどの項目が読み取り専用になっています。

| 項目             | 読み取り専用 | 説明                                                                                                                                                                                                                                                                                                  |
| ---------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| installationId   | ○            | Parseが使用するデバイスの一意のID                                                                                                                                                                                                                                                                     |
| deviceType       | ○            | デバイスのタイプ。"ios"、"osx"、"android"、"winrt"、"winphone"、"dotnet"、"embedded"のいずれか。Androidデバイスでは、このフィールドは"android"に設定されます                                                                                                                                          |
| pushType         | ○            | Parseが使用するプッシュ配信ネットワークを指定するためのフィールド。デバイスがFCM経由でプッシュを受信するように登録されている場合、このフィールドは"gcm"とマークされます。Google Playサービスが利用できない場合、このフィールドは空白になります                                                        |
| deviceToken      | ○            | FCMが登録IDを追跡するために使用するトークン。                                                                                                                                                                                                                                                         |
| appName          | ○            | このインストールが属するクライアントアプリケーションの表示名。この値は、デバイスからParseInstallationオブジェクトが保存されるたびに同期されます                                                                                                                                                       |
| appVersion       | ○            | このインストールが属するクライアントアプリケーションのバージョン文字列。この値は、デバイスからParseInstallationオブジェクトが保存されるたびに同期されます                                                                                                                                             |
| parseVersion     | ○            | このインストールが使用するParse SDKのバージョン。この値は、デバイスからParseInstallationオブジェクトが保存されるたびに同期されます                                                                                                                                                                    |
| timeZone         | ○            | ターゲットデバイスが現在位置しているタイムゾーン。この値は、デバイスからParseInstallationオブジェクトが保存されるたびに同期されます                                                                                                                                                                   |
| localeIdentifier | ○            | デバイスのロケール識別子。形式は[言語コード]-[国コード]。言語コードはISO 639-1で定義されている2文字の小文字のISO言語コード（例："en"）。国コードはISO 3166-1で定義されている2文字の大文字のISO国コード（例："US"）。この値は、デバイスからParseInstallationオブジェクトが保存されるたびに同期されます |
| badge            |              | iOSアプリのアイコンバッジの現在の値。サーバー上でこの値が変更されると、将来のバッジ増分プッシュ通知に使用されます                                                                                                                                                                                     |
| channelUris      | ○            | WindowsデバイスのためのMicrosoftが生成したプッシュURI                                                                                                                                                                                                                                                 |
| appIdentifier    | ○            | このインストールのクライアントアプリケーションの一意の識別子。このパラメータはAndroidではサポートされていません                                                                                                                                                                                       |

## 購読

購読はチャンネル名を指定して、 `subscribeInBackground` メソッドを使用します。これは非同期処理のみです。

```kotlin
ParsePush.subscribeInBackground("Giants");
```

## 購読停止

購読停止はチャンネル名を指定して、 `unsubscribeInBackground` メソッドを使用します。これも非同期処理のみです。

```kotlin
ParsePush.unsubscribeInBackground("Giants");
```

## 購読しているチャンネル一覧

購読しているチャンネル一覧は、 以下のようにして取得できます。

```kotlin
val subscribedChannels = ParseInstallation.getCurrentInstallation().getList<String>("channels")
```

## プッシュ通知の作成

プッシュ通知は、以下のようにして作成できます。なお、Parse Serverの設定として、アプリからのプッシュ通知作成を許可している必要があります。


```kotlin
val push = ParsePush()
push.setChannel("Giants")
push.setMessage("The Giants just scored! It's now 2-2 against the Mets.")
push.sendInBackground()
```

複数のチャンネルに送信もできます。

```kotlin
val channels = LinkedList<String>()
channels.add("Giants")
channels.add("Mets")

val push = ParsePush()
push.setChannels(channels)

push.setMessage("The Giants won against the Mets 2-3.")
push.sendInBackground()
```

## デバイストークンの情報を更新する

デバイストークンのオブジェクトはParseObjectを継承しているので、通常のオブジェクトと同じように扱えます。

```kotlin
val installation = ParseInstallation.getCurrentInstallation()
installation.put("scores", true)
installation.put("gameResults", true)
installation.put("injuryReports", true)
installation.saveInBackground()
```

## ユーザー情報をデバイストークンに紐付ける

デバイストークンにユーザー情報を紐付ける場合には、ログインユーザー情報を `put` メソッドで設定します。

```kotlin
val installation = ParseInstallation.getCurrentInstallation()
installation.put("user", ParseUser.getCurrentUser())
installation.saveInBackground()
```

## クエリを使ったプッシュ通知

ParseQueryを使うことで、絞り込み条件を伴ったプッシュ通知を作成できます。

```kotlin
val pushQuery: ParseQuery<ParseInstallation> = ParseInstallation.getQuery()
pushQuery.whereEqualTo("channels", "Giants")
pushQuery.whereEqualTo("scores", true)
val push = ParsePush()
push.setQuery(pushQuery)
push.setMessage("Giants scored against the A's! It's now 2-2.")
push.sendInBackground()
```

## まとめ

Parse Serverのプッシュ通知の実装はとても簡単です。NCMBと比べてもほとんど変わらないでしょう。また、プッシュ通知は管理画面でビジュアル的に作成できるので、それも便利です。

データの管理方法などはParse ServerとNCMBで似ています。他のmBaaSと比べると、全体の修正量はそこまで多くないと思われます。載せ替え先として検討に挙げてください。

[Android Developers Guide \| Parse](https://docs.parseplatform.org/android/guide/#push-notifications)