2009-08-13 7 views
3

내 모바일 앱의 데스크톱 버전을 구축하고 사용자가 Wi-Fi를 통해 동기화하도록합니다. 모든 것이 시뮬레이터에서 훌륭하게 작동합니다. 넷 서비스 (데스크탑 응용 프로그램에서 게시 됨)를 해결하거나 서비스를 사용할 수 없을 때 문제가 발생하지 않습니다. 서비스를 사용할 수 없을 때 전화 서비스에 대한 응용 프로그램을 발견하고 해결 (sometiems)하지만 NSNetServiceBrowser 결코 통지를 실행할 때 NSNetServiceBrowser가 iPhone OS에서 게시되지 않은 서비스를 찾는 이유는 무엇입니까?

문제

입니다. 이런 일이 발생하면 넷 서비스 브라우저는 넷 서비스 (더 이상 게시되지 않은)가 서비스를 해결하지만 계속해서 연결할 수 없음을 지속적으로 찾습니다. 몇 번 실패하면 서비스 브라우저 위임자의 "didRemoveService"가 마지막으로 호출되고 앱이 다시 올바르게 작동하기 시작합니다.

내 코드를 게시 싶지만 저도 같은 문제가 애플의 WiTap 예에서 일어나고 발견했습니다. 서비스가 게시되고 발견되지만 사용할 수 없게되면 서비스 브라우저를 실행하는 클라이언트는 업데이트되지 않으며 "없어야하는"서비스를 계속해서 해결하려고 시도합니다.

나는 와이파 WiTap을 실행하는 (그래서 봉쥬르 블루투스를 사용하는) 모든 것이 잘 작동 꺼져 있음을 발견했습니다. WiTap이 작동하지 않는다고 불평하는 사람을 찾지 못했고 다른 어느 곳에서도 온라인으로이 문제를 찾을 수 없습니다. 어떤 이유 - iPhone OS 또는 무선 네트워크 - 인터넷 서비스 브라우저가 사용할 수없는 서비스를 찾아 올바르게 연결할 수는 있지만 연결할 수없는 이유는 무엇입니까? 아이폰/아이팟 터치에

답변

4

봉쥬르/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 전체 기사 읽기

+1

또한 아이폰 OS 3.x는 dns-sd 캐시를 네트워크와 동기화 된 상태로 유지하는 데 문제가있는 것으로 보입니다. 결과적으로 서비스 제거 이벤트를 "놓치는"경우가 있으므로 부실 항목이 발생합니다. 나는 보통 WiFi를 끄고 다시 켜서 내 응용 프로그램을 다시 시작하여이 문제를 해결할 수 있습니다. – Zack

관련 문제