Objective-C:检查OSX中的防火墙状态?

Joh*_*ams 5 macos cocoa firewall objective-c

我的objective-c应用程序需要知道OSX中的防火墙是否正在运行,因此它可以告诉用户将其关闭或创建新规则.

此外,是否可以直接从我的应用程序创建规则,以便用户永远不需要处理网络问题?

约翰

Vik*_*sal 5

我正在编写一个函数,可以为您提供 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;
}
Run Code Online (Sandbox Code Playgroud)


sen*_*ruc 1

如果您的应用程序正在由用户运行(即在 Finder 中双击),则您的应用程序创建套接字侦听器的任何尝试都会提示用户允许/拒绝该侦听器 - 并随后相应地调整防火墙设置 - 无需您的应用程序方面的任何程序干预。

如果有问题的防火墙是您的路由器(我最近不得不处理的问题),您有几个选择。受支持的最佳选项是 Bonjour/mDNSResponder(只要您不想支持双重身份情况)。Apple 围绕相当迟钝的 dns_sd.h 提供了一个 Objective-C 包装应用程序:

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

走第 3 方路线,看看 TCM Port Mapper。它使用了一些已弃用的功能,并且需要花费一些精力才能使其在 ARC 支持下运行(如果这对您很重要)。

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

两者都支持 UPnP 和 NAT-PMP。

最后,如果您的应用程序作为守护程序运行(没有用户界面),您将必须熟悉 ipfw。振作起来。谷歌搜索“ipfw os x”。StackOverflow 阻止我发布两个以上的链接。杰出的。

希望这可以帮助....