2009-08-13 5 views
0

저는 App Store에서 다소 인기있는 Bonjour 기반 응용 프로그램을 사용하고 있습니다. 완벽하게 작동하지만 사용자 중 약 0.2 %가 기괴한 버그를보고합니다. "화면 가장자리에 화살표가 나타나지 않아 다른 사람들과 물건을 공유 할 수 없습니다!" 물론이 화살표를 표시하는 것은 로컬 도메인의 특정 Bonjour 서비스를 찾아 보는 것과 관련이 있습니다.Bonjour가 탐색 중에 다시 전화를 걸지 않게하려면 어떻게해야합니까?

문제는 Apple 검토 팀이 간헐적으로이 0.2 %에있는 것으로 보입니다. 예상치 못한 결과는 검토 결과에 좋지 않습니다. 아무리 노력해도이 버그를 재현 할 수는 없습니다.

내가 가진 몇 가지 로그에서 내 앱이 올바르게 실행되고있는 것처럼 보입니다. 단지 NSNetServiceBrowser 대리인 호출을받지 못했습니다. 무엇이 이것을 일으킬 수 있습니까?

상황은 나는 시도했다 :

  • 의 길이가 < (14) 문자는 사양에 될 수있는 짧은 서비스 이름을 가졌어요.
  • @"" (별명은 기본 등록 도메인으로 이동)보다 @"local."에 게시. 어쨌든 내 응용 프로그램은 광역 네트워크에서 오히려 쓸모가 없습니다.

내가 시도하지 않은 것들 : 브라우징 기계를 주기적으로 재시작하십시오. (나는 두 개의 브라우저를 가지고 있지만 하나는 구형의 더 긴 이름을 찾고, 하나는 새로운 더 짧은 이름을 찾습니다.)

어떻게해야합니까?

+0

우리는 앱 스토어에 어떤 종류의 앱이 있는지 알지 못하지만 @ "지역"대신 @ ""을 사용해보십시오. '내 Mac으로 돌아 가기'(따라서 @ ""대신 @ "")를 통해 피어에 액세스하십시오. BTMM을 기반으로하는 동료에 액세스하려고 시도하면서 이러한 종류의 문제가 발생했습니다. – cocoafan

답변

0

일이 잘못 될 수있는 영역이 많이 있습니다. 델리게이트 메소드에 제공되는 NSNetService 인스턴스는 자동으로 릴리즈되기 때문에, 해당 메소드의 스코프를 범위 밖으로 재사용하려는 경우이를 유지해야합니다. 대부분의 사람들은 그것을 NSMutableArray 또는 NSMutableDictionary에 추가하여 자동으로 유지되고 컬렉션에서 제거 될 때만 자동으로 리사이즈됩니다. 코드에 해당하는 경우 개체를 추가하기 전에 컬렉션을 제대로 초기화했는지 확인하십시오. nil에 대한 메시지는 완벽하게 정상이므로 addObject : netService 메시지를 nil로 보낼 수 있습니다. 배열이나 사전을 초기화 한 적이 없다는 확실한 징후는 나타나지 않으며 모든 것이 잘 작동하는 것처럼 보입니다 ... 피어가 상태를 변경할 때, 연결을 시도 할 때 "신비하게"위임 메시지가 실행되지 않는다는 점만 제외하면 Bonjour에서 문제 해결을 시작하기에 가장 좋은 방법이라고 생각하는 Bonjour 문제 해결에 대해 자주 설명합니다. 그것은 우리에게 최고입니다.

백그라운드 스레드에서 네트워크 코드를 실행하는 앱에 대해 쉽게 놓친 한 가지 문제 : 해당 스레드에서 처리되지 않은 예외를 throw합니다. 이것은 스레딩에 대한 Cocoa/Unix의 규칙 때문에 전체 앱을 손상시키지 않고 발생할 수 있습니다. 네트워킹 코드가 "아무 이유없이 작동을 멈춘다"는 경우 iPhone 콘솔을 확인하고 오류 메시지를 기록 할 수 있습니다. objc_exception_throw 심볼에 중단 점을 설정했는지 확인하십시오.

자세한 내용은 내 개발자 블로그 "Troubleshooting Bonjour Networking for the iPhone" 전체 기사를 읽으십시오.

+0

NSNetService는 적절하게 메모리 관리되고, 살아 있으며 NSRunLoop에서 올바르게 스케줄 된 주 스레드에서 실행됩니다. (링크에 감사드립니다!) – millenomi

+0

두 생각. netService : didNotPublish : 메소드에서 이름 충돌을위한 에러 핸들러를 작성 했습니까? 아니면 public으로 'publish 대신 NSNetServiceNoAutoRename과 함께 publishWithOptions :를 사용하여 자동 이름 바꾸기를 비활성화 하시겠습니까?또한 공용 핫 스폿에서 피어가 로컬 도메인에서 서로를 "격리"(스위치의 PVLAN 에지 포트와 유사)하여 직접 통신하는 것을 방지하는 것이 점점 더 일반적입니다. 많은 값싼 장치에는이 옵션이 있습니다. 그것을 우아하게 다루는 것 외에는 그 주위에 방법이 없습니다. 이것은 Apple 테스터가 확인하는 것일 수 있습니다. – Zack