봉쥬르/NSNetServiceBrowser 서비스 검색에 와이파이 및 블루투스를 모두 활용하는 것입니다 - 적어도 지원되는 장치에. 서비스를 검색 할 때마다 WiFi 및 블루투스를 검색합니다 (아이폰의 콘솔에서 확인할 수 있음). 시뮬레이터 "장치"가 블루투스를 사용할 수 없기 때문에 iPhone이 WiFi를 통해이를 발견합니다. 그러나 NSNetService를 사용하여 iPhone에 게시하는 경우 Wi-Fi 및 블루투스 (게시 및 지원되는 경우)를 통해 게시하고 있습니다. BT 가능 하드웨어에서 실행될 때 NSNetServiceBrowser는 두 인스턴스를 정교하게 찾아서 대리자 콜백을 통해보고합니다.
블루투스 PAN 설정은 Wi-Fi를 통한 게시보다 시간이 오래 걸리기 때문에 Wi-Fi 기반 서비스가 모두 발견되고 해결 된 후에 BT 발견 서비스가 자주 표시됩니다. 두 개의 실제 장치를 테스트 할 때 두 가지 서비스가 내 UI에 표시되는 것을 보았습니다 (대개 다른 전화 충돌이 발생한 후에 만).
하지만 다소 실망스러운 코딩을합니다. 가장 좋은 방법은 netService : didNotResolve :를 사용하여 (i) 해상도를 다시 시도하거나 (ii) netService 인스턴스를 무효화하고 다른 휴대 전화가 앱을 다시 시작하기를 기다리는 것입니다.
또한, 일이 잘못 갈 수있는 다른 분야의 몇 가지가 있습니다. 제공된 NSNetService 인스턴스는 자동으로 릴리즈되기 때문에이를 유지해야합니다. 대부분의 사람들은 그것을 NSMutableArray 또는 NSMutableDictionary에 추가합니다. 이 경우 개체를 추가하기 전에 제대로 초기화했는지 확인하십시오. nil에 대한 메시지는 완벽하게 정상이므로 addObject :를 보내지 않으면 모든 것이 정상적으로 작동하는 것처럼 보입니다. 그것을 제외하고는. 이것은 Bonjour 문제 해결에서 매우 자주 발생하며 우리를 위해 최선을 다합니다. NSNetService가 실행중인 runloop과 기본 모드 또는 공통 모드에서 실행중인 runloop으로 예약되었는지 확인하십시오.
Apple에 공개 된 버그 (10/4/09 기준)로 인해 Bonjour 업데이트로 인해 대리인 메서드가 실행되지 않는 경우가 종종 있습니다. 나는 3GS에서만 발생하는 것을 관찰했다. 결과는 네트워크와 동기화되지 않은 클라이언트 응용 프로그램입니다.
서비스가 (공칭 조건에서) 네트워크를 떠날 때 NSNetServiceBrowser가 지속적으로 알려야합니다.위의 버그는 간헐적 인 버그 일 뿐이며 하드웨어 특유의 것입니다. 일관되게 발생하는 것을 보면 앱이 예외를 throw하고있는 것 같습니다. 백그라운드 스레드를 사용하는 경우 전체 앱이 중단되지 않고 발생할 수 있습니다. iPhone 콘솔을 확인하고 오류 메시지를 기록 할 수 있습니다. objc_exception_throw에 중단 점을 설정했는지 확인하십시오.
여기 또 다른 중요한 문제 해결 팁이 있습니다. dns-sd -B _serviceName 명령을 사용하여 터미널을 통해 사용자의 dev 컴퓨터에서 Bonjour 방송을 모니터링하십시오. 이렇게하면 귀하의 서비스에 대한 귀하의 로컬 네트워크에 모든 출현을 볼 수 있습니다. 앱이 종료되었지만 dns-sd에 Remove 이벤트가 표시되지 않으면 코드를 다시 방문해야합니다. dns-sd가 remove 이벤트를 표시하지만 다른 앱이 올바르게 처리하지 않으면 위에서 언급 한 버그가 표시 될 수 있습니다. 또한 코드가 자신이 생각하는대로 행동하지 않을 수도 있습니다. Wi-Fi 서비스 인 Bonjour 문제를 해결하는 데 도움이됩니다. Bluetooth to Bluetooth는 iPhone Simulator에서 지원되지 않습니다.
내 개발자 블로그에서 Troubleshooting Bonjour Networking for the iPhone 전체 기사 읽기
또한 아이폰 OS 3.x는 dns-sd 캐시를 네트워크와 동기화 된 상태로 유지하는 데 문제가있는 것으로 보입니다. 결과적으로 서비스 제거 이벤트를 "놓치는"경우가 있으므로 부실 항목이 발생합니다. 나는 보통 WiFi를 끄고 다시 켜서 내 응용 프로그램을 다시 시작하여이 문제를 해결할 수 있습니다. – Zack