2012-04-17 16 views
6

Mam trudności ze sprawdzeniem dostępności w moim kodzie. Chciałbym, aby było to bardzo proste poprzez zainicjowanie obserwatora podczas uruchamiania, a następnie otrzymywanie powiadomień o zmianach. W poniższym kodzie metoda reachabilityChanged nigdy nie jest wywoływana. Próbowałem wielu iteracji, ale jest to najprostsza wersja. Kompiluje się i działa. Proszę o pomoc ...Powiadomienie o możliwościach dostępu Nigdy nie było nazywane

** * * Kod AppDelegate.h * ** *

#import <UIKit/UIKit.h> 

#ifdef PHONEGAP_FRAMEWORK 
    #import <PhoneGap/PGViewController.h> 
    #import <PhoneGap/PGURLProtocol.h> 
    #import <PhoneGap/Reachability.h> 
#else 
    #import "PGViewController.h" 
    #import "PGURLProtocol.h" 
    #import "Reachability.h" 

#endif 

@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate> { 
    NSString* invokeString; 
} 

@property (nonatomic, copy) NSString* invokeString; 
@property (nonatomic, strong) IBOutlet UIWindow* window; 
@property (nonatomic, strong) IBOutlet PGViewController* viewController; 

@end 

** * * Fragment kodu AppDelegate.m * ** *

#import "AppDelegate.h" 

#import "MainViewController.h" 

#ifdef PHONEGAP_FRAMEWORK 
    #import <PhoneGap/PGPlugin.h> 
    #import <PhoneGap/PGURLProtocol.h> 
    #import <PhoneGap/Reachability.h> 
#else 
    #import "PGPlugin.h" 
    #import "PGURLProtocol.h" 
    #import "Reachability.h" 

#endif 

@implementation AppDelegate 
@synthesize invokeString, window, viewController; 

- (void) reachabilityChanged:(NSNotification *)notice 
{ 

    NSLog(@"???????? CODE NEVER GETS HERE ??????????"); 

    Reachability *reach = [notice object]; 
    NSParameterAssert([reach isKindOfClass: [Reachability class]]); 
    NetworkStatus remoteHostStatus = [reach currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) {NSLog(@"**** Not Reachable ****");} 
    else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"**** wifi ****"); } 
    else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"**** cell ****"); } 
} 

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{  

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 

    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    [reach startNotifier]; 

    NetworkStatus remoteHostStatus = [reach currentReachabilityStatus]; 

    NSLog(@”???? ALWAYS INITS WITH Not Reachable ????”); 
    if(remoteHostStatus == NotReachable) {NSLog(@"init **** Not Reachable ****");} 
    else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"int **** wifi ****"); } 
    else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"init **** cell ****"); } 

    // ... 

} 

@end 
+0

pewnością tytuł i/lub tagi można aktualizować, aby ułatwić to pytanie ... –

+0

Po prostu edytowane - mam nadzieję, że tytuł i tagi są bardziej opisowe. –

Odpowiedz

26

Twój obiekt osiągalności jest autorelease dlatego dealloc i nie działa już.

Staram kod i to działa dla mnie:

kod AppDelegate.h

[...] 
@property (retain, nonatomic) Reachability* reach; 
[...] 

kod AppDelegate.m fragment

[...] 
@synthesize reach; 

- (void) reachabilityChanged:(NSNotification *)notice 
{ 

    NSLog(@"!!!!!!!!!! CODE IS CALL NOW !!!!!!!!!!"); 

    NetworkStatus remoteHostStatus = [reach currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) {NSLog(@"**** Not Reachable ****");} 
    else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"**** wifi ****"); } 
    else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"**** cell ****"); } 
} 

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{  

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 

    self.reach = [Reachability reachabilityForInternetConnection]; //retain reach 
    [reach startNotifier]; 

    NetworkStatus remoteHostStatus = [reach currentReachabilityStatus]; 

    NSLog(@"???? ALWAYS INITS WITH Not Reachable ????"); 
    if(remoteHostStatus == NotReachable) {NSLog(@"init **** Not Reachable ****");} 
    else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"int **** wifi ****"); } 
    else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"init **** cell ****"); } 

    // ... 

} 

[...] 
-(void)dealloc{ 
    [reach release]; 
    [super dealloc]; 
} 

@end 
+0

Myślę, że to jest to! Próbowałem Twoich modyfikacji, włączając tryb samolotowy i widzę odpowiednie komunikaty dziennika. Dziękuje Ci bardzo bardzo mocno! –

+0

@Sarah Moreland Nie ma za co. Ponieważ jesteś nowym użytkownikiem, mogę swobodnie przypomnieć Ci o głosowaniu w sprawie mojej odpowiedzi, jeśli ci się podoba i/lub przyjąć odpowiedź, jeśli rozwiąże ona Twój problem. Przycisk znajduje się w lewym górnym rogu mojej odpowiedzi. –

+0

Dzięki, sprawdziłem odpowiedź, ale nie mogę głosować, ponieważ nie mam 15 punktów reputacji. Zrobiłbym gdybym potrafił. To wspaniała odpowiedź. –

Powiązane problemy