Konrád getrennt Kollegen
Ich bin mit dem iOS 7 Multipeer Rahmen in meiner app, aber ich hab ein problem mit Geräten zu trennen. Wenn ich die app öffnen, auf zwei Geräten: Gerät A und Gerät B die beiden Geräte verbinden sich automatisch. Jedoch, nach einigen Sekunden Gerät trennt die Verbindung von Gerät B. also zuerst die Verbindung ist wie folgt:
A ---> B
A <--- B
Nach einigen Sekunden:
A ---> B
A B
Gerät Einen pflegt es die Verbindung, aber das Gerät B eine MCSessionStateNotConnected.
Dies bedeutet, dass Ein can-Daten senden zu B, aber B kann nicht Antworten. Ich habe versucht, dies zu umgehen, indem überprüft wird, ob das Gerät angeschlossen ist und wenn nicht, dann re-initiieren Sie die Verbindung mit:
[browser invitePeer:peerID toSession:_session withContext:Nil timeout:10];
Aber die didChangeState Rückruf bekommen nur heißt mit MCSessionStateNotConnected.
Seltsam wenn ich Eine app in den hintergrund, dann öffnen Sie es erneut, B verbindet und die Verbindung wird aufrecht erhalten.
Die Multipeer-API (und Dokumentation) scheint ein wenig spärlich, so war ich der Annahme, dass es nur funktionieren würde. In dieser situation, wie sollte ich Sie wieder verbinden Sie das Gerät?
- Ist es eine lokale oder physisches problem? Haben Sie versucht, zu tun etwas tracepath zwischen jedem B zu A?
- Ich bin mir ziemlich sicher, dass es nicht ein physisches problem, da ich in der Lage gewesen, zu erhalten eine stabile bluetooth-Verbindung manuell mit DNS-SD und CFSockets. Es scheint eine MultiPeer problem.
- Ah Sorry, ich dachte, es war aus der Ferne mit internet, aber es ist bluetooh!
- Sind Sie beim surfen und Werbung auf der gleichen Zeit? Tun A und B beide laden und zu akzeptieren?
- Ja - wollte nur, Sie zu prüfen, wurden im gleichen Boot wie ich mich vor angeboten eine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem, und es scheint im Zusammenhang mit meiner app Browsen und die Werbung auf der gleichen Zeit, und zwei Einladungen gesendet/angenommen. Als ich aufgehört habe, dies zu tun und lassen Sie sich von einem peer zu verschieben, die andere für die Einladungen, die die Geräte in Verbindung geblieben.
In meinem browser delegieren, ich bin der überprüfung der hash-Wert der entdeckten Peers
displayName
und nur das senden einer Einladung, wenn mein peer hat einen höheren hash-Wert:Bearbeiten
Wie bereits von @Masa die
hash
Wert einesNSString
werden verschiedene, auf 32-und 64-bit-Geräte, so ist es sicherer, verwenden diecompare:
Methode aufdisplayName
.Wie Sie sagen, die Dokumentation ist spärlich, also wer weiß, was Apple wirklich von uns möchte, aber ich habe ausprobiert, sowohl das senden und annehmen von Einladungen mit einer einzigen Sitzung, und auch die Erstellung einer neuen Sitzung für jede Einladung angenommen/verschickt, aber diese Besondere Art und Weise, Dinge zu tun, hat mir den meisten Erfolg.
[[NSUUID UUID] UUIDString]
produzieren einen anderen string unabhängig von der device-nameif myPeerId.hash > peerID.hash
) kann nicht genug sein, da das Ergebnis möglicherweise anders auf zwei Endgeräte (iPhone 7 in meinem Fall) mit der gleichen OS-version (iOS 12.0.1). Ich habe eine situation, womyPeerId.hash
ist niedriger alspeerID.hash
auf beide Geräte, und dann keine Einladung senden?Für alle interessierten, ich habe MCSessionP2P, eine demo-app, die zeigt, die ad-hoc-networking-Funktionen von
MCSession
. Die app sowohl für sich wirbt, die auf dem lokalen Netzwerk und programmatisch verbindet, zur Verfügung zu Gleichaltrigen, Aufbau einer peer-to-peer-Netzwerk. Hat tip an @ChrisH für seine Technik der Vergleich der hash-Werte für die einladenden Kollegen.MCBrowserViewController
undMCAdvertiserAssistant
Ich mochte ChrisH ' s Lösung, das zeigt die zentrale Erkenntnis, dass nur ein peer sollte die Verbindung zu dem anderen peer, nicht beide. Die gegenseitige Verbindung versucht, die Ergebnisse in gegenseitigen Trennung (wenn auch nicht, dass eine einseitige Verbindung tatsächlich ist, counter-intuitiv, ist eine gegenseitige Verbindung, die in Bezug auf status und Kommunikation haben, damit das funktioniert).
Jedoch, denke ich, ein besserer Ansatz als ein peer einladenden ist für beide Kollegen einladen, aber nur eine peer-to - akzeptieren. Ich benutze diese Methode jetzt und es funktioniert großartig, denn die beiden Kollegen haben eine Gelegenheit zu pass-rich Informationen, die andere über die
context
parameter der Einladung, statt sich darauf zu verlassen, dürftigen Informationen, die in derfoundPeer
delegate-Methode.Daher empfehle ich eine Lösung, etwa so:
Ich habe das gleiche Problem, wenn die Geräte versuchen, eine Verbindung zu jedem anderen in der gleichen Zeit, und ich weiß nicht, wie, einen Grund zu finden, denn wir haben keine Fehler mit MCSessionStateNotConnected.
Wir können einige crafty Weg, um dieses Problem zu lösen:
In txt-Datensätze ( discovery-info ) eine Zeit [[NSDate date] timeIntervalSince1970], wenn app gestartet. Wer zuerst gestartet - Einladung senden, um andere.
Aber ich denke, es ist nicht eine richtige Weg ( wenn apps zur gleichen Zeit starten, unwahrscheinlich... 🙂 ). Wir müssen herausfinden, der Grund.
Dies ist das Ergebnis eines Fehlers, das habe ich an Apple berichtet. Ich habe erklärt, wie es zu beheben in meiner Antwort auf eine andere Frage: Warum funktioniert mein MCSession peer trennen Sie nach dem Zufallsprinzip?
Habe ich nicht gekennzeichnet werden, diese Fragen für die Zusammenführung, denn während sich der zugrunde liegende Fehler und Lösung sind die gleichen, die zwei Fragen beschreiben unterschiedliche Probleme.
Speichern Sie den Hashwert des peer B. Mit einem timer überprüfen Sie den Zustand der Verbindung ständig, wenn Sie nicht angeschlossen ist, versuchen, wieder mit der jeweils vorgegebenen Dauer.
Laut apple-Dokument Die Wahl einer einladenden, wenn mit Multipeer-Konnektivität
"In iOS 7, senden gleichzeitige lädt verursachen können, beide lädt zu scheitern, verlassen die beiden Kollegen nicht in der Lage, miteinander zu kommunizieren."
Aber iOS 8 hat es behoben.