1

Multipeer Conectivity Framework を使用するアプリに取り組んでいます。これまでのところ、すべて順調に進んでおり、プログラムによるブラウジングと招待を実装しました。

私の問題は、ユーザーが招待を受け入れると、ブラウザーが状態の変更を受信して​​いないため、セッションが作成されないことです。

これは、ブロックと統合されたアクション シートを使用して作成した広告主の招待方法です。

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
       withContext:(NSData *)context
 invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
{

    [UIActionSheet showInView:self.view
                    withTitle:[[NSString alloc]initWithFormat:@"%@ would like to share %@ information with you.",peerID.displayName, (NSString *)context]
            cancelButtonTitle:@"Cancel"
       destructiveButtonTitle:@"Deny"
            otherButtonTitles:@[@"Accept"]
                     tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex) {
                         NSLog(@"%i",buttonIndex==1?true:false);
                         MCSession *newSession=[[MCSession alloc]initWithPeer:[[MCPeerID alloc] initWithDisplayName:@"CRAP23456"]];
                         [newSession setDelegate: self];
                         NSLog(@"button index %i ",buttonIndex==1?true:false);
                         invitationHandler(buttonIndex==1?YES:NO,newSession);
                     }];
}

上記のメソッドが呼び出され、招待ハンドラが正しい値を返しています。

ブラウザ側からの私の実装は非常に単純です。これは、ユーザーがメソッドを受け入れる/拒否するときに呼び出されるメソッドです。ただし、ユーザーが招待を辞退した場合にのみ呼び出されます。

 - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{
    NSLog(@"%d",state);
    NSLog(@"%ld",(long)MCSessionStateConnected);
}

前もって感謝します。

ジェームズ。

4

2 に答える 2

3

これらのいずれかが役立つことを願っています:

  • 実装する必要があることをここsession:didReceiveCertificate:fromPeer:certificateHandler:で 読みました。

  • 2 つのピア間でブラウジングと広告を一方通行の取引にします。つまり、両方ともブラウジングしている場合は、両方のエンドで招待を受け入れないでください (少なくとも招待を受け入れず、 でブラウジングしているのと同じセッションを通過させないでくださいinvitationHandler())。

  • 次のように、コードを didChangeState のブロックにラップします。 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%d",state); NSLog(@"%ld",(long)MCSessionStateConnected); });

于 2014-01-30T16:57:45.160 に答える
2

私もこの問題に遭遇しました。ブラウザ側のコードは次のようになります。

MCSession *session = [[MCSession alloc] initWithPeer:[self peerID]];
session.delegate = self;
[browser invitePeer:peerID toSession:session withContext:nil timeout:30.0f];

これに関する問題は、ブラウザーがセッションへの参照を保持しないため、ARC が来て、相手側が受け入れる機会を得る前にそれをクリーンアップすることです。

次のように変更すると、問題が修正されました。

_session = [[MCSession alloc] initWithPeer:[self peerID]];
_session.delegate = self;
[browser invitePeer:peerID toSession:_session withContext:nil timeout:30.0f];

.._session私のクラスの ivar はどこにありますか。

HTH

于 2014-06-16T20:49:26.347 に答える