由于框架不支持桥接头,如何将ifaddrs.h导入框架内的swift文件中?

还是有另一种方法可以在iOS和OS X上获得LAN上设备的IP地址?

最佳答案

在应用程序目标中,桥接 header 可以解决问题。在框架目标内部,事情比较棘手。在Swift代码内部,我们只能导入所谓的模块。技巧是定义一个模块映射,以提供所需的C库资源,并通过将build设置(“build设置”->“快速编译器”->“导入路径”)内的SWIFT_INCLUDE_PATHS设置为模块映射文件的路径来使其可见。有两种方法可以执行此操作:

1)下面通过直接公开ifaddrs.h接口(interface),实现了纯快速的实现,但可悲的是,它需要指向头文件的确切路径,如果您打算将库作为开放源代码发布,则这是不希望的。

module.modulemap

module ifaddrs [system] {
    header
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/ifaddrs.h"
    export *
}

添加到快速代码
import ifaddrs

2)第二种方法是创建一个Objective-C类,该类提供到ifaddrs.h的接口(interface),但隐藏源* .m文件中ifaddrs.h的实际导入。

NetworkTools.h
@interface NetworkTools : NSObject

+ (NSDictionary *)getIFAddresses;

@end

NetworkTools.m
#import "NetworkTools.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <netdb.h>

@implementation NetworkTools

+ (NSDictionary *)getIFAddresses {
    NSDictionary *addresses;
// code
    return addresses;
}

module.modulemap
module NetworkTools {
    header "Obj-C Tools/NetworkTools.h"
    export *
}

添加到快速代码
import NetworkTools

有关这一切如何协同工作的更多信息,请查看:

Github上的样本项目:https://github.com/danieleggert/mixed-swift-objc-framework

以及有关Clang模块的文章:http://clang.llvm.org/docs/Modules.html

10-07 23:07