Appでマルチキャストネットワークを使用するには

Appは、マルチキャストネットワーキングを使用することで、ローカルネットワーク上にあるその他のデバイスの検出して通信を行います。たとえば、あるAppはユーザーのWi-Fiネットワークに接続されているスマート電球を検出し、電球にメッセージを送信することで、照明のオンまたはオフを切り替えることができます。ローカルネットワーク上にあるすべてのデバイスを検出して通信するのはパワフルな機能ですが、通信されるデバイスには機密性の高い個人情報が含まれている場合があり、マーケティングプロファイルの作成や、ユーザーが自宅にいるかどうかを予測する情報として使用されてしまうおそれがあります。

iOS14では、Appがローカルネットワークにアクセスする際には通知を表示したり、ユーザーがいつでもこのアクセスをブロックしたり削除したりできるようにすることで、透明性を確保しユーザー側での制御を可能にしています。


注:このプライバシー制御は、最も近いネットワークにアクセスしているデバイスにのみ適用されるもので、Appがインターネットと通信することを制限するものではありません。


マルチキャストまたはブロードキャストネットワークを使用する必要があるデバイスやプロトコルと通信する必要がある場合は、iOSおよびiPadOSに追加された最新のプライバシー保護をサポートするようAppをアップデートしてください。

マルチキャストネットワーキング101

マルチキャストネットワーキングは一般に、ネットワーク上の他のデバイスを特定するためのデバイス検出プロトコルを使用したり、同一ネットワーク上にある多数のホストにデータを一括配信したり目的で使用されます。Wi-Fiネットワークの動作方法では、マルチキャストを使用した大量のデータ転送が非効率になる場合があるため、短時間で限られたトランザクションに使用する必要があります。

Appleプラットフォームは、クロスプラットフォームのデバイス検出プロトコルであるBonjourをネイティブでサポートしています。Bonjourは、Apple以外のプラットフォームでは「マルチキャストDNS」、「mDNS」、または「DNSサービスディスカバリ」とも呼ばれています。Bonjourはすべての主要プラットフォームに組み込まれています。

ネットワーク上の他のデバイスを検出したり、接続したりする必要がある場合は、 Bonjourを使用してください。Network.frameworkのNWBrowserを使用すると、ネットワーク上の他のBonjourサービスを検出し、それらのサービスと通信するためのNWConnectionオブジェクトを簡単に確立することができます。また、NWListenerを使用してBonjourサービスをアドバタイズすることで、他のユーザーが自分のデバイスを検出して通信できるようにできます。

Building a Custom Peer-to-Peer Protocol

デバイス検出時のプライバシーを保護

Appが現在Bonjourを使用してローカルネットワーク上のデバイスを検出している場合は、iOS 14のプライバシーコントロールを簡単に統合することができます。

使用サービスを宣言する

Bonjourを利用している場合は、Appの「Info.plist」ファイルで使用しているサービスを宣言できます。

「Info.plist」内でBonjourのサービスを宣言

アクセスの理由を表示する

これらのサービスを宣言した後は、理由の文字列も提示する必要があります。この文字列は、Appがローカルネットワークにアクセスしようとしたときに、アクセスの理由を他のユーザーに示します。このテキストには、ローカルネットワークから検出された情報を利用してAppが何をするのか、またこのデータを受信することはAppでの必要な体験を実現するためにどう役立つのか、ということを明確に説明してください。


一部のレガシーデバイスおよびソフトウェアとの互換性を維持するには、カスタムマルチキャストおよびブロードキャストプロトコルを使用する必要があります。これらの機能はAppにユーザーのローカルネットワークへの完全なアクセス権を与えるため、そのようなアクセス権には 「com.apple.developer.networking.multicast」制限付きエンタイトルメントが必要です。

注:有効なエンタイトルメントがなくてもiOSシミュレータおよびiPadOSシミュレータを使用してテストできますが、物理ハードウェアでマルチキャストおよびブロードキャストネットワークを使用するには有効なエンタイトルメントが必要です。


Request the com.apple.developer.networking.multicast entitlement

「NWConnectionGroup」を使用してマルチキャストパケットを送受信する

Appが「com.apple.developer.networking.multicast」エンタイトルメントを保有している場合、「NWConnectionGroup 」を使用することで、Network.frameworkを利用してSwiftでマルチキャストパケットをスムーズに送受信できます。

そのためにはまず、「NWMulticastGroup」を作成して参加したいマルチキャストグループを記述します。

```swift
guard let multicast = try? NWMulticastGroup(for: 
    [ .hostPort(host: "224.0.0.251", port: 5353) ]) 
    else { fatalError(...) }

「newMessageHandler」を使用して、マルチキャストグループに送信された着信パケットを受信できるようにして、オプションで送信する応答メッセージを設定します。

```swift
group.setReceiveHandler(maximumMessageSize: 16384, rejectOversizedMessages: true) { (message, content, isComplete) in
    print("Received message from \(String(describing: message.remoteEndpoint))")

    let sendContent = Data("ack".utf8)
    message.reply(content: sendContent)
}
```

他のNetwork.frameworkオブジェクトと同様に、「NWConnectionGroup」には状態更新ハンドラがあります。このハンドラは、「start()」に渡す「DispatchQueue」で呼び出されます。

```swift
group.stateUpdateHandler = { (newState) in 
    print("Group entered state \(String(describing: newState))") 
}
group.start(queue: .main)

グループにメッセージを送信する場合は、「send()」を使用します。前回の送信の完了ハンドラで後続の送信をスケジュールすることで、ネットワークに負荷をかけることを防ぐことができます。

```swift
let groupSendContent = Data("helloAll".utf8)
group.send(content: groupSendContent) { (error)
    print("Send complete with error \(String(describing: error))")
}
```

「NWConnectionGroup」での処理が終わったら、キャンセルを実行して関連づけられている状態をクリーンアップします。

```swift
group.cancel()
```

すべてのユーザーのセキュリティとプライバシー

ローカルネットワークのプライバシーは、より安全で安心できるAppを提供する方法の1つです。Appleプラットフォームで利用可能なその他のプライバシーコントロールと併せて、ローカルネットワーク保護を提供することにより、いつ何を共有するのかをしっかりと管理できるようになり、その背景情報についても把握できるようになります。Bonjourを使用してネットワーク上のデバイスを検出し、「Info.plist」で使用しているサービスを一覧表示するとともに、ネットワーク上でAppの動作を示す理由の文字列を提供することで、ユーザーのプライバシーを保護することができます。

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

...

NWConnectionGroup

Learn more about Bonjour