2011-01-15 9 views
5

Moja aplikacja-c musi być świadoma, czy firewall w OSX jest uruchomiony, więc może powiedzieć użytkownikowi, aby go wyłączyć lub utworzyć nową regułę.Objective-C: Sprawdź stan zapory w systemie OSX?

Czy możliwe jest tworzenie reguł bezpośrednio z mojej aplikacji, aby użytkownicy nigdy nie musieli rozwiązywać problemów z siecią?

John

+0

Co jeśli zapora jest na routerze? Twoi użytkownicy będą musieli poradzić sobie z zaporą na własną rękę. –

Odpowiedz

1

Jeśli aplikacja jest uruchamiany przez użytkownika (czyli podwójnym kliknięciu w Finderze), każda próba przez aplikację do tworzenia słuchacza gniazda poprosi użytkownika, aby umożliwić/zaprzeczyć, że słuchacza - a następnie odpowiednio dostosować ustawienia zapory sieciowej - bez żadnej programowej interwencji ze strony aplikacji.

Jeśli omawiany firewall jest routerem (problem, z którym ostatnio miałem do czynienia), masz kilka opcji. Najlepszą obsługiwaną opcją jest Bonjour/mDNSResponder (o ile nie chcesz obsługiwać podwójnej sytuacji). Jabłko zawiera aplikację otoki Objective-C wokół raczej rozwarty dns_sd.h:

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

Going the 3rd trasą firmy, przyjrzeć TCM Port Mapper. Korzysta z niektórych przestarzałych funkcji i wymaga trochę wysiłku, aby uruchomić go z obsługą ARC (jeśli jest to dla ciebie ważne).

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

Zarówno wsparcie UPnP oraz NAT-PMP.

Wreszcie, jeśli twoja aplikacja działa jako demon (bez interfejsu użytkownika), będziesz musiał zapoznać się z ipfw. Przygotuj się. Google dla "ipfw os x". StackOverflow uniemożliwia mi opublikowanie więcej niż dwóch linków. Znakomity.

Nadzieja to pomaga ....

4

Piszę funkcję, która zapewni Ci status 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; 
} 
Powiązane problemy