2017-02-28 85 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相同;我会想象它应该工作(?),或者至少给你一些想法,以另一种方式读/写数据。