ionic Platform.readyについて

ionicのPlatform.readyはネイティブ側で必要な初期化処理が完了したときに発火される。ネイティブの機能を使うプラグインを使用する場合、Platform.readyが終わってないと使用できないというわけだ。console.logも実機で動かす場合はcordovaがラップしてObjectivecでログ出力する処理を置き換えてるはずなのでネイティブの機能と言える(たぶん)。例えば、以下のコード。ionViewWillEnterとionViewDidEnterでプラグインを呼び出そうとしている。

import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';

@Component({
  selector: 'app-tab1',
  templateUrl: 'tab1.page.html',
  styleUrls: ['tab1.page.scss']
})
export class Tab1Page {

  constructor(public platform: Platform) {
    platform.ready().then(() => {
      window.hoge_plugin.fuga();
    });
  }

  ionViewWillEnter() {
    window.hoge_plugin.fuga();
  }

  ionViewDidEnter() {
    window.hoge_plugin.fuga();
  }
}

おおよそこちらのコードは問題なく動作するはずだが期待どおりに動作しない場合がある。そう、Platform.readyが完了する前にionViewWillEnterやionViewDidEnterが呼ばれた場合だ。アプリ起動後の最初のページなどにこのような処理を書くとエラーになる場合があるだろう。そこで以下のようにPlatform.readyを使うように修正する

export class Tab1Page {

  constructor(public platform: Platform) {
    platform.ready().then(() => {
      window.hoge_plugin.fuga();
    });
  }

  ionViewWillEnter() {
    this.platform.ready().then(() => {
      window.hoge_plugin.fuga();
    });
  }

  ionViewDidEnter() {
    this.platform.ready().then(() => {
      window.hoge_plugin.fuga();
    });
  }
}

当初私はPlatform.readyはアプリ起動後に1度だけ呼ばれると勘違いしていたのでこのコードの意味がよくわからなかった理解するポイントは、

・Platform.readyが完了済みなら即時実行される
・Platform.readyが未完了ならPlatform.readyが完了してから実行される

といったところだろうか。まとめるとプラグインを呼び出す際はPlatform.readyが完了している前提なのでPlatform.readyで囲んでおけば間違いないのだろう