はじめに
これまでのiPhone8/8Plus/SEなどでは通信中に下図のような Network Indicator
が表示されていました。
しかしながら、iPhoneX系統では、下図のように Network Indicator
の表示がなくなってしまいました。
今回は、この Network Indicator
に焦点を当てたいと思います。
iPhoneX時代のNetwork Indicatorは?
『iPhoneXではステータスバーにNetwork Indicator
を表示しない』方針を取ったのは、
紛れもなくAppleなわけですから、何らかの他の方法でユーザに通信中であることを伝えていると思われます。
そこで幾つかのApple標準アプリを見ていきたいと思います。
まず、App Store
を見てみると、
- 読み込まれるまでは真っ白
- 読み込みの早い文字を先に表示し、画像系は枠だけ表示する
ようになっていました。
Apple標準アプリ以外でも、上記手法を取り入れているアプリは結構多そうでした。
続いて、Safari
を見てみると、
- アドレスバー下にプログレスバーを表示する
ようになっていました。
iPhoneXで従来型Network Indicatorを表示するためには?
このように現在のアプリでは、従来のような密やかなNetwork Indicator
よりも、
この先にどんな画面が表示されるか想像させたり、
あとどの程度で読み込みが終わるのか進捗を伝えたりなど、
より具体性を伝達するように変わってきている気がします。
しかしながら、従来のような密やかな通信状態の伝達が完全に不要になったかと言うと、それはアプリ仕様に依存するところでしょう。
では、そんなアプリを開発するときに、どうすればよいかと言うと、
FTLinearActivityIndicatorを利用してみるのも一つの手かなと思います。
FTLinearActivityIndicatorで密やかなNetworkIndicatorを出すためには
非常に簡単に実装ができます。
まずは、Indicator
のconfigure
を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
続いて、必要なタイミングで、
UIApplication.shared.isNetworkActivityIndicatorVisible
をtrue
にするだけです。
※非表示にする場合はfalse
にセットし直すだけです。
FTLinearActivityIndicatorはどんなことをやっているのか
まず、ライブラリの構成としては、
1 2 3 |
|
となっています。
FTLinearActivityIndicator.swift
はクラス名通り、NetworkIndicator
の表現やアニメーション系のメソッドを提供しています。
一方で、UIApplication+LinearNetworkActivityIndicator.swift
は、
UIApplication
の拡張UIViewController
の拡張DispatchQueue
の拡張
と3つに分かれており、FTLinearActivityIndicator
を制御するためのメソッドが用意されています。
具体的に実装の中身を見ていきます。
先程のAppDelegate
のdidFinishLaunchingWithOptions
で実行していたconfigureLinearNetworkActivityIndicatorIfNeeded()
内の処理は下記のようになっています。
1 2 3 4 5 6 7 8 9 10 |
|
これを見ると、ライブラリ側でiPhoneX
系端末なのか/iPad
ではない端末なのかを判別してくれていることがわかります。
既に全画面表示の iPad
が世に出ているため、作成者にPullRequest
を送るチャンスかもしれないですね!
続いて、もう少し深ぼると…
上記メソッド内で実行しているconfigureLinearNetworkActivityIndicator()
の中身は、
1 2 3 4 5 6 7 8 9 10 11 12 |
|
になっています。
重要ポイントを説明すると、
- 説明(1)
DispatchQueue.once
の内部実装を見ると、ファイル名/メソッド名/行数からトークンを作成し、実行回数を管理しています- これにより、誤って無駄に重複実行したとしても、防いでくれるようになっているようです
- 説明(2)
- ライブラリの存在を意識する必要なく機能を利用できるように
method_exchangeImplementations
を使っています - class_getInstanceMethodでメソッド情報を取得します
- method_exchangeImplementationsでメソッドの実装を入れ替えます
method_exchangeImplementations
によりUIApplication.isNetworkActivityIndicatorVisible
が実行されたら、ft_setNetworkActivityIndicatorVisible(visible:)
が呼び出されるという状況を作ることができます
- ライブラリの存在を意識する必要なく機能を利用できるように
まとめ
以上をまとめます。
- iPhoneX系端末では従来の
NetworkIndicator
はデフォルト、表示されない - 従来型の通信表現を取り入れているアプリは最近少ないかもしれない
- 従来型の通信表現を利用する場合は
FTLinearActivityIndicator
がオススメ
ということで本日はここまで。