私は、MultipeerConnectivityFramework で招待を把握しようとしている時点で、本当に立ち往生しています。
現在、広告主として機能する iPad アプリと、ブラウザとして機能する iPhone アプリがあります。MultipeerFramework の sharedService を実装し、次のことを行いました。
広告主
@implementation MultipeerConnectivityService {
MCNearbyServiceAdvertiser *_advertiser;
MCSession *_session;
MCNearbyServiceBrowser *_browser;
}
- (void)automaticAdvertiseWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
_session = [[MCSession alloc] initWithPeer:peerID];
_session.delegate = self;
_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType];
_advertiser.delegate = self;
[_advertiser startAdvertisingPeer];
}
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
invitationHandler([@YES boolValue], _session);
NSLog(@"Invitation accepted");
}
ブラウザ
- (void)automaticBrowsingWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
_browser = [[MCNearbyServiceBrowser alloc] initWithPeer:peerID serviceType:kServiceType];
_browser.delegate = self;
[_browser startBrowsingForPeers];
}
- (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error {
if ([_delegate respondsToSelector:@selector(browser:didNotStartBrowsingForPeers:)]) {
[_delegate browserDidNotStartBrowsingForPeers];
}
}
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
[browser invitePeer:peerID toSession:[self getMCSession] withContext:nil timeout:10];
if ([_delegate respondsToSelector:@selector(browser:foundPeer:)]) {
[_delegate browser:browser foundPeer:peerID];
}
}
- (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID {
if ([_delegate respondsToSelector:@selector(browserLostPeer:)]) {
[_delegate browserLostPeer:peerID];
}
}
- (MCSession *) getMCSession {
return _session;
}
しかし、その後、コンソールでフィードバックとして取得しています:
-[MCNearbyServiceBrowser invitePeer:toSession:withContext:timeout:] Bad argument session=nil
見つかった広告主を確認すると、すべて問題ありません。広告主の iPad が見つかりました。しかし、どうすれば招待を管理できますか?
ブラウザで招待状を送る場合、どのセッションを使えばいいですか?iPad では、「automaticAdvertiseWithName」メソッドでわかるようにセッションをセットアップしました。しかし、iPhoneでは「automaticBrowsingWithName」を呼び出すときにこれを行いません...それが問題ですか?それらを正常に接続するには、同じセッションである必要はありませんか? また、広告主の iPad をブラウザに招待するにはどうすればよいですか?
広告主が既にセッションを作成しているのに、新しいセッションを作成するという概念に混乱しています。
デリゲートのdidReceiveInvitationがピアをconnectedPeersに追加しているかどうかは、実際にはわかりません。
- (void)automaticAdvertiseWithName:(NSString *)name {
MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:name];
self.session = [[MCSession alloc] initWithPeer:peerID];
self.session.delegate = self;
_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:nil serviceType:kServiceType];
_advertiser.delegate = self;
[_advertiser startAdvertisingPeer];
}
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
BOOL accept = YES;
invitationHandler(accept, self.session);
NSLog(@"Invitation accepted: %@", self.session);
}
また、セッションでプロパティ「connectedPeers」を呼び出すと、デリゲートがピアを見つけたにもかかわらず、接続されたピアがまったくありません。私はそこで間違いを犯しましたか?