2009-08-13 5 views
0

Ich habe eine sehr beliebte Bonjour-basierte Anwendung im App Store. Es funktioniert perfekt, aber etwa 0,2% meiner Benutzer melden einen bizarren Fehler: "Es erscheinen keine Pfeile an den Bildschirmrändern, also kann ich keine anderen Personen mit anderen teilen!". Unnötig zu erwähnen, dass das Anzeigen dieser Pfeile an das Durchsuchen eines bestimmten Bonjour-Dienstes in der lokalen Domäne gebunden ist.Was kann dazu führen, dass Bonjour mich während des Surfens nicht zurückruft?

Das Problem ist, scheint das Apple-Review-Team intermittierend in diesen 0,2% zu sein. Dies ist nicht gut für Review-Ergebnisse, wie Sie sich vorstellen können. Egal wie sehr ich es versuche, ich kann diesen Fehler nicht reproduzieren.

Aus den wenigen Logs, die ich habe, sieht es so aus, als ob meine App korrekt läuft, nur NSNetServiceBrowser Delegiertenanrufe erhalten. Was kann das verursachen?

Dinge, die ich habe versucht:

  • einen kürzeren Namen < 14 Zeichen lang in spec zu haben.
  • Publishing auf @"local." statt @"" (aka Go Suche nach der Standard-Registrierungsdomäne). Meine App ist sowieso in einem Wide-Area-Netzwerk ziemlich nutzlos.

Dinge, die ich nicht versucht habe: die Browsing-Maschinen regelmäßig neu starten. (Ich habe jedoch zwei Browser, von denen der eine den längeren Namen sucht, der andere für den neuen.)

Was ist zu tun?

+0

Obwohl wir nicht wissen, welche Art von App Sie im App Store haben, versuchen Sie auch, @ "" anstelle von @ "local" zu verwenden. UND versuchen Sie, über "Zurück zu meinem Mac" (also @ "" statt @ "local") auf Peers zuzugreifen. Ich hatte solche Probleme beim Versuch, über BTMM gegründete Peers zu erreichen. – cocoafan

Antwort

0

Es gibt viele Bereiche, in denen Dinge schief gehen können. Da die NSNetService-Instanz, die für Ihre Delegatmethoden bereitgestellt wird, automatisch freigegeben wird, müssen Sie sie beibehalten, wenn Sie sie für die betreffende Methode nicht mehr verwenden möchten. Die meisten Benutzer fügen sie einem NSMutableArray- oder NSMutableDictionary-Objekt hinzu, so dass sie automatisch beibehalten und nur dann automatisch freigegeben werden, wenn sie aus der Sammlung entfernt werden. Wenn dies für Ihren Code der Fall ist, stellen Sie sicher, dass Sie Ihre Sammlung ordnungsgemäß initialisiert haben, bevor Sie das Objekt hinzufügen. Da Nachrichten an nil vollkommen in Ordnung sind, senden Sie möglicherweise die Nachricht addObject: netService an nil. Sie erhalten keinen offensichtlichen Hinweis darauf, dass Sie Ihr Array oder Wörterbuch nie initialisiert haben, und es sieht so aus, als ob alles gut funktioniert ... außer dass Delegiertennachrichten "geheimnisvoll" nicht ausgelöst werden, wenn Peers ihren Status ändern, wenn Sie versuchen, eine Verbindung herzustellen zu einem usw. Dies kommt oft genug in Bonjour Problembehandlung, die ich als erster Ort empfehlen würde, um Ihre Fehlersuche zu starten. Es passiert den Besten von uns.

Ein Problem leicht verpasst für Anwendungen, die Netzwerk-Code auf einem Hintergrund-Thread ausführen: Werfen einer nicht behandelten Ausnahme auf diesen Thread. Dies kann passieren, ohne dass Ihre gesamte App aufgrund der Cocoa/Unix-Regeln beim Threading abstürzt. Wenn Ihr Netzwerkcode "einfach aus irgendeinem Grund nicht mehr funktioniert", sollten Sie Ihre iPhone-Konsole überprüfen und nach Fehlermeldungen suchen. Stellen Sie sicher, dass Sie einen Haltepunkt für das Symbol objc_exception_throw festgelegt haben.

Für mehr, lesen Sie den vollständigen Artikel "Troubleshooting Bonjour Networking for the iPhone" auf meinem Dev Blog.

+0

Der NSNetService ist ordnungsgemäß im Speicher verwaltet, aktiv und läuft auf dem Hauptthread, der ordnungsgemäß auf NSRunLoop geplant ist. (Danke für den Link!) – millenomi

+0

Zwei Gedanken. Haben Sie in Ihrem netService einen Fehlerhandler für Namenskollisionen geschrieben: didNotPublish: method oder verwenden Sie publishWithOptions: nebst NSNetServiceNoAutoRename statt plain ol publish, um die automatische Umbenennung zu deaktivieren?Außerdem wird es immer häufiger für öffentliche Hotspots verwendet, dass Peers nicht direkt in der lokalen Domäne miteinander kommunizieren, indem sie diese "isolieren" (ähnlich wie bei PVLAN-Edge-Ports auf einem Switch). Viele günstige Geräte haben diese Option. Es gibt keinen anderen Weg, als es elegant zu handhaben. Dies ist möglicherweise das, wonach die Apple-Tester suchen. – Zack