iOSアプリではユーザー退会時にユーザーデータを削除する要件があります(2022年06月30日より)。プライバシーに配慮した要件ですが、アプリ開発者にとっては追加の対応が求められます。
ニフクラ mobile backend(以下NCMB)を使っている場合、ユーザーの退会処理(物理削除)は簡単に行えます。しかし、ユーザーに関連したデータはどう削除したら良いでしょうか。
今回はMonacaやWebアプリケーションで、JavaScript SDKを使った関連データ削除方法を解説します。
ユーザーデータの削除
ユーザーデータを削除するのは簡単です。必ずログインした状態で行う必要があります。
const user = ncmb.User.getCurrentUser();
user.delete(); // ユーザー削除 = 退会
ただ、注意して欲しいのは ユーザーデータの削除は関連データをすべて削除してから
にして欲しいということです。ユーザー関連データを削除できる権限がユーザー自身に紐付いている場合、データを削除すると削除権限がなくなる可能性があります。
関連データの検索
ポインターの場合
大抵の場合、NCMBのポインター機能を使ってユーザーデータを紐付けているかと思います。そこで、データストアを検索して、そのユーザーに関連したデータだけを取得します。今回は例として、ユーザープロフィール UserProfile
クラスにあるデータを検索する例を紹介します。
const UserProfile = ncmb.DataStore('UserProfile');
const userProfiles = await UserProfile
.equalTo('user', {
__type: 'Pointer',
className: 'user',
objectId: user.objectId,
})
.fetchAll();
// 全削除
await Promise.all(userProfiles.map(u => u.delete());
ポイントは、ポインターを使っているカラムの検索です。 equalTo('user', user)
のようにしたくなりますが、これでは検索ができませんので注意してください。ポインターの形に合わせて検索を行うことで、該当ユーザーのデータだけを取得できます。後はすべて削除すれば良いでしょう。
リレーションの場合
関連データをポインターではなく、リレーションで保存している場合もあるかと思います。その場合は次のようになります。
const UserProfile = ncmb.DataStore('UserProfile');
// 関連データの検索
const userProfiles = await UserProfile
.relatedTo(user, 'user')
.fetchAll();
// 全削除
await Promise.all(userProfiles.map(u => u.delete());
注意点
UserProfileクラスに入っているデータの編集権限がユーザーにある場合のみ、削除可能です。権限がないと削除はできませんので注意してください。
デバイストークンの削除
Monacaアプリの場合、プッシュ通知を送信する際にデバイストークンを取得しているかも知れません。その場合、このデバイストークンも削除対象になります。
実装としては次のようになります。ncmb-push-monaca-pluginとJavaScript SDKの両方が必要です。
// ncmb-push-monaca-pluginによる処理
window.NCMB.monaca.getInstallationId(async (deviceToken) => {
// JavaScript SDKの処理
const installation = await ncmb.Installation
.equalTo('deviceToken', deviceToken)
.fetch();
// デバイストークン削除
await installation.delete();
});
ログアウトを行う
ユーザーデータを削除した後には忘れずにログアウトを行ってください。なお、この時SDKで提供されているログアウト処理は必ず失敗します。なぜならユーザーが存在しない状態になるとセッションが無効になるためです。
そのため、強制ログアウトが必要になります。これはlocalStorageの該当データ削除と、セッショントークンを空にすればOKです。
localStorage.removeItem(`NCMB/${ncmb.apikey}/currentUser`);
ncmb.sessionToken = null;
これでログアウト状態になり、ユーザーデータがすべてなくなった状態になります。
まとめ
今回は物理削除の例を紹介しました。論理削除の場合は別なやり方になるかと思いますので注意してください。