5

私は、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」を呼び出すと、デリゲートがピアを見つけたにもかかわらず、接続されたピアがまったくありません。私はそこで間違いを犯しましたか?

4

1 に答える 1

3

あなたの問題は、invitePeer:toSession:withContext:timeout を呼び出すときにセッションが null であることです... とにかく、これを修正するには 2 つのオプションがあります。

2 つのオプションがあります。
オプション 1 - peerID の作成セッションの作成、およびセッション デリゲートの割り当てを、常に実行される場所に移動します。たとえば、viewDidLoad の UIViewController である場合の MultipeerConnectivityService クラスの初期化コードです。

オプション 2 - 「invitePeer:toSession:withContext:timeout:」を呼び出す前に、次のスニペットを追加します。

if (!_session) {
      MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:@"Browser"]; // you can customize the name here
     _session = [[MCSession alloc] initWithPeer:peerID];
     _session.delegate = self;
}

これが役に立てば幸いです...頑張ってください!

于 2013-11-03T18:10:50.010 に答える