iOS 14でローカルネットワークの利用


はじめに

iOS14からローカルネットワークへの通信にユーザの許可が必要になりました。
例えば、ローカルネットワークに存在する機器を自動検出するために、ブロードキャストやマルチキャストを利用すると、ユーザに以下のようなアラートダイアログが表示されます。iOS14では、ユーザに許可を求めるようになっただけかと思ったのですが、機能によっては、実装の変更やAppleへの申請が必要です。詳細は、参考文献にあげたURLを参照ください。

iOS14でローカルネットワーク通信に許可が必要な機能

"Support local network privacy in your app (WWDC2020)"において、ローカルネットワークへの通信に関して、ユーザに許可がいる場合は、以下と説明されています。

ユーザの許可が必要
  • TCP/UDPでローカルネットワークのホストに通信
  • Bonjourでの検索と広告
  • IPマルチキャスト、ブロードキャスト、ICMPでの通信

開発者が変更する必要があること

ローカルネットワークを利用する場合、開発者として必要なことは以下です。

1. ローカルネットワークの許可ダイアログの説明文の追加

アプリでローカルネットワークの許可が必要な時に、以下のダイアログが表示されます。何も設定していないと、はじめにのような図の標準的な説明文が表示されます。Info.plistに説明文を入れることで、このダイアログに説明文を追加することができます。アプリで必要な理由をユーザに説明することができます。

具体的には、XcodeでInfo.plistを編集し、Privacy - Local Network Usage Descriptionの値が説明文を追加します。

Info.plistのファイルは、以下のようになります。

Info.plist
<key>NSLocalNetworkUsageDescription</key>
 <string>この部分に説明を記載してください。</string>

2. Bonjourで検索するサービスの追加

Bonjourでサービスを検索する時には、Info.plistに検索するサービス名を記載します。ここで、記載したサービスは、Bonjourで検出できるようになります。XcodeでInfo.plistを編集し、Bonjour servicesに検索するサービスを追記します。配列になっているので、複数記載することが出来ます。

Info.plist
<key>NSBonjourServices</key>
<array>
 <string>_ipp._tcp.</string>
 <string>_printer._tcp.</string>
</array>

3. ブロードキャスト/マルチキャスト通信が必要な場合

Multicast Networking Entitlement申請

上記以外のブロードキャスト/マルチキャスト通信が必要な場合、AppleにアプリIDごとに申請が必要です。具体的には、「マルチキャストネットワークエンタイトルメント申請(Multicast Networking Entitlement Request)」から申請できます。
iOSシミュレータおよびiPadOSシミュレータでは、この許可なしで通信できます。しかし、実機では、この許可がないと通信できません。シュミレータで通信できるが、実機で通信できない場合には、この許可が必要かを確認してみてください。

Multicast Networking Entitlement取得後の設定方法

AppleからMulticast Networking Entitlementを取得した後、いくつか設定が必要です。その設定方法を書いておきます。

対象アプリのCapabilitiesの追加 (Apple Developer)

対象のアプリIDを選びます。具体的には、以下の図のApple DeveloperのCertificates, Identifiers & ProfilesIdentifiersから対象のアプリを選択します。
現時点のURLは、https://developer.apple.com/account/resources/identifiers/list です。

対象のアプリIDを選択するとEdit your App ID Configurationでアプリの設定変更ができます。
Multicast Networking Entitlementを取得したアプリは、以下の図のようにAdditional Capabilitiesが選べるようになるので、Multicast Networkingを選択します。

対象アプリのCapabilitiesの追加 (Apple Developer)

Xcodeでアプリ名.entitlementsのファイルを選択します。以下の図のように、keycom.apple.developer.networking.multicastを、value1を入れます。
これでCapabilityの設定は完了です。

以下のファイルでの記載方法です。

アプリ名.entitlements
<key>com.apple.developer.networking.multicast</key>
<true/>

参考文献