5

我正在编写一个 OS X 应用程序,它依赖于确定无线信号强度的能力,但我不知道使用什么权利来沙箱化它。

每当我使用

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

The operation couldn't be completed. (com.apple.coreWLAN.error error 1.)尽管在 XCode 中检查了所有权利,但我得到了错误。我缺少什么权利?

CoreWLANWirelessManager 示例项目也有同样的问题。

4

4 回答 4

0

您可能希望通过使用 dlfcn.h 库来使用 Apple80211 私有框架。可以在此处找到一个 iphone 示例:

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

下载源文件并研究扫描仪模块。

总之,你会想出这样的事情:

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

请注意,如果您在 iOS 应用程序中使用私有框架,您将无法在 App Store 上发布它们(Apple 将拒绝您的应用程序,因为没有 Apple80211 框架的公开文档)。但由于您的问题是关于 OSX 开发的,因此这不适用于您的情况。

希望能帮助到你。

于 2013-04-25T02:28:39.890 回答
0

Mac OS X 10.11.1 附带的 Wifi 诊断应用程序的权利如何,位于 /System/Library/CoreServices/Applications/。检查权利我发现它拥有以下内容:com.apple.wifi.associate、com.apple.wifi.scan、com.apple.wifi.set_channel、com.apple.wifi.start_autojoin、com.apple.wireless-diagnostics、和 com.apple.wireless-diagnostics.basic_report。

我们只是在沙盒中工作的凡人无法获得这些吗?

于 2015-11-18T20:21:16.637 回答
0

在此处输入图像描述

我认为您需要检查传出连接(客户端)。

于 2019-05-30T23:24:49.783 回答
0

CoreWLAN 似乎根本不适用于沙盒应用程序。

Apple 的开发者文档指出“使用 App Sandbox,您的应用程序无法修改系统的网络配置(无论是使用系统配置框架、CoreWLAN 框架还是其他类似的 API)”,这似乎暗示着读取但不写入设置可能是可以的,但这在实践中似乎行不通,Apple DTS 的帖子证实了这一点:https ://forums.developer.apple.com/thread/11307

于 2015-08-28T12:06:18.427 回答