8

この質問を投稿することで、NDA に違反していないことを願っています。

新しいマルチピア接続を使用して、ブルートゥースを使用していくつかのファイルを近くのデバイスに送信しています。招待を送信することはできましたが、ユーザーが招待を受け入れるか辞退できる UIAlertView を表示する方法がわかりません。現在、ユーザーが送信すると、ファイルは自動的に保存され、承認/拒否のアラートは表示されません。

コードは次のとおりです。

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

しかし、警告があります:

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


DevicePeer = [MCPeerID alloc];
DevicePeer = peerID;
ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]];

// ask the user
UIAlertView *alertView = [[UIAlertView alloc]
                          initWithTitle:@""
                          message:@""
                          delegate:self
                          cancelButtonTitle:@"NO"
                          otherButtonTitles:@"YES", nil];
[alertView show];
 alertView.tag = 2;
}

およびアラート ビュー メソッド:

 - (void) alertView:(UIAlertView *)alertView
 clickedButtonAtIndex:(NSInteger)buttonIndex
{  
    // retrieve the invitationHandler
    // get user decision
    BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;
    // respond
    MCSession *session = [ArrayInvitationHandler objectAtIndex:0];

    void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];

    invitationHandler(accept, session);
}

ユーザーが [はい] を押すと、アプリがクラッシュし、次のエラーが表示されます。

[__NSMallocBlock__ nearbyConnectionDataForPeer:withCompletionHandler:]: unrecognized selector sent to instance 0x14d4e3b0'

私はIOS開発者ライブラリを調べましたが、他にそのような方法はありません

- (void)nearbyConnectionDataForPeer:(id)arg1 withCompletionHandler:(id)arg2{

}

これは機能しません。IOS 開発者フォーラムに関する情報はありません。何か案は?

4

2 に答える 2

9

Alessandro の言うとおりです。これは WWDC 2013 のビデオでは説明されていません。私はこれに苦労しました。

あなたは正しい道を進んでいると思います。論理エラーがいくつかあるだけです。次の 2 行がわかりません。

MCSession *session = [ArrayInvitationHandler objectAtIndex:0];
void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];

配列に格納されているオブジェクトは、単なるハンドラーです。そのクラッシュが発生する理由は、ブラウザがそれを認識しacceptてピアをセッションに接続しようとしているが、返されたセッションが nil であるためです。これを修正するには、作成した新しいセッションを戻す必要があります。

最初は、ブラウザー側で既にセッションが作成されている場合に新しいセッションを作成するという概念に戸惑いましたが、その後、ブラウザーからそのセッションをどこからでも取得できず、実際にセッションを戻すことができないことに気付きました。招待ハンドラーが存在しない場合は、招待ハンドラーに追加してください。

そうそう、代わりにこれをしてください:

BOOL accept = (buttonIndex != alertView.cancelButtonIndex) ? YES : NO;

// respond 
MCSession *session;
if(accept) {
   session = [[MCSession alloc] initWithPeer:peer];
   session.delegate = self;
}

void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0];
invitationHandler(accept, session);
于 2013-09-27T16:49:03.843 に答える