2017-02-28 91 views
3

由於在服務器端swift的實現是不同的,所以NSArrayNSDictionary缺少一個基本的(對我的項目)的一部分。 即,dictionaryWithContentsOfFile:方法只在Linux上加載非二進制plist文件,所以我的應用程序只能在macOS上運行。有關StackOverflow答案的一些舊問題涉及這個主題,但它們導致不再存在的網站。 所以我的問題是:是否有任何簡單的方法來加載二進制plist到NSDictionary,而不必使用一些「反編譯」外部腳本,如果沒有解決方案,什麼是最優雅的解決方案使用一個?NSDictionary在Linux上加載二進制plist(swift)

+1

爲什麼plist必須是二進制的嗎?你能不能[轉換成XML plist](http://forensicswiki.org/wiki/Converting_Binary_Plists)?有一個名爲[libplist]的庫(https://github.com/libimobiledevice/libplist)可以完成這項工作。 – JeremyP

+0

是的,二進制plist來自一個編譯的.ipa,我想讓最終產品的最終產品易於安裝 – Ondrej

回答

1

如果最糟糕的情況變得更糟,您可以使用GNUstep將二進制plist轉換爲XML,將xml保存在臨時位置,然後將其加載到Swift代碼中。

你可以嘗試使用CoreFoundation函數,如CFPropertyListCreateWithData,但如果Foundation方法不起作用,我懷疑CoreFoundation也可以工作。

1

從在Swift .plists的我的理解本機的處理是經由PropertyListSerialization

// PropertyListSerialization Method 

var plistFormat = PropertyListSerialization.PropertyListFormat.binary 
let plistPath: String? = Bundle.main.path(forResource: "binary", ofType: "plist")! 
let plistBinary = FileManager.default.contents(atPath: plistPath!)! 

guard let propertyList = try? PropertyListSerialization.propertyList(from: plistBinary, options: [], format: &plistFormat) else { 
    fatalError("failed to deserialize") 
} 
print(propertyList as! [String:Any]) 

結果:

"["MyDictionary": {\n MyArray = (\n Two,\n One\n);\n}]\n"

NSDictionary的方式,你可能會知道:

// NSDictionary Method 

if let url = Bundle.main.url(forResource:"binary", withExtension: "plist"), 
    let myDict = NSDictionary(contentsOf: url) as? [String:Any] { 
    print(myDict) 
} 

結果:

"["MyDictionary": {\n MyArray = (\n Two,\n One\n);\n}]\n"

比較這兩種方法的最終結果是使用binary的.plist相同;我會想象它應該工作(?),或者至少給你一些想法,以另一種方式讀/寫數據。