2014-12-15 28 views
10

Apple wydaje się wprowadzać całkiem sporo zmian w środowisku Yosemite i CoreWLAN. Chciałbym wykorzystać swoje nowe API, podając plik nagłówka:przy użyciu startMonitoringEventWithType: błąd: w celu wykrycia zmiany SSID w sieci Wi-Fi

/*! 
* @method 
* 
* @param type 
* A CWEventType value. 
* 
* @param error 
* An NSError object passed by reference, which upon return will contain the error if an error occurs. 
* This parameter is optional. 
* 
* @result 
* A BOOL value indicating whether or not an error occurred. YES indicates no error occurred. 
* 
* @abstract 
* Register for specific Wi-Fi event notifications. 
* 
* @discussion 
* Requires the <i>com.apple.wifi.events</i> entitlement. 
*/ 
- (BOOL)startMonitoringEventWithType:(CWEventType)type error:(out NSError **)error NS_AVAILABLE_MAC(10_10); 

i ustawienie CWEventType do: CWEventTypeSSIDDidChange

Mówi wymaga prawo, ale ja nie będąc w stanie uruchomić go na komputerze Mac. Komunikat o błędzie jest:

The app quit unexpectedly. Message from debugger: Terminated due to code signing error.

i złożyć moje uprawnienia (gdzie podejrzewam problem być) jest tak:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>com.apple.wifi.events</key> 
    <true/> 
</dict> 
</plist> 

a ja ustawiania ścieżki podpisywania kodu w kompilacji ustawienie dla cel. I mówiąc o tym, jeśli wykluczyć lokalny plik uprawnień, aplikacja działa, ale nie zachowuje się zgodnie z oczekiwaniami. API pod badaniu zwraca obiekt o błędzie z poniższym opisem:

Error Domain=com.apple.wifi.request.error Code=4 "The operation couldn’t be completed. (com.apple.wifi.request.error error 4.)" 

Jest to z pewnością Twister umysł, a przynajmniej mam nadzieję, że jest inaczej jestem totalną idiotką. Mam konkretny identyfikator aplikacji dla mojej aplikacji w centrum członkowskim, a także konkretny profil programisty (chociaż nie powinienem, ponieważ korzystam z profilu deweloperskiego wildcard).

Z góry dziękuję.

+0

Wydaje się, że CWWiFiClient ma problemy: https://forums.developer.apple.com/thread/11307 Może być teraz zmuszony do skorzystania z wycofanego API :( –

+0

Dzięki @jvmk za ten link. jako odpowiedź: –

+0

podążyłem za twoją radą i napisałem odpowiedź, ale początkowo powstrzymałem się od opublikowania jej jako odpowiedzi, ponieważ nie będzie ona miała długoterminowej wartości, tzn. mam nadzieję, że błąd zostanie wkrótce naprawiony :). –

Odpowiedz

4

Wygląda na to, że obecnie (31 lipca 2015 r.) Występuje błąd w CWWiFiClient: uprawnienia nie są przyznawane poprawnie. Dotyczy to nawet aplikacji bez piaskownicy. Zobacz this question na forach programistów Apple, aby uzyskać więcej informacji.

W rezultacie może być konieczne na razie odwołanie do wycofanego interfejsu API. syammala zapewnia good example, jak używać przestarzałego API.

+0

Dobrze powiedział @jvmk .. –

+0

Również tutaj potwierdzone: https://twitter.com/peternlewis/status/543205941546479616 – jrc

2

Wykonuje to samo zadanie, które chcesz osiągnąć powyżej. Powiadamia użytkownika o każdej zmianie identyfikatora SSID

Aby uzyskać te powiadomienia, należy trzymać się instancji programu CWInterface. Twój .h wyglądałby następująco

#import <Cocoa/Cocoa.h> 
@class CWInterface; 

@interface AppDelegate : NSObject <NSApplicationDelegate> 

@property (assign) IBOutlet NSWindow *window; 
@property (retain) CWInterface *wirelessInterface; 

@end 

Następnie w pliku .m wyglądałby następująco

#import "AppDelegate.h" 
#import <CoreWLAN/CoreWLAN.h> 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize wirelessInterface; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWModeDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWSSIDDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWBSSIDDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWCountryCodeDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWLinkDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWPowerDidChangeNotification object:nil]; 

    self.wirelessInterface = [CWInterface interfaceWithName:@"en1"]; 
} 

-(void) handleNotification:(NSNotification*) notification 
{ 
    NSLog(@"Notification Received"); 
} 

@end 

dbać podczas korzystania nazwa interfejsu en1 lub en0. Sprawdź swój system, sprawdzając, który interfejs ip jest obecny, podając znacznik ifconfig

+3

Dzięki @syammala za odpowiedź. Te powiadomienia są nieaktualne w systemie OS X 10.10. Szukam użyć nowego interfejsu API, który jest zasugerowany w notce wycofania w Xcode. Pamiętam, że stawiałem czoła temu problemowi 10.10.1, nie sprawdziłem, czy 10.10.3 zawiera poprawkę na to, ale myślę, że tak. –

+0

Nie @syammala Twoja odpowiedź nie pomogła. Moje pytanie dotyczyło konkretnego API. Proszę spojrzeć jeszcze raz na tytuł.Również w pierwszym zdaniu w treści pytania było jasne i powiedziałem: "Chcę korzystać z nowego API". –

+0

Ten sam problem pojawia się 10.10.3. Błąd podpisania kodu, gdy dodam com.apple.wifi.events do uprawnień i CWSSIDDidChangeNotification teraz przestarzałe ... – user1024447