2014-09-12 105 views
5

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

或者有另一种方法可以在局域网上获取设备的IP地址,这将在iOS和OS X上都能正常工作吗?

回答

0

您可以使用NSHostaddressaddresses方法。

+0

我需要它在iOS和OS X上工作,因为NSHost只在OS X中可用,所以我无法使用它。 – Asyra 2014-09-12 12:17:55

+2

您可能想将其添加到您的问题。 – zneak 2014-09-12 12:19:02

6

在应用程序目标中,桥接标题可以实现。在框架目标内部,事情更加棘手。在Swift代码中,我们只能导入所谓的模块。诀窍是定义一个模块映射,提供所需的C库资源,并通过在构建设置(构建设置 - > Swift编译器 - >导入路径)中将SWIFT_INCLUDE_PATHS设置为模块映射文件的路径,使其可见。有两种方法可以做到这一点:

1)以下允许通过直接暴露ifaddrs.h接口来实现纯快速实现,但遗憾的是需要一个确切的头文件路径,如果您曾经将以开源方式发布您的图书馆。

module.modulemap

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

添加到SWIFT代码

import ifaddrs 

2)第二个方法是创建一个Objective-C类,其提供了一个接口ifaddrs.h但隐藏了ifaddrs.h source * .m文件的实际导入。

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 * 
} 

加入SWIFT代码

import NetworkTools 

欲了解更多信息关于这一切是如何一起工作,检查出:

示例项目在Github上:https://github.com/danieleggert/mixed-swift-objc-framework

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