障害内容
Ionic v3で作成されたAndroidアプリで、「電話の発信と管理を許可しますか?」と表示されるモーダルで「許可しない」を選択したユーザーの、端末識別ID(Unique Device ID)を取得できないエラーが発生した。
環境
- cordova (Cordova CLI) : 8.0.0
- Ionic Framework : ionic-angular 3.9.5
- Android 9.0
原因
端末識別ID(Unique Device ID)を取得するのに使用しているCordovaプラグインであるUniqueDeviceIDが、電話の発信と管理を許可していないユーザーに対応していないのが原因となる。電話の発信と管理を許可していないユーザーの端末からDevice IDを取得できないため、下記のエラーを出力してDevice IDの取得に失敗する。
app.js:1 Exception occurred: getDeviceId: uid 10192 does not have android.permission.READ_PHONE_STATE.
エラーが発生した箇所
電話の発信と管理を許可していないユーザーの場合は、Device IDの取得に失敗するためthis.uniqueDeviceID.get()
の部分で上記のエラーが発生する。
import { UniqueDeviceID } from '@ionic-native/unique-device-id'; @Injectable() export class DeviceIdGetService { private deviceId: string; constructor(private uniqueDeviceID: UniqueDeviceID, private platform: Platform) { this.deviceId = ''; } public init() { if (this.platform.is('cordova')) { // 電話の発信と管理を許可していない場合は、DeviceIdを取得できない this.uniqueDeviceID.get() .then((uuid: any) => { this.deviceId = this.getPlatformPrefix().concat(uuid); }) .catch((error: any) => { console.log(error); }); } else { this.deviceId = 'Browser'; } } }
対応方針
アプリによる電話の発信と管理を許可するようにユーザーに強制することはできないため、device idの取得に失敗してもアプリを利用できるようにするか、電話の発信と管理を許可していないユーザーを検知して、許可を促すメッセージを表示するしかない。