0

私は App Store でかなり人気のある Bonjour ベースのアプリケーションを持っています。それは完全に機能しますが、私のユーザーの約 0.2% が奇妙なバグを報告しています:「画面の端に矢印が表示されないので、他の人と共有できません!」. 言うまでもなく、これらの矢印の表示は、ローカル ドメイン上の特定の Bonjour サービスの参照に関連付けられています。

問題は、Apple のレビュー チームが断続的にこの 0.2% に入っているように見えることです。ご想像のとおり、これはレビュー結果には適していません。何度やってもこのバグは再現できません。

NSNetServiceBrowser私が持っているいくつかのログから、デリゲート呼び出しを受信して​​いないだけで、アプリが正しく実行されているようです。何が原因でしょうか?

私が試したこと:

  • 仕様上、長さが 14 文字未満の短いサービス名を持つこと。
  • @"local."ではなく公開します@""(別名 Go Look For The Default Registration Domain)。とにかく、私のアプリは広域ネットワークではかなり役に立ちません。

私が試していないこと: ブラウジング マシンを定期的に再起動します。(ただし、私は 2 つのブラウザーを持っています。1 つは従来の長い名前を探し、もう 1 つは新しい短い名前を探しています。)

何をすべきか?

4

1 に答える 1

0

物事がうまくいかない可能性がある多くの領域があります。デリゲート メソッドに提供される NSNetService インスタンスは自動解放されるため、そのメソッドの範囲外で再利用する場合は保持する必要があります。ほとんどの人は、それを NSMutableArray または NSMutableDictionary に追加して、自動的に保持し、コレクションから削除されたときにのみ自動解放されるようにします。コードがそのような場合は、オブジェクトを追加する前に、コレクションが適切に初期化されていることを確認してください。nil へのメッセージはまったく問題ないので、addObject:netService メッセージを nil に送信している可能性があります。配列やディクショナリを初期化していないという明確な兆候を受け取ることはなく、すべてが正常に機能しているように見えます.ピアがステータスを変更したときにデリゲートメッセージが「不思議なことに」発火しないことを除いて. これは、Bonjour のトラブルシューティングで頻繁に発生するため、トラブルシューティングを開始する最初の場所としてお勧めします。それは私たちの最高に起こります。

バックグラウンド スレッドでネットワーク コードを実行しているアプリで見逃されがちな問題の 1 つは、そのスレッドでハンドルされない例外をスローすることです。これは、Cocoa/Unix のスレッドに関する規則により、アプリ全体をクラッシュさせることなく発生する可能性があります。ネットワーク コードが「理由もなく機能しなくなった」場合は、iPhone のコンソールとログでエラー メッセージを確認することをお勧めします。objc_exception_throw シンボルにブレークポイントを設定したことを確認してください。

詳細については、私の開発者ブログの記事「iPhone の Bonjour ネットワークのトラブルシューティング」を参照してください。

于 2010-01-18T00:50:44.207 に答える