[iOS 10] iMessage アプリのライフサイクルについて

2016.10.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

iOS 10 から作成できるようになった「iMessage アプリ」の実装で中心となるのは MSMessagesAppViewController クラスです。このクラスは UIViewController のサブクラスであり、view を管理するイベントに加えて iMessage アプリ特有のイベントをハンドリングすることができます。

本記事では MSMessagesAppViewController クラスのメソッドが呼ばれる順番をトレースし、iMessage アプリの処理の流れを整理していきます。

「iMessage アプリ」開発の基本事項については以下のカテゴリ内の他の記事などを参考にしてみてください!

[1] iMessage アプリがアクティブになるときのフロー

こちらは、Xcode からアプリを実行した場合などがあてはまります。

ios-10-message-extension-lifecycle-1

メソッドが呼ばれる順番は以下のようになりました。viewDidLoad()viewWillAppear(_:) の間に willBecomeActive(with:)didBecomeActive(with:) が呼ばれました。

  • viewDidLoad()
  • willBecomeActive(with:)
  • didBecomeActive(with:)
  • viewWillAppear(_:)
  • viewDidAppear(_:)

[2] iMessage アプリがアクティブでなくなるときのフロー

こちらは、画面中央のボタンを押して iMessage アプリを非表示にした場合などがあてはまります。

ios-10-message-extension-lifecycle-2

メソッドが呼ばれる順番は以下のようになりました。なぜか viewDidDisappear(_:) は呼ばれませんでした。

  • viewWillDisappear(_:)
  • willResignActive(with:)
  • didResignActive(with:)

[3] メッセージがタップされた場合のフロー

自分のアプリで作成したメッセージがタップされたイベントは、MSMessagesAppViewController のサブクラスでハンドリングできます。メッセージがタップされた時に iMessage アプリがアクティブかどうかによって、呼ばれるメソッドが異なります。

iMessage アプリがアクティブな場合

ios-10-message-extension-lifecycle-3

メソッドが呼ばれる順番は以下のようになりました。didSelect(_:conversation:) メソッドの conversation 引数の selectedMessage プロパティから、選択されたメッセージの情報を取得できます。

  • willSelect(_:conversation:)
  • didSelect(_:conversation:)
  • willTransition(to:)
  • didTransition(to:)

iMessage アプリがアクティブではない場合

ios-10-message-extension-lifecycle-4

メソッドが呼ばれる順番は以下のようになりました。呼ばれる順番やメソッドはパターン [1] の場合と同じです。

willBecomeActive(with:) または didBecomeActive(with:) メソッドの conversation 引数の selectedMessage プロパティから、選択されたメッセージの情報を取得できます。

  • viewDidLoad()
  • willBecomeActive(with:)
  • didBecomeActive(with:)
  • viewWillAppear(_:)
  • viewDidAppear(_:)

さいごに

本記事では MSMessagesAppViewController クラスのメソッドが呼ばれる順番をトレースし、iMessage アプリの処理の流れを整理してみました。iMessage アプリを思うように動かすための土台になりそうなのでしっかり押さえておきたいところですね。

iMessage アプリを作成中の方の参考になれば幸いです。

参考