Gestire le connessioni

Avviare una connessione

Quando vengono trovati dispositivi nelle vicinanze, chi li ha trovati può avviare le connessioni. L'esempio seguente richiede una connessione con un dispositivo non appena viene rilevato.

Swift

extension Example: DiscovererDelegate {
  func discoverer(
    _ discoverer: Discoverer, didFind endpointID: EndpointID, with context: Data) {
    // An endpoint was found. We request a connection to it. The endpoint info can be used
    // to provide arbitrary information to the discovering device (e.g. device name or type).
    discoverer.requestConnection(to: endpointID, using: "My Device".data(using: .utf8)!)
  }

  func discoverer(_ discoverer: Discoverer, didLose endpointID: EndpointID) {
    // A previously discovered endpoint has gone away.
  }
}

A seconda del caso d'uso, potresti voler mostrare all'utente un elenco dei dispositivi rilevati, consentendogli di scegliere a quali connettersi.

Accettare o rifiutare una connessione

Dopo che lo scopritore ha richiesto una connessione a un inserzionista, quest'ultimo riceve una notifica della richiesta di connessione tramite il metodo delegato advertiser(_:didReceiveConnectionRequestFrom:with:connectionRequestHandler:).

Swift

extension Example: AdvertiserDelegate {
  func advertiser(
    _ advertiser: Advertiser, didReceiveConnectionRequestFrom endpointID: EndpointID,
    with context: Data, connectionRequestHandler: @escaping (Bool) -> Void) {
    // Call with `true` to accept or `false` to reject the incoming connection request.
    connectionRequestHandler(true)
  }
}

Una volta accettata la richiesta, entrambe le parti ricevono una notifica e devono verificare la connessione tramite il metodo di delega connectionManager(_:didReceive:from:verificationHandler:).

Ti consigliamo di verificare la connessione utilizzando il codice di verifica fornito dal metodo delegato. In questo modo, gli utenti possono confermare di connettersi al dispositivo previsto. A entrambi i dispositivi viene assegnato lo stesso codice, una breve stringa casuale. Spetta a te decidere come verificarlo. In genere, ciò comporta la visualizzazione del token su entrambi i dispositivi e la richiesta agli utenti di confrontarlo e confermarlo manualmente, in modo simile a una finestra di dialogo di associazione Bluetooth.

Swift

extension Example: ConnectionManagerDelegate {
  func connectionManager(
    _ connectionManager: ConnectionManager, didReceive verificationCode: String,
    from endpointID: EndpointID, verificationHandler: @escaping (Bool) -> Void) {
    // Optionally show the user the verification code. Your app should call this handler
    // with a value of `true` if the nearby endpoint should be trusted, or `false`
    // otherwise.
    verificationHandler(true)
  }
}

La connessione viene stabilita completamente solo quando entrambe le parti hanno accettato. Se una o entrambe le parti rifiutano, la connessione viene eliminata.

Gli esempi precedenti mostrano la connessione accettata automaticamente da entrambe le parti, ma a seconda del caso d'uso potresti voler presentare questa scelta all'utente in qualche modo.