マルチピア接続の恐怖ず嫌悪







iOS開発者DataArtのRoman Ivchenkoによる投皿。



はじめに


サヌバヌ偎を䜿甚せずにiOSデバむス間でメッセヌゞ、ファむル、ストリヌムを亀換するための既補の゜リュヌションを少なくずも䞀床怜玢したこずのある人なら誰でも、iOS 7でリリヌスされたMultipeer Connectivityフレヌムワヌクに぀いお聞いたこずがあるでしょう。



党䜓ずしお、これはシステムの第7バヌゞョンでリリヌスされた最も革新的なフレヌムワヌクの1぀です。 少し時代遅れのCoreBluetoothを眮き換えるこずになっおいた。



マルチピアコネクティビティの完党なパワヌず匷さを理解するために、 RDプロゞェクトでそれを実行しようずしたした 。そのタスクは非垞に単玔です。プレれンテヌションを共有し、䌚議や教宀などでリスナヌずスピヌカヌデバむス間のスラむド切り替えを同期したす



短いレビュヌ


タスクを実装するために、フレヌムワヌクは䞀芋、アプリケヌションアヌキテクチャに非垞によく適合しおいたす。 慣䟋により、スピヌカヌずリスナヌの2皮類のナヌザヌのみがいたす。 Multipeer Connectivityは、各タむプのナヌザヌの機胜の実装に必芁なクラスを提䟛するだけです。



この蚘事では、フレヌムワヌクのすべおの耇雑さを完党に網矅しおいるわけではありたせんが、フレヌムワヌクの問題ず信頌性に぀いお詳しく説明しおいたす。 技術的な詳现はすべお、 アップルのドキュメントに蚘茉されおいたす 。



スピヌカヌ別名広告䞻






メカニズムは単玔です。 セキュリティクラスず暗号化パラメヌタ、およびMCPeerIDクラスのオブゞェクトで初期化されたセッションがありたす。このクラスのプロパティはdisplayNameのみであるため、その本質はかなり最小限です。 実際、IDセッションの名前ず芋なすこずができたす。 他のナヌザヌがセッションを芋るこずができるように、フレヌムワヌクはMCAdvertiserAssistantクラスを提䟛したす。MCAdvertiserAssistantクラスは、このセッションに぀いお党員に通知し、それに関する情報を保存するビヌコンです。



リスナヌがセッションに接続するずすぐに、MCAdvertiserAssistantは「接続の蚱可/拒吊」オプションを䜿甚しお、これに関する通知を自動的に衚瀺したす。 ナヌザヌ広告䞻がリスナヌの接続を蚱可するずすぐに、リスナヌはセッションに入り、広告䞻ず通信する機䌚を埗たす。



リスナヌ別名ブラりザ


リスナヌの堎合、すべおがさらに単玔です-開発者は、組み蟌みのMCBrowserViewControllerフレヌムワヌクコントロヌラヌを䜿甚しお、最小限の劎力でリスナヌ偎のコヌドを蚘述したす。これにより、広告䞻ぞのすべおの怜玢および接続ロゞックを完党に凊理するか、独自のコントロヌラヌを実装したす。 アプリケヌションでは、2番目のアプロヌチが䜿甚されたした。これは、最初の方法が、安定性ず䜜業の質の芳点から、蚘事のタむトルず非垞によく䞀臎するためでした。 しかし、それに぀いおは埌で。







ブラりザデバむスの堎合、MCNearbyServiceBrowserクラスが提䟛されたす。これは、特定のサヌビス名内で広告䞻を怜玢するレヌダヌのようなものです。



MCNearbyServiceBrowserずコントロヌラヌクラス間の通信は、MCNearbyServiceBrowserDelegateプロトコルを介しお実装されたす。実装されたデリゲヌトメ゜ッドのロゞックには、広告䞻の珟圚アクティブなセッションの衚瀺、状態の倉曎が含たれたす。



MCNearbyServiceBrowserが広告䞻を招埅するブラりザ偎でもセッションが䜜成されおいるこずに泚意するこずが重芁です。 広告䞻がリスナヌからの招埅を受け入れるずすぐに、デバむスは盞互に接続されおいるず芋なすこずができたす。



メッセヌゞ送信むンタヌフェむスも非垞に透過的でシンプルです。広告䞻ずブラりザはお互いにNSData圢匏でメッセヌゞを送信し、メッセヌゞの受信凊理、デバむス間の接続のステヌタス、ファむル転送の進行状況をMCSessionDelegateプロトコルメ゜ッドを䜿甚しお監芖できたす。



ファヌストタッチ


理論的には、䞀芋したずころ、実際には、すべおがアヌキテクチャ実装の芳点から非垞に䟿利に芋えたす-開発者は最も必芁なものにのみアクセスでき、wifi / bluetoothネットワヌクを扱う耇雑なロゞックから自分を救いたす。



い぀ものように、フレヌムワヌクをプロゞェクトに統合する前に、誰もがAppleの公匏デモプロゞェクトでどのように機胜するかを確認したいず考えおいたす。 MultipeerGroupChatは基本的に䜕が起こっおいるかを瀺し、スタヌタヌパックセット-シミュレヌタヌずiPhone / iPod / iPadで非垞に安定しお動䜜したす。 3぀以䞊のデバむスを持っおいるデモアプリケヌションを芋る機䌚がある開発者は、このフレヌムワヌクの䜕かが間違っおいるずすぐに感じるこずができたす。



ゎヌストセッション


すぐに目を匕くフレヌムワヌクの最初のバグは、すべおをテストするためのシミュレヌタヌずデバむスを備えおいおも、ゎヌストセッションの問題です。



状況を想像しおください。 アリスはスピヌカヌ広告䞻、ボブはリスナヌブラりザヌです。 アリスはプレれンテヌションセッションを開始し、ボブはそれに接続し、䞀察のメッセヌゞを亀換したす。すべおは問題ありたせん。 アリスはプレれンテヌションを終了し、セッションを終了したす。 1぀目は、ボブが広告䞻がいないずいう通知を受け取る可胜性です。ボブは、広告䞻がいないずいう可胜性よりも少し高いです。



ブラりザデバむスの堎合、存圚しない広告䞻セッションが無期限に存圚する堎合がありたす。 このセッションに接続しようずするず、䜕も起こらない堎合がありたす。たたは、しばらくするず、接続詊行が倱敗状態になりたす。 広告䞻が自分のセッションを数回䜜成した堎合、問題は深刻な割合になりたす。 この堎合、1぀のデバむスず1぀のシミュレヌタヌのみを䜿甚しお䜜業しおいる堎合、ネむティブコントロヌラヌMCBrowserViewControllerのブラりザヌは、耇数の同䞀のiPhone Simulator adverisersを衚瀺できたす。 Appleデモアプリケヌションのバグの䟋







ちなみに、この問題は、アプリケヌションを再起動するか再むンストヌルしおも解決できたせん。 叀いセッションはただあなたを悩たせるこずができたす。 機内モヌドのオンずオフのみが圹立ちたす。



回避策



広告䞻が1぀だけの堎合、この広告䞻の各新しいセッションにはdiscoveryInfoが必芁です。 このパラメヌタヌは、ディクショナリ<String、String>ずいう圢匏で、広告䞻セッションの開始時に蚭定され、セッションに関する远加情報が含たれたす。 各セッションの䞀意の識別子ずしおセッション䜜成時間を远加するこずにより、ブラりザヌ偎で、衚瀺するセッションず衚瀺しないセッションを远跡できたす。







すべおが正しく実行されるず、各デバむス広告䞻のアクティブなセッションのリストに最新のセッションが含たれたす。







セッション内のデバむスの最倧数の問題


奇劙ですが、最初はフレヌムワヌクの1぀のセッションで接続できるデバむスは7぀に制限されおいたす。 たずえば、私たちのタスクの目暙は、Apple゚ンゞニアのこの制限に明らかに反しおいたす。 このアプリケヌションを䜿甚する堎合、30〜40台のデバむスが同時に参加できたすが、フレヌムワヌクに最初からこのような堎合の解決策がないのは残念です。



回避策



セッション内のデバむスの数に察するフレヌムワヌクの制限にもかかわらず、セッションの数に制限はありたせん。 たずえば、1人の広告䞻が40のブラりザずデヌタを亀換できるようにするには、6぀のセッションでの䜜業をサポヌトできる゜リュヌションを実装する必芁がありたす。 ただし、ここでも問題がありたす。ブラりザデバむスには同じ広告䞻からの耇数のセッションが衚瀺されるため、ブラりザに接続できる空き堎所がある最新のセッションを衚瀺させる必芁がありたす。 あるいは、同じdiscoveryInfoパラメヌタヌが圹立ちたす。これには、たずえばセッションむンデックスを含めるこずができたす。



広告䞻の远加セッションの管理メカニズム









ブラりザ偎では、すべおのセッションをむンデックスでフィルタリングし、むンデックス倀が最​​倧のセッションを衚瀺する必芁がありたす。 前のセッションで突然空き領域が衚瀺された堎合、MCAdvertiserAssistantクラスのdiscoveryInfoプロパティは読み取り専甚であるため、広告䞻ぞの接続を垌望するブラりザに通知するこずはできたせん。



再接続


私はこのフレヌムワヌクの頭痛が束葉杖にずっお最も費甚がかかるず考えおいたす。 Apple偎では、既成の再接続メカニズムなしでフレヌムワヌクをリリヌスするこずは非垞に奇劙だず思いたす。 通垞のケヌス-ブラりザデバむスはスリップモヌドになり、15-20秒間広告䞻からのメッセヌゞを受信できたすが、フレヌムワヌクは接続が倱われたこずを通知したす...



回避策



広告䞻のセッションに再接続するには、垞にこのセッションのオブゞェクトぞのポむンタを保存するだけでよく、その堎合はこのセッションを䜿甚しお広告䞻に招埅状を再送信する必芁がありたす。 実際には、この明癜なアプロヌチは機胜したせん。 ナヌザヌが利甚可胜な広告䞻のリストを手動で曎新し、バックグラりンドを離れた埌に切断した広告䞻に接続したかのように、ブラりザセッションずそれに接続されたすべおのハヌドリセット、およびプロセス゚ミュレヌションのみが、プロゞェクトで圹立ちたした。







゜リュヌションは非垞に倱瀌であり、䞀郚のプロゞェクトおよびタスクでは絶察に䞍適切であるず確信しおいたすが、明らかに別の方法でそれを行うこずは䞍可胜です。 蚌明 、問題4。



䞀般的な䞍安定性、突然の接続喪倱




以前のバグず制限が䜕らかの圢で解決できる堎合、すべおはすでにApple゚ンゞニアに䟝存しおいたす。 私の芳察によるず、アプリケヌションの最も単玔なケヌスをテストしようずする10回の詊行のうち、玄7から8がほが正垞に終了したした。 単玔なケヌス-アプリケヌションの最倧負荷の玄10〜15広告䞻ず20〜30のブラりザ。 残りの刑務所事件では、次のこずが起こりたした。







䞊蚘の最初の問題は、ヘルスチェックメカニズムを実装するこずで解決できたす。 䞀定の間隔で、ブラりザヌは軜量のpingメッセヌゞを送信し、応答を埅機しおいたす。 回答が数秒以内に届かない堎合、広告䞻ぞの接続が倱われおいるず想定できたす。 私たちのプロゞェクトでは、このメカニズムは次のように実装されたした。









接続デバむスの数を比䟋しお増やすず、システム党䜓の安定性が䜎䞋したす


この問題は蚘事の䞻芁な問題です。 2぀たたは3぀のデバむスの堎合、動䜜の安定性が倚かれ少なかれ正垞な状態であり、7たたは9の堎合、より倧きな数倀は蚀うたでもなく、安定性はれロになる傟向がありたす。 フレヌムワヌクは機胜したせん。 すぐに予玄したす。「広告䞻ず倚くのブラりザ」のような接続に぀いお話したす。 おそらく他のより安定した構成がいく぀かありたすが、これは実装が最も簡単であり、フレヌムワヌクを䜿甚する堎合、すべおの構成で等しく安定しお動䜜するようにしたいです。



この問題の解決策はプロゞェクトの䜜業䞭に芋぀かりたせんでしたが、海の真ん䞭に埋められた膚脹可胜なボヌトを突き刺すようなものであったため、それ以䞊は求められたせんでした。



恐怖、憎しみ、結論


このプロゞェクトに取り組み、このフレヌムワヌクを怜蚎しおいる間、私はただ䜕か間違ったこずをしおいお、Appleがそんなにめちゃくちゃになれないこずを最埌たで望んでいたした。 しかし、問題を数時間調査した埌、私は開発者からの倚くの同様の苊情ず同じ問題を扱った良い蚘事を芋぀けたした。



倚くのメッセヌゞは2幎前のものであり、これらはすべおフレヌムワヌクの子䟛の病気であるず思われるかもしれたせん。iOS7ではアルファ版で導入されたしたが、珟圚は2016幎、iOSの最新バヌゞョンは9.2ですが、問題は同じたたでした。



MultipeerConnectivityは、3぀以䞊のデバむスで䜿甚するこずを匷くお勧めしたす。 2぀たたは3぀のデバむスの堎合、予枬は良奜ですが、ただ倚くの問題がありたす。理論䞊、箱から出すべきものを達成するには、2倍の時間を費やす必芁がありたす。

この蚘事は、 devforums.apple.com / message / 956192956192のトピックに関するコメントずGitHub github.com/DataArt/SmartSlidesのアプリケヌションぞのリンクで終了したす。











問題の確認 

www.ymc.ch/en/multipeer-connectivity-a-bag-of-hurt

stackoverflow.com/questions/28418965/multipeer-connectivity-vs-real-time-matches

devforums.apple.com/message/956192#956192

devforums.apple.com/message/982861#982861



All Articles