2014-09-12 109 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