2012-06-06 5 views
1

도달 가능성 코드를 앱에 포함 시켰고 몇 달 동안 성공적으로 작동했지만 지금까지는 iOS 5 장비에서만 사용했습니다. 그러나 iOS 4 기기에서는 작동하지 않습니다.도달 가능성 변경 알림은 iOS5에서 작동하지만 iOS4에서는 작동하지 않습니다.

통지는 다음과 같이 등록됩니다

:

- (id) init 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(reachabilityChange:) 
               name:kReachabilityChangedNotification 
               object:nil]; 

... 


- (void) appBecameActive 
{ 
... 
self.reachability = [Reachability reachabilityWithHostName:[url host]]; 
... 
[self.reachability startNotifier]; 

stopNotifier 만의 dealloc 호출 받고있는 reachabiity 변화가있을 때

문제는 ReachabilityCallback가 다시 전화를 받고되지 않고, I iOS5에서는 괜찮지 만 iOS4에서는 그렇지 않은 이유를 알 수 없습니다.

코드의이 부분은 애플 샘플 소스 코드에서 변경되지 않습니다 : iOS5를 장치에서 실행되는 경우

언급 한 바와 같이
static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) { 
#pragma unused (target, flags) 
    NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback"); 
    NSCAssert([(__bridge id)info isKindOfClass:[Reachability class]], @"info was wrong class in ReachabilityCallback"); 

    Reachability *noteObject = (__bridge Reachability *)info; 
    // Post a notification to notify the client that the network reachability changed. 
    [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject]; 
} 

이 모든 것이 오랜 시간 동안 제대로 작동 된 유사한 문제가 발생 다른 사람이있다 과거에는 도달 가능성 코드를 iOS4에 통합 했습니까?

+2

내가 도달 가능성과 함께 일을 할 때마다 나는에서 SystemConfiguration 프레임 워크를 링크 (당신은 주 스레드에서 그들을 위해 수신한다고 가정), 당신은 뭐하는거야? – kevboh

+0

고마워,하지만 내가 언급했듯이 iO5에서는 프레임 워크 없이는 작동하지 않는다. – Gruntcakes

+7

... [당신은 무엇을 당신의 질문에 그냥 했습니까?] (0120-13995/Revisions) – BoltClock

답변

4

알림을 게시하여 메인 스레드에 게시 할 코드를 편집하고 표시되는 동작이 변경되는지 확인하십시오.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject]; 
}); 

+0

고마워, 나는 그것을 시도 할 것이지만 며칠 동안 그것에 도착할 수 없을 것이다. 재미있는 것을 드러내면 나는 현상금을 게시 할 것이다. – Gruntcakes

+0

누군가 이것이 왜 필요한 이유를 명확히 할 수 있습니까? 제안 된 수정을하기 전까지는 iOS 6에서 도달 가능성 알림을받지 못했습니다. Reachability 코드의 버그입니까? – hpique

+0

알림은 스레드 단위입니다. Reachability 객체가 당신이 듣고있는 스레드가 아닌 다른 스레드 상에 있다면, 필사적 인 관심을 불러 일으키는 소리를들을 수 없습니다. 이 변경을 통해 모든 알림을 일관된 스레드 (기본 대기열을 통해 주 스레드)로 보냅니다.이 스레드는 수신 대기 할 일관된 스레드를 제공합니다. – quellish

0

kReachabilityChangedNotification은 시스템 프레임 워크에서 생성 한 알림이 아닙니다. Reachability 샘플 코드에 의해 생성됩니다. 샘플 코드는 단순히 응용 프로그램에 그대로 복사하여 붙여 넣는 것이 아니라 개념을 설명하기위한 것입니다. 알림을 수신하는 장소를 보지 말고 문제의 출처에 대한 도달 가능성 코드를 살펴 보는 것이 좋습니다.

+0

그것은 맹목적으로 복사 및 붙여 넣기 가정을 만들기 위해 오히려 마지 못해. – Gruntcakes

0

init 메서드에 중단 점을 설정하여 등록이 호출되고 있는지 확인하십시오. 그렇지 않으면 viewDidLoad로 이동하거나 init 메소드가 다른 곳에서 호출되는지 확인하십시오.

나는 appBecameActive에 대해 동일한 작업을 수행합니다. 이를위한 중단 점을 설정하고 시작 지점인지 확인하십시오. 여기에서 호출되어야합니다 : applicationDidBecomeActive : UIApplicationDelegate 클래스에서.

관련 문제