2016-01-04 1 views
14

MCフレームワークを通信チャネルとして使用するプロジェクトに取り組んでいます。いくつかのテストの後、私はこのチャネルが何らかの形で信頼できないと感じています。マルチプラ接続のフレームワーク:安定性と推奨事項

私は適切なフレームワークを使用するためには、Appleのドキュメンテーションやビデオを、以下の、しかし、それが起こるしてきた

  • ピアが私は1つ以上のペアならば、多くの場合、後にさらにofterペアリング、および「ちょっと切り離しますピア。
  • いくつかのデータパッケージは、データ

を混合しているフレームワークで動作するように勧告のいずれかの種類がありますか? つまり:

  • 特定のプロジェクト設定ですか? (有効にする必要がある機能セクションに何かがありますか?)
  • マルチスレッドの制限はありますか? (つまり、常に同じスレッドからmcメソッドを呼び出す)
  • 送信するデータ量の制限はありますか?

this私は、ストレス下でokを実行しないフレームワークについて何か言及しています。それは私が探しているようなアドバイスです:)。レコードの

:私は私のために働いていないので、Apple's projectthisポストに基づいて実装を使用してい

  • 私は
  • 暗号化のプリファレンスがピアとの通信にsendData:sendResourceAtURL:を使用してMCEncryptionNone
  • に設定されているとのペアリングしようとするすべてのピアのために一つだけMCSessionを使用しています。
+3

新しいMacBook ProとiPhone 6S Plusでさえ、AirDropがいかに奇しくて、どうやって動かすことができたかを考えると...これはちょっとしたことだと思うし、Appleは恥ずかしいはずだ。それは、iCloudが最初に公開したときのように、その文書をゴミと同期させようとした人の誰かが、最初に木製のチッパーの足に飛び乗るようなものでした。 – CommaToast

+0

ブラウジング/広告ピアが同じデバイス上で同時に実行されないと、安定性が向上すると私はどこかで読んでいます。私のアプリでは、マスターデバイスだけがピアをブラウズし、私のスレーブはアドバタイズします。少し遅れて接続が切断され、接続が切断されたようです。希望が役立ちます。 –

+0

「PubNubを使ってください」:/ – Fattie

答えて

2

私はゲームでMCのフレームワークを使用していますし、その見かけの不安定性のためにいくつかの回避策を発見した:私は「キープアライブ」トランザクションは上の活動を維持するために、15秒ごとに送信された使用)

1リンク。私はこれが、私が経験していた接続損失のほとんどを解決することが分かった。

2)データ受信によってトリガされたすべての処理をメインスレッドにディスパッチし、スレッド間でMCPeerオブジェクトもMCSessionオブジェクトも持ち越さない(初期接続プロトコルを除く)。また、データ受信コードで費やされる時間を最小限に抑えて、MCが使用するスレッドを可能な限り高速に回復させるようにしました(いくつかの切断の原因となっていました)。私はデータの送信にこのルールを適用しません(受信時のみ)

3)接続を確立しようとしたときに表示されるピアの繰り返しに対する清潔な解決策は見つかりませんでした。 。これまでMCPeer IDを比較して重複を避けることは、重複の一部を削除するように見えます。また、同じMCSessionを広告(MCAdvertiserAssistant)に使用してピアに接続すると競合が発生したため、アシスタントを起動するたびに新しいMCSessionインスタンスを使用していたようです。

+0

ねえ、ありがとう。スレッドについては、それは当てはまりますが、ドキュメントにはヒントがあります。 2と3については、それが安定性を改善するかどうかを調べるつもりです。 Cheers – Omer

0

大量のデータを定期的に転送するアプリで使用しています。回避策のカップルが助けた:

  • をできるだけ早くピアへの接続が確立されると、通信に使用するNSOutputStream/NSInputStreamペアを設定します。マルチペーダー接続フレームワークでは、データ送信またはリソース送信メソッドを使用しないでください。

  • 予期しない切断が発生した場合は、MCSessionオブジェクトの状態を信頼できません。破棄して最初からやり直してください。 UPDATE:予期しない切断は、ストリームのいずれかが接続のもう一方の端で閉じられていることです。

  • すべてのデバイスが同じWiFiアクセスポイントにあることを確認するようにユーザーに指示します。ピアが同じネットワークセグメントにあるが、異なるWi-Fiを使用している場合、ブラウザは広告主に接続して接続できますが、数秒後に切断されます。

更新:

出力ストリームを確立するには:このメソッドを実装し、入力ストリームを確立するために

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state 
{ 
    switch(state) 
    { 
     // ... 

     case MCSessionStateConnected: 
      outputStream = [session startStreamWithName:@"Stream" toPeer:peerID error:&error]; 
      // Setup a stream handler for the stream and open it 
      break; 
     // ... 
    } 
} 

MCSessionDelegateです:

-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID 
{ 
    // Setup a stream handler for the stream and open it 
} 

これはと呼ばれます接続のもう一方の端が出力ストリームを開きます。

これで、双方向通信に使用できる2つのストリームが用意されました。

+0

あなたの時間、いくつかの点をありがとう:•NSStreamとMCを正しい方法で使用する方法のリンク?現在のところ実装がありますが、正しいかどうかはわかりません。 •「予期しないエラーが発生しました」とはどういう意味ですか?セッションが壊れているシナリオを特定する方法は? – Omer

関連する問題