objective-csandboxnsnotificationentitlementscorewlan

OSX Entitlement For "system-socket" Responsible for CWInterface Notifications?


When I register for CoreWLAN notifications (with a retained interface) like this:

 [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(recieveNetworkNotificationAndRedirectToMainThread:) 
                                             name:CWSSIDDidChangeNotification 
                                           object:nil];

I receive the notification only when I have all entitlements disabled. None of the default entitlements allow me to receive this (or other CoreWLAN) notification.

Any ideas?

10.7.4


Edit 1:

The Entitlements Reference page did not provide any assistance.


Edit 2:

Faking the notification works fine:

  [[NSNotificationCenter defaultCenter] 
 postNotificationName:CWSSIDDidChangeNotification 
 object:self];  

And none of the other CoreWLAN notifications are received either.

I am sure that this is a simple entitlement that I'm missing... Here is the entitlement file with the temp exception for Growl (removing the temp exception has no effect either):

<?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.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.device.usb</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.network.server</key>
    <true/>
    <key>com.apple.security.temporary-exception.apple-events</key>
    <string>com.Growl.GrowlHelperApp</string>
    <key>com.apple.security.temporary-exception.mach-lookup.global-name</key>
    <string>GrowlApplicationBridgePathway</string>
</dict>
</plist>

Edit 3:

Compiling for 10.6 using the old k-prefixed notification names has no effect either.


Edit 4:

More information from the logs:

AppName (39009) deny system-socket

Process: AppName [39009] Path:
/Users/username/Library/Developer/Xcode/DerivedData/AppName-fnxrpqnodsouovcaxgiocvnfpqor/Build/Products/Release/AppName/Contents/MacOS/AppName Load Address: 0x10d23f000 Identifier: AppName Version:
??? (???) Code Type: X86-64 (Native) Parent Process: debugserver [39007]

Date/Time: 2012-07-20 13:17:11.851 -0700 OS Version: Mac OS X 10.7.4 (11E2705) Report Version: 7

Backtrace: 0 libsystem_kernel.dylib 0x00007fff98704e76 socket + 10 1 CoreWLAN 0x00007fff951f4a6f Apple80211EventMonitoringInit2 + 53 2 CoreWLAN
0x00007fff951e6dc4 -[CWInterface initWithInterfaceName:] + 1358 3
CoreWLAN 0x00007fff951e412d +[CWInterface interfaceWithName:] + 52 4 CoreWLAN
0x00007fff951e41a8 +[CWInterface interface] + 98


Edit 5:

Found this reference to deny system-socket in sandboxd, but no help yet.


Solution

  • I am able to get SSID changes and updates with my app sandboxed using the networknotifier code in hardwaregrowler - I think because its looking for specific notifications.

    http://code.google.com/p/growl/source/browse/Extras/HardwareGrowler/?name=default

    Once I am notified of a change:

    if(wif==nil){
        wif = [CWInterface interface];
        [wif retain];
    }
    if(!wif.serviceActive){
        skip=TRUE;
    }
    if(wif.ssid==nil){
        skip=TRUE;
    }
    if(!skip)
    if(wif){
        NSLog(@"We are on the WiFi network: %@",wif.ssid);
    }