2012-10-29 12 views
5

Sto scrivendo un'applicazione OS X che dipende dalla capacità di determinare la potenza del segnale wireless, ma non riesco a capire quali diritti utilizzare per sandbox.Sandboxing coreWLAN?

Ogni volta che uso

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]]; 

ottengo l'errore The operation couldn't be completed. (com.apple.coreWLAN.error error 1.) pur avendo tutti i diritti controllato in XCode. Quale (i) titolo (i) mi manca?

Il progetto di esempio CoreWLANWirelessManager presenta lo stesso problema.

+0

Hai avuto fortuna? –

+0

Sfortunatamente, non l'ho fatto. Hai qualche idea? –

+0

Puoi provare a utilizzare la proprietà rssi sull'oggetto CWInterface. Mostra "l'attuale misura di indicazione dell'intensità del segnale ricevuta (RSSI) (dBm) per l'interfaccia.". Funziona nell'ambiente sandbox. –

risposta

0

È possibile utilizzare il framework privato Apple80211 utilizzando la libreria dlfcn.h. Un esempio iPhone può essere trovato qui:

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

Scarica il file di origine e indagare modulo scanner.

In sintesi, si arriva con qualcosa di simile a questo:

#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"]; 
} 

Nota che se si utilizza quadri privati ​​nelle vostre applicazioni iOS, non sarà in grado di pubblicarle su App Store (Apple rifiuterà la tua app perché non esiste documentazione pubblica per il framework Apple80211). ma dal momento che la tua domanda riguarda lo sviluppo di OSX, questo non vale per il tuo caso.

Spero che aiuti.
Farzan Doroodgar

+1

Il mio obiettivo con diritti e sandboxing era di poter distribuire l'applicazione sull'app store OS X. Se spengo il sandboxing, CWInterface funziona perfettamente. –

0

CoreWLAN non sembra essere disponibile per le applicazioni in modalità sandbox.

stati documentazione per gli sviluppatori di Apple "Con App Sandbox, la vostra applicazione non può modificare la configurazione di rete del sistema (sia con il quadro di configurazione del sistema, il quadro CoreWLAN, o altre API simili)", che sembra implicare che la lettura ma non di scrittura impostazioni potrebbe non funzionare, ma ciò non sembra funzionare nella pratica, e ciò è confermato da un post di Apple DTS: https://forums.developer.apple.com/thread/11307

0

Come circa i diritti per l'app Wifi Diagnostics fornita con Mac OS X 10.11.1, situato in/Sistema/Libreria/CoreServices/Applicazioni /. Verifica delle autorizzazioni Vedo che possiede quanto segue: com.apple.wifi.associate, com.apple.wifi.scan, com.apple.wifi.set_channel, com.apple.wifi.start_autojoin, com.apple.wireless-diagnostics, e com.apple.wireless-diagnostics.basic_report.

Siamo mortali che lavorano in una sandbox non sono in grado di procurarseli?

+0

Questo è un buon pensiero, ma poiché non si sa se tali diritti funzioneranno o possono essere utilizzati da applicazioni non Apple, questo è davvero più un commento che una risposta. – blm

+0

Ho provato ad aggiungere 'com.apple.wifi.scan' alle mie autorizzazioni app e ho ricevuto questo errore:' 5/30/16 9: 57: 13.925 AM taskgated [526]: ucciso net.istumbler [pid 42688] perché non è consentito l'utilizzo dell'autenticazione com.apple.wifi.scan (codice errore -67050) ' – alfwatt

Problemi correlati