2011-01-15 4 views
5

La mia app obiettivo-c deve essere consapevole se il firewall in OSX è in esecuzione, in modo che possa dire all'utente di spegnerlo o creare una nuova regola.Objective-C: controllare lo stato del firewall in OSX?

Inoltre, è possibile creare regole direttamente dalla mia app in modo che gli utenti non debbano mai gestire i problemi di rete?

John

+0

Che cosa succede se il firewall è su un router? I tuoi utenti dovranno solo gestire il firewall da soli. –

risposta

1

Se l'applicazione viene eseguito dall'utente (ad esempio, fare doppio clic nel Finder), qualsiasi tentativo da parte vostra applicazione per creare un ascoltatore presa chiederà all'utente di consentire/negare che ascoltatore - e successivamente regolare le impostazioni del firewall di conseguenza - senza alcun intervento programmatico da parte della vostra applicazione.

Se il firewall in questione è il router (un problema che ho dovuto affrontare di recente), sono disponibili alcune opzioni. L'opzione migliore supportata è Bonjour/mDNSResponder (a condizione che non si desideri supportare una situazione di doppio carattere). Apple fornisce un'applicazione wrapper di Objective-C in tutto il dns_sd.h piuttosto ottusa:

http://developer.apple.com/library/mac/#samplecode/PortMapper/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007879-Intro-DontLinkElementID_2

andare via 3a parte, uno sguardo a TCM Port Mapper. Usa alcune funzionalità deprecate e richiederà un po 'di sforzo per farlo funzionare con il supporto ARC (se è importante per te).

http://code.google.com/p/tcmportmapper/

Sia supporto UPnP e NAT-PMP.

Infine, se l'applicazione è in esecuzione come demone (senza un'interfaccia utente), è necessario conoscere ipfw. Preparati. Google per "ipfw os x". StackOverflow mi impedisce di pubblicare più di due link. Brillante.

Spero che questo aiuti ....

4

Sto scrivendo una funzione che vi fornirà lo stato del firewall OSX :)

-(BOOL)getFirewallStatus{ 


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES); 

    NSString *path = [paths objectAtIndex:0]; 

    path = [NSString stringWithFormat:@"%@/%@",path,@"Preferences/com.apple.alf.plist"]; 

    path = [path stringByReplacingOccurrencesOfString:@"/System" 
              withString:@""]; 




    NSDictionary* _dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 


    // firewall status 
    int status = [[_dictionary valueForKey:@"globalstate"] integerValue]; 

    if (status == 0) 
    { 
     return NO; 
    } 

    return YES; 
}