2012-10-29 12 views
5

Piszę aplikację OS X, która zależy od możliwości określenia siły sygnału bezprzewodowego, ale nie mogę określić, jakie uprawnienia użyć do piaskownicy.Rdzeń piaskownicyWLAN?

Ilekroć używam

NSMutableArray *scanResults; 
CWInterface *currentInterface = [CWInterface interface]; 
NSLog(@"currInterface: %@\n", currentInterface); 
NSMutableDictionary *signalsDict = [[NSMutableDictionary alloc] init]; 
    NSError *err = nil; 
    scanResults = [NSMutableSet setWithSet:[currentInterface scanForNetworksWithSSID:nil error:&err]]; 

pojawia się błąd The operation couldn't be completed. (com.apple.coreWLAN.error error 1.) mimo że wszystkie uprawnienia sprawdzonych w Xcode. Jakie uprawnienia są mi niedostępne?

Projekt przykładowy CoreWLANWirelessManager ma taki sam problem.

+0

Czy masz szczęście? –

+0

Niestety, nie zrobiłem tego. Czy masz jakies pomysły? –

+0

Możesz spróbować użyć właściwości rssi na obiekcie CWInterface. Pokazuje "bieżący zmierzony wskaźnik mocy odebranego sygnału (RSSI) (dBm) dla interfejsu.". Działa w środowisku sandbox. –

Odpowiedz

0

Możesz chcieć użyć prywatnego szkieletu Apple80211 przy użyciu biblioteki dlfcn.h. Przykładem iPhone można znaleźć tutaj:

http://www.csse.uwa.edu.au/~chris/iphone/APlogger/

Pobierz plik źródłowy i zbadać moduł skanera.

Podsumowując, można wymyślić coś takiego:

#define IF_NAME "en0" 
#include <dlfcn.h> 

- (void)performScan 
{ 
    int (*open)(void *); 
    int (*bind)(void *, NSString *); 
    int (*close)(void *); 
    int (*scan)(void *, NSArray **, void *); 
    void *libHandle; 
    void *airportHandle; 

    libHandle = dlopen("/System/Library/Frameworks/Preferences.framework/Preferences", RTLD_LAZY); 
    open = dlsym(libHandle, "Apple80211Open"); 
    bind = dlsym(libHandle, "Apple80211BindToInterface"); 
    scan = dlsym(libHandle, "Apple80211Scan"); 
    close = dlsym(libHandle, "Apple80211Close"); 

    open(&airportHandle); 
    bind(airportHandle, @IF_NAME); 
    NSArray  *found; 
    NSDictionary *params = [[NSDictionary alloc] init]; 
    scan(airportHandle, &found, params); 

    int nnw = [found count]; 
    for(int i=0 ; i < nnw ; i++) { 
     NSDictionary *nw = [found objectAtIndex:i]; 
     NSString *ssid = [self fixSSID:nw]; 
     // RSSI indicates signal strength 
     int rssi = [[nw objectForKey:@"RSSI"] intValue]; 
    } 
    // Cleanup 
    close(airportHandle); 
    dlclose(libHandle); 
} 

-(NSString *)fixSSID:(NSDictionary *)nw 
{ 
    if ([[nw objectForKey:@"HIDDEN_NETWORK"] boolValue]) 
    return @"<hidden>"; 
    else 
    return [nw objectForKey:@"SSID_STR"]; 
} 

Zauważ, że jeśli używasz ramy prywatnych w iOS aplikacji, nie będzie mógł opublikować je w App Store (Apple odrzuci Twoja aplikacja, ponieważ nie ma publicznej dokumentacji dla frameworka Apple80211). ale ponieważ twoje pytanie dotyczy rozwoju OSX, nie dotyczy to twojego przypadku.

Mam nadzieję, że to pomaga.
Farzan Doroodgar

+1

Moim celem z uprawnieniami i sandboxingiem była możliwość dystrybucji aplikacji w sklepie z aplikacjami OS X. Jeśli wyłączę sandboxing, CWInterface działa idealnie. –

0

CoreWLAN nie wydaje się być w ogóle dostępny w aplikacjach sandbox.

Dokumentacja programisty firmy Apple stwierdza: "W aplikacji Sandbox Twoja aplikacja nie może modyfikować konfiguracji sieci systemu (w przypadku konfiguracji systemu, struktury CoreWLAN lub innych podobnych interfejsów API)", co wydaje się sugerować, że odczytywanie, ale nie zapisywanie ustawień może być OK, ale to nie działa w praktyce, co potwierdza post firmy Apple DTS: https://forums.developer.apple.com/thread/11307

0

Co z uprawnieniami do aplikacji Diagnostyka Wi-Fi dostarczanej z systemem Mac OS X 10.11.1, znajduje się w katalogu/System/Library/CoreServices/Applications /. Sprawdzam uprawnienia Widzę, że zawiera on: com.apple.wifi.associate, com.apple.wifi.scan, com.apple.wifi.set_channel, com.apple.wifi.start_autojoin, com.apple.wireless-diagnostics, i com.apple.wireless-diagnostics.basic_report.

Czy jesteśmy zwykłymi śmiertelnikami pracującymi w piaskownicy, którzy nie są w stanie tego uzyskać?

+0

To dobra myśl, ale ponieważ nie wiesz, czy te uprawnienia będą działać lub mogą być używane przez aplikacje spoza Apple, jest to raczej komentarz niż odpowiedź. – blm

+0

Próbowałem dodać 'com.apple.wifi.scan' do moich uprawnień do aplikacji i otrzymałem ten błąd:' 5/30/16 9: 57: 13.925 AM taskgated [526]: zabity net.istumbler [pid 42688], ponieważ jego użycie uprawnienia com.apple.wifi.scan jest niedozwolone (kod błędu -67050) ' – alfwatt