2011-06-25 10 views
5

Pozwolę sobie najpierw podkreślić fakt, że mówię o zestawie Mac OS X SDK, , a nie iPhone.Otrzymywanie powiadomień o osiągnięciach online/offline

W celu określenia „łączność” i uzyskać flagi, zrobić coś podobnego do:

#import <SystemConfiguration/SystemConfiguration.h> 
const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 
SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithName(NULL, hostName); 
SCNetworkConnectionFlags flags = 0; 
SCNetworkReachabilityGetFlags(target, &flags); 

Który jest w porządku tylko, że - uzyskiwanie informacji o osiągalności Google (który właśnie Chcę wiedzieć).

Czy istnieje sposób na dodanie obserwatora do zmian? Zajmuję się SCDynamicStore, ale uważam, że singiel example od Apple i dokumentacji nieco przytłaczające.

Idealnie chciałbym móc ustawić funkcję zmiany flagi, ale to wystarczy: zauważ, kiedy IP jest "upuszczone"/zwolnione i kiedy jest uzyskiwane. (Mógłbym wtedy zrobić osiągalność zakodowaną na stałe w funkcji, która jest wyzwalana na uzyskanym IP).

Proszę nie wahać się prosić o opracowania.

Odpowiedz

8

Tak, można użyć SCNetworkReachabilitySetCallback i SCNetworkReachabilityScheduleWithRunLoop. Nie musisz używać SCDynamicStore, chyba że chcesz oglądać konkretny interfejs sieciowy.

Jeśli chcesz rzucić okiem na pełny przykład, możesz zobaczyć, co zrobiłem dla NCIDpop (urządzenie wyświetlające identyfikator sieci). Wyszukaj SCNetworkReachability w this file. Komentarze w funkcji networkReachabilityCallback dają pewne wyobrażenie o tym, jakie zmiany stanu oczekują (które nie zostały bardzo dobrze udokumentowane, gdy napisałem ten kod).

+0

Dzięki, świetne znalezisko! – Josh

3

Użyj klas zasięgu z Apple Reachability sample code.

  • Jest to dobry przykład, aby zrozumieć, w jaki sposób osiągalności działa
  • To będzie dużo łatwiejsze w użyciu (i będzie Objective-C, a nie zwykły C)

Zwłaszcza ta próbka zrobić SCReachability umieścić zawiadomienie o nazwie kReachabilityChangedNotification po zmianach osiągalność, więc można dodać siebie jako słuchacza do tego powiadomienia łatwo za pomocą:

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

ty ca n skopiuj/wklej pliki Reachability.h & .m do swojego projektu (tak właśnie to robią wszyscy; Nie wiem, dlaczego Apple nie dodało tych klas Obj-C bezpośrednio w swoich frameworkach!)

Uwaga: Jeśli nadal chcesz używać zwykłego C, możesz również zadzwonić pod numer SCNetworkReachabilitySetCallback (jak to jest zrobione w powyższa próbka Apple) i dać mu wskaźnik do funkcji C, w której zaimplementujesz swój kod. Jeśli to zrobisz, nie zapomnij, aby zaplanować osiągalność na RunLoop aby rozpocząć proces obserwacji i usunąć go z RunLoop po zakończeniu

+0

Próbowałem użyć Reachability.h/m wcześniej, bez powodzenia. Próbowałem ponownie i użyłem Reachability.h & .m z linku, ale muszę zrobić kilka poprawek, czy to normalne? tj .: linia # 235: 'if ((flags & kSCNetworkReachabilityFlagsIsDirect) == kSCNetworkReachabilityFlagsIsDirect)' i 'kSCNetworkReachabilityFlagsIsWWAN' kSCNetworkReachabilityFlagsIsDirect'. Próba odłączenia/ponownego połączenia/uczynienia hosta nieosiągalnym w/etc/hosts nie przesyła żadnych powiadomień do mojej aplikacji. – Josh

+0

Nie, to nie jest normalne. Którą wersję wypróbowałeś? Mam na myśli to, że ostatnio go pobrałeś? Próbka została zaktualizowana w lipcu 2010 roku, aby była zgodna z systemem iOS4. W moim własnym projekcie używam wersji z prawami autorskimi 2008 (powinienem ją zaktualizować!) I nie mam nic na linii # 235 ... – AliSoftware

+1

No dobra. Przeczytaj ponownie pierwszą linię mojego pytania, hehe. Mam nadzieję, że dodadzą go w Lion, a potem użyją podejścia Nicholasa do tego czasu. Ale dzięki :) – Josh

Powiązane problemy