Thanks to the commenters for excellent suggestions that led to my finding my own mistake. And here it is:
If you implement the MCSessionDelegate
method session:didReceiveCertificate:fromPeer:certificateHandler
method, it will intercept the peer's attempt to connect to the session. You should either explicitly approve that connection in that method or comment it out.
Details and lessons learned:
In addition to the code I showed, I had made stubby implementations of the various delegate methods. One MCSessionDelegate
method is this one:
- (void) session:(MCSession *)session
didReceiveCertificate:(NSArray *)certificate
fromPeer:(MCPeerID *)peerID
certificateHandler:(void (^)(BOOL))certificateHandler
{
}
Extending @Big-O Claire 's advice above, I started watching all these delegate methods, Just In Case. And this one fired when the peer tapped the Accept button in the AdvertiserAssistant UI.
This method gives you a chance to decide if the peer is legit and not connect (using the certificateHandler:
) if you don't want to. Apple says,
Your app should inspect the nearby peer’s certificate, and then should decide whether to trust that certificate. Upon making that determination, your app should call the provided certificateHandler block, passing either YES (to trust the nearby peer) or NO (to reject it).
In addition, you get this tip:
Important: The multipeer connectivity framework makes no attempt to validate the peer-provided identity or certificates in any way. If your delegate does not implement this method, all certificates are accepted automatically.
When I commented this method out, the connections went through — and THIS problem, at least, was solved.