.state == .connected } } }

メッセージの送信

すべてのデバイスが接続されたので、実際にメッセージの送受信を開始します。 MPCは、この点に関して3つのオプションを提供します。

簡単にするために、これらのオプションの最初のものだけを見ていきます。単純なメッセージをやり取りし、メッセージの種類やフォーマットなどの複雑さについてあまり心配する必要はありません。Codable構造を使用して、メッセージをカプセル化します。これは次のようになります。

struct Message: Codable { let body: String }

また、デバイスに拡張機能を追加して、次のいずれかを送信します。

extension Device { func send(text: String) throws { let message = Message(body: text) let payload = try JSONEncoder().encode(message) try self.session?.send(payload, toPeers: [self.peerID], with: .reliable) } } ~~~swift Finally, we'll need to modify our `Device.session(_:didReceive:fromPeer)` code to receive the message, parse it, and notify any interested objects about it:

static let messageReceivedNotification = Notification.Name(“ DeviceDidReceiveMessage”)public func session(_ session:MCSession、didReceive data:Data、fromPeer peerID:MCPeerID){if let message = try? JSONDecoder()。decode(Message.self、from:data){NotificationCenter.default.post(name:Device.messageReceivedNotification、object:message、userInfo:[“ from”:self])}}

## Disconnections Now that we've got a connection created between multiple devices, we have to be able to both disconnect on demand and also handle system interruptions. One of the undocumented weaknesses of MPC is that it doesn't function in the background. We need to observe the `UIApplication.didEnterBackgroundNotification` notification, and make sure that we shut down all our sessions. Failure to do this will lead to undefined states in the sessions and devices and can cause lots of confusing, hard-to-track-down errors. There is a temptation to use a background task to keep your sessions around, in case the user jumps back into your app. However, this is a bad idea, as MPC will usually fail within the first second of being backgrounded. When your app returns to the foreground, you can rely on MPC's delegate methods to rebuild your connections. In our MPCSession's `start()` method, we'll want to observe this notification and add code to handle it and shut down all our sessions. ~~~swift func start() { self.advertiser.startAdvertisingPeer() self.browser.startBrowsingForPeers() NotificationCenter.default.addObserver(self, selector: #selector(enteredBackground), name: Notification.Name.UIApplicationDidEnterBackground, object: nil) } @objc func enteredBackground() { for device in self.devices { device.disconnect() } } func disconnect() { self.session?.disconnect() self.session = nil }

結論

この記事では、MultipeerConnectivityベースのアプリケーションのネットワークコンポーネントを構築するために必要なアーキテクチャについて説明します。完全なソースコード(Githubで入手可能)は、接続されたデバイスを表示し、それらの間でメッセージを送信できるようにする最小限のユーザーインターフェイスラッパーを提供します。

MPCは、WiFiネットワーク、Bluetooth、または複雑なクライアント/サーバー体操について心配することなく、近くのデバイス間でほぼシームレスな接続を提供します。短いゲームセッションのためにいくつかの電話をすばやくペアリングしたり、共有のために2つのデバイスを接続したりできることは、典型的なAppleのやり方で行われます。

このプロジェクトのソースコードは、Githubの次の場所で入手できます。 https://github.com/bengottlieb/MultipeerExample

AFNetworkingを使用するiOSを設計していますか? Model-View-Controller(MVC)デザインパターンは、maintainabeコードベースに最適ですが、DRYコード、集中型ネットワークロギング、特にレート制限などの懸念から、ネットワークを処理するために単一のクラスが必要になる場合があります。シングルトンクラスでこれを処理する方法についてすべて読む iOSの集中型および分離型ネットワーキング:シングルトンクラスを使用したAFNetworkingチュートリアル

基本を理解する

ピアツーピアアプリケーションとは何ですか?

サーバーや他の仲介者を必要とせずに他のインスタンス(ピア)に接続できるネットワーク化されたアプリ。

なぜ暗号化が必要なのですか?

データが機密性の高いもの(共有ファイルなど)である場合は、他の人がデータを傍受しないようにすることができます。ただし、多くのピアツーピアアプリケーションでは、必須ではありません(ゲームの移動や簡単な手順を考えてみてください)。

「メッセージパッシング」とはどういう意味ですか?

2つのデバイスが接続されている場合、それらは送受信されるメッセージを介して通信します。

Javaなしでゲームを埋める

「ネットワークインフラ」とは?

従来のクライアントサーバーネットワークでは、インフラストラクチャにはサーバーと接続機器(WiFi基地局など)が含まれます。ピアツーピアモデルでは、デバイス自体とアドホック接続(外部ハードウェアなし、デバイス自体の無線のみ)で構成されるネットワークに縮小できます。

ピアツーピア通信とは何ですか?

ピアツーピア通信には、中間サーバーを経由せずに、ネットワーク上のデバイスが相互に直接通信することが含まれます。

なぜピアツーピアが良いことなのですか?

ピアツーピアネットワークは、3つ目の、到達できない可能性のあるサーバーを使用することなく、2つ以上の対応デバイスが存在する場所であればどこにでもセットアップできます。たとえば、インターネットに接続されていなくても、デバイスは相互に認識できます。

マルチピア接続フレームワークの利点は何ですか?

MPCは、ピア検出や低レベル通信など、基盤となる多くのセットアップおよびメンテナンスタスクを処理します。共通の機能を処理することで、開発者の時間と労力を大幅に節約します。

マルチピア接続フレームワークの欠点は何ですか?

十分に文書化されていない弱点がいくつかあり、それらを防ぐ必要がない場合、接続の問題を引き起こす可能性があります。また、汎用フレームワークに伴う柔軟性の一般的な喪失もあります。ただし、ほとんどの用途では、MPCが適しています。