1

マルチピア接続フレームワークと Nearby Services (ブラウザーと広告主の両方) を使用して、デバイス間で自動接続して少量のデータを交換するアプリを実装します。

すべての接続の詳細を処理するセッション マネージャーを作成しました。そのデリゲートは、データを受信したときに UI の更新を処理するためのビュー コントローラーです。

セッション マネージャーは以下を構築します。

  • サービス アドバタイザー、デリゲートはセッション マネージャーです
  • デリゲートがセッション マネージャーでもあるサービス ブラウザー

2 つのデバイス (1 つは Xcode でログを取得し、もう 1 つはスタンドアロン) でアプリを起動すると、サービス ブラウザーのデリゲートに対応するメソッドを介して Found Peer メッセージを受け取ります。

別のメッセージで述べたように、MCPeerID の displayName プロパティ (ローカルと受信ピアの両方) を比較して、どちらが招待を送信するかを決定し、相互招待を回避します。

ここの別のメッセージで述べたように、「オプションの」MCSessionデリゲートメソッドも追加しました- (void)session:didReceiveCertificate:fromPeer:certificateHandler:

ただし、(void)advertiser:didReceiveInvitationFromPeer:withContext:invitationHandler:MCNearbyServiceAdvertiser のデリゲート メソッドは呼び出されません。(void)session:peer:didChangeState:メソッドでタイムアウトを設定した後、MCSession デリゲート メソッドによって受信される NotConnected メッセージのみがありますinvitePeer:toSession:withContext:timeout:

提案されたさまざまなオプションで:

  • セッションはセキュリティ nil および MCEncryptionNone で初期化されます。
  • discoveryInfo は nil です。
  • 招待状で送信される context は、NSData としてアーカイブされた単なる短い文字列です。

トラブルシューティングするには:

  • すべてのアイテムが存在することを確認しました (セッションとそのデリゲート、広告主とそのデリゲート)。
  • アプリがアクティブである限り、Service Browser と Advertiser が停止することはありません。

どこを見渡せばいいのかわからない!

4

1 に答える 1

0

ローカル ピアに使用する MCpeerID が、検出フェーズと招待フェーズの両方で同じであることを確認してください。

接続/転送ワーカーとは別のセッション マネージャーを持つ構造がありました。ワーカーで新しい MCpeerID を初期化して、招待の前にセッションを作成するというミスを犯したため、同じ動作が発生しました。

MCpeerID と MCNearbyServiceBrowser をワーカーに渡してセッションを作成し、招待することで問題が修正されました。

于 2014-09-05T08:07:31.560 に答える