Désactiver le WiFi de la connectivité Multi Peer

J'ai parcouru la documentation, mais il n'y a pas beaucoup d'informations sur Multipeer Connectivity liées au choix d'un moyen de connection possible pour les pairs.

Multipeer Connectivity découvre automatiquement les homologues basés sur le WiFi ou le Bluetooth. Y at-il un moyen de limiter cela à seulement Bluetooth?

Comme @kdogisthebest l'indique correctement, il n'y a aucun moyen de forcer Multipeer Connectivity à utiliser une technologie réseau particulière, mais comme votre question concerne un problème particulier avec le WiFi, cette réponse détaille ce que je fais pour contourner ce problème.

J'ai travaillé sur le problème des homologues fantômes en WiFi en envoyant un horodatage plus court dans discoveryInfo lors de la création de MCNearybyServiceAdvertiser . Il y a plusieurs mises en garde ici:

1) Cette solution suppose que les deux appareils ont le même time. Je m'assure de cela en utilisant une version modifiée de ios-ntp comme source de time de l'application.

2) Il suppose également que la publicité et la navigation ne durent pas trop longtime. J'ai une durée de 60 secondes pour les phases de découverte, et je réinitialise complètement le browser / l'annonceur à chaque redémarrage.

3) MPC ne semble pas aimer trop d'octets dans discoveryInfo donc l'envoi d'un NSTimeInterval basé sur epoch ne fonctionne pas. Je devais les tronquer.

Ainsi, lorsque mon application entre en mode découverte, elle commence à naviguer et à faire de la publicité simultanément. Le code de la publicité ressemble à:

 - (void)startAdvertising { if (_advertising){ NSLog(@"Already advertising"); return; } self.acceptedPeerIDNameMap = [NSMutableDictionary dictionary]; NSInteger timeStamp = [self shortenedNetworkTimeStamp]; NSDictionary *discoveryInfo = @{kAdvertisingDiscoveryInfoTimestampKey:[NSSsortingng ssortingngWithFormat:@"%ld",(long)timeStamp]}; NSLog(@"Starting advertiser"); self.serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:_myPeerID discoveryInfo:discoveryInfo serviceType:kServiceType]; _serviceAdvertiser.delegate = self; [_serviceAdvertiser startAdvertisingPeer]; self.advertising = YES; } 

La méthode shortenedNetworkTimestamp prend simplement un NSTimeInterval (soit en utilisant le framework ntp ou timeIntervalSinceReferenceDate et en supprimant 1400000000 de celui-ci.

Ensuite, lorsque le browser découvre un pair, il vérifie si l'horodatage de l'annonceur est dans la durée de découverte connue (dans mon cas 60 secondes):

 - (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info { DLog(@"Browser found peer ID %@",peerID.displayName); //Only one peer should invite the other BOOL shouldInvite = [peerID.displayName compare:_myPeerID.displayName]==NSOrderedAscending; //Don't re-send invitations if (_peerInfoDisplayNameMap[peerID.displayName]){ DLog(@"Already connected to peerID %@",peerID.displayName); shouldInvite = NO; } else if (_invitedPeerIDNameMap[peerID.displayName]){ DLog(@"Already invited peerID %@",peerID.displayName); shouldInvite = NO; } //Invite if discovery info is valid if (shouldInvite && [self discoveryInfoIsValid:info]) { DLog(@"Inviting"); _invitedPeerIDNameMap[peerID.displayName] = peerID; MCSession *session = [self availableSession]; [_serviceBrowser invitePeer:peerID toSession:session withContext:nil timeout:0]; } else { DLog(@"Not inviting"); } } 

La vérification de la validité des informations de découverte est assez simple – assurez-vous simplement que l'horodatage envoyé dans l'info est à l'intérieur de la plage de time de découverte (dans mon cas, kDiscoveryPhaseDuration est de 60 secondes):

 - (BOOL)discoveryInfoIsValid:(NSDictionary *)info { BOOL isValid = YES; NSSsortingng *infoTimeStamp = info[kAdvertisingDiscoveryInfoTimestampKey]; NSTimeInterval sentTimeStamp = (infoTimeStamp) ? [infoTimeStamp doubleValue] : -1; NSTimeInterval currentTimeStamp = [self shortenedNetworkTimeStamp]; if (sentTimeStamp==-1 || (currentTimeStamp - sentTimeStamp) > kDiscoveryPhaseDuration){ DLog(@"Expired discovery info (current=%f, sent=%f)",currentTimeStamp,sentTimeStamp); isValid = NO; } return isValid; } 

Espérons que cela aide. Il y a beaucoup d'autres bizarreries dans MPC que je gère dans mon propre code mais je pense que ce qui précède couvre ce problème spécifique.

Cela n'est pas possible avec Multipeer Connectivity. Il n'y a pas de methods qu'Apple met en place pour limiter la connection à Bluetooth.

Une réponse ici: Connectivité multipeer sur Bluetooth? états "Il n'y a pas de paramètre explicite pour bluetooth ou Wifi, il va connecter les périphériques de toutes les façons possibles, ils sont disponibles."