iOS10のToday Extension (Widget)を開発中にハマったところを書きます。
環境
OS: iOS10
デバイス: iPad (iPad Pro 12.9インチを除く)
ウィジェットの配置
iPadで画面をLandscapeにした時、ウィジェットを左列か右列に配置できます。
画面をPortraitにしたときは1列になります。
(iPad Pro 12.9インチを除く)
ハマりどころ
問題はウィジェットを右列に配置したときで、例えばLandscapeからPortraitに画面を回転したときは、ウィジェットの画面サイズが変化するのではなく、Landscape用ウィジェットが終了しつつ、Portrait用ウィジェットが起動します。
つ・ま・り、Landscapeで表示しているウィジェットとPortraitで表示しているウィジェットは別のインスタンスです。
注釈
- ウィジェットを左列に配置したときは発生しません。
- iPad Pro 12.9インチでは、ウィジェットが常に2列なので発生しません。
- iPhone6Plus系の画面回転では発生しません。
ログ
LandscapeからPortraitにしたとき
Landscape 右列 | Portrait |
---|---|
viewWillDisappear | |
viewDidLoad() | |
widgetActiveDisplayModeDidChange(_:withMaximumSize:) | |
widgetPerformUpdate(completionHandler:) | |
viewDidDisappear | |
viewWillAppear | |
deinit | |
viewDidAppear |
問題
「画面の回転ではウィジェットの画面サイズが変わるだけ」という前提でコーディングすると、画面を回転したら初期値が表示される等の現象に見舞われます。
対策
viewWillDisappearでUserDefaultsなどにデータを保存し、もう1つのインスタンスがviewWillAppearで読み出すようにして、データを同期するようにします。
deinitでデータを保存していると、もう1つのインスタンスが既に起動しているので、データが同期できません。