.state == .connected } } }

Enviando mensagens

Agora que todos os nossos dispositivos estão conectados, é hora de realmente começar a enviar mensagens para frente e para trás. MPC oferece três opções a este respeito:

Por uma questão de simplicidade, examinaremos apenas a primeira dessas opções. Enviaremos mensagens simples de um lado para outro e não nos preocuparemos muito com as complexidades dos tipos de mensagem, formatação, etc. Usaremos uma estrutura Codable para encapsular nossa mensagem, que será semelhante a esta:

struct Message: Codable { let body: String }

Também adicionaremos uma extensão ao Dispositivo para enviar um destes:

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”) sessão função pública (_ sessão: 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 }

Conclusões

Este artigo cobre a arquitetura necessária para construir os componentes de rede de um aplicativo baseado em MultipeerConnectivity. O código-fonte completo (disponível no Github) oferece um invólucro de interface de usuário mínimo que permite visualizar os dispositivos conectados e enviar mensagens entre eles.

MPC oferece conectividade quase perfeita entre dispositivos próximos sem a necessidade de se preocupar com redes WiFi, Bluetooth ou ginástica complexa de cliente / servidor. Ser capaz de emparelhar rapidamente alguns telefones para uma curta sessão de jogo ou conectar dois dispositivos para compartilhamento é feito da maneira típica da Apple.

O código-fonte deste projeto está disponível no Github em https://github.com/bengottlieb/MultipeerExample .

Projetando um iOS que usa AFNetworking? O padrão de design Model-View-Controller (MVC) é ótimo para uma base de código de manutenção, mas às vezes você precisa de uma única classe para lidar com sua rede devido a questões como código DRY, registro de rede centralizado e, especialmente, limitação de taxa. Leia tudo sobre como lidar com isso com uma classe Singleton em Rede centralizada e desacoplada do iOS: Tutorial AFNetworking com uma classe singleton

Compreender o básico

O que é um aplicativo ponto a ponto?

Um aplicativo em rede capaz de se conectar a outras instâncias (pares) sem precisar de um servidor ou outro intermediário.

Por que a criptografia é necessária?

Se seus dados são confidenciais (como arquivos compartilhados), você pode querer evitar que outras pessoas os interceptem. Para muitos aplicativos ponto a ponto, no entanto, não é necessário (pense: jogadas de jogo ou instruções simples).

O que significa “passagem de mensagens”?

Quando dois dispositivos estão conectados, eles se comunicam por meio de mensagens enviadas e recebidas.

O que é “infraestrutura de rede”?

Em uma rede cliente-servidor tradicional, a infraestrutura inclui o servidor e o equipamento de conexão (por exemplo, uma estação base WiFi). Em um modelo ponto a ponto, isso pode ser reduzido a uma rede que consiste apenas nos próprios dispositivos e uma conexão ad-hoc (sem hardware externo, apenas os próprios rádios dos dispositivos).

O que é uma comunicação ponto a ponto?

A comunicação ponto a ponto envolve dispositivos em uma rede que se comunicam diretamente entre si, sem passar por um servidor intermediário.

Por que ponto a ponto é uma coisa boa?

As redes ponto a ponto podem ser configuradas em qualquer lugar onde haja dois ou mais dispositivos capazes, sem a necessidade de envolver um terceiro servidor, potencialmente inacessível. Por exemplo, quando não há conexão com a internet, mas os dispositivos ainda podem se ver.

Quais são os benefícios da estrutura de conectividade Multipeer?

O MPC cuida de muitas das tarefas básicas de configuração e manutenção, como descoberta de pares e comunicações de baixo nível. Isso economiza muito tempo e esforço do desenvolvedor ao lidar com funções comuns para eles.

Quais são as desvantagens da estrutura de conectividade Multipeer?

Existem alguns pontos fracos não bem documentados que, se não forem protegidos, podem causar dificuldades de conexão. Também há uma perda geral de flexibilidade que vem com uma estrutura de uso geral. Para a maioria dos usos, entretanto, o MPC é adequado.