Appでのローカルネットワークプライバシーのサポート – WWDC2020

Session概要

ローカルネットワークプライバシーは、Appが個人のネットワーク上のデバイスに接続する際の透明性を高めます。
AppがBonjour (ローカルネットワーク上のデバイスやサービスを自動的に検出するApple製ソフトウェア)などのローカルネットワークプロトコルを使用してデバイスとのインタラクションを行う場合は、iOS 14でローカルネットワークプライバシーの許可のサポートを追加する必要があります。新たな許可フローの詳細をご覧になり、指示に従ってAppのアップデートに必要なステップを実行してください。
ここではさらにスムーズなプライバシー体験を作り上げるのに役立つベストプラクティスについての紹介も行います。 https://developer.apple.com/videos/play/wwdc2020/10110/

ローカルネットワークの使用

  • iPhoneの場合
    • インターネット
    • 照明の操作
    • プリンターでの印刷
    • 飛行機内でビデオの閲覧
    • 近くの友達とのゲームをする
Appleデバイスでのローカルネットワークの利用はBonjourが最適

Bonjour

  • アプリケーションが近くのサービスを検出したり独自のサービスを宣伝したりすることができる
  • 動画やオーディオのストリーミングやP2Pのゲーム、プリンター、カメラ、ホームデバイスとのコミュニケーションの基盤となっている
ユーザのプライバシーを尊重するために、Appにおいてローカルネットワークを利用するタイミングをユーザは知っておく必要があります。 位置情報はプライバシーに影響を与える一つであり、iOS 13からはネットワークの名前とBSSIDを読み取るために位置情報の許可が必要となった。

ローカルネットワークの制限

ユーザがどのアプリケーションにアクセスを許可しローカルネットワークとやりとりするかをコントロール出来るようになった。このことによりユーザにより多くの透明性を提供し、アプリ内で実行されているコードがネットワークにアクセスする方法を見直す機会となる。 アプリケーションがローカルネットワークにアクセスする際は、アプリケーションの許可を要求します。

ローカルネットワークにアクセスするための許可をどのように取得するか



  • iOS 14からアプリでローカルネットワークを使用しようとするとプロンプトが表示されるようになった
    • 許可が付与されるまで全てのローカルネットワーク通信がブロックされる
    • プロンプトにはInfo.plistで設定した使用方法の説明が表示されるようになる
    • iOS 14にアップデートしていないアプリはデフォルトの理由が記載されたテキストが表示される
    • 許可した場合は、ローカルネットワークを利用しているSDKやサードパーティライブラリに対しても適用される



iOS 14へのアップデート対応

  • Info.plistに説明を記述
  • アプリがBonjourを使用し、閲覧や広告を行う場合は使用するサービスタイプのリストを提供する必要がある
    • サービスタイプはアプリケーションプロトコルを識別するためにIANAに登録された一意の文字列
  • カスタムのマルチキャストとブロードキャストを行う場合にエンタイトルメントを設定する必要がある
    • エンタイトルメントは開発者ポータルから要求する必要がある

Bonjourを使用しているAPI
あとは、iOS 14 SDKを使用したアプリをビルドして動作確認を行う
NoAuth エラーが発生した場合は、ローカルネットワークの許可がされておらず、アプリケーションがブロックされていることを意味するため、Info.plistにBonjourのサービスと使用方法の説明を記述する必要がある。

アプリをアップデートする際のベストプラクティス

予期しないプロンプトの表示を避ける

  • プロンプトを表示した時にユーザが混乱しないように、ローカルネットワークを必要とするアクションが発生時に表示するようにする
  • 適切なタイミングの表示によりユーザがアクセスを許可する可能性が高くなる
  • 使用における明確な説明を表示すること

ローカルネットワーク未許可によるエラーの対処

  • Bonjour APIは結果を非同期で配信するため、アプリが許可を待っている間は近くにデバイスが無いように見えます
  • NWConnectionを使用するローカル接続は、アプリが許可を得るまで待機状態となる
    • URLSessionも同様
    • そのため、 waitForConnectivity プロパティを設定して確認出来るようにしておき、許可が一度下りればタスクが完了します
  • Socketを直接使用している場合は、アプリが許可を持っていない場合のシステムコールエラーを処理する必要がある
最新情報をチェックしよう!