隐藏.json文件包含在Cocoa Touch Framework中

swa*_*ner 14 cocoa-touch json swift

我想发布一个可可触摸框架,其中包含一些json文件,其中包含我不希望framwork的用户看到的逻辑; 不幸的是,在.framework文件中仍然可以看到json.

我想把它包含在一个快速文件中:

struct JsonProvider {
    static let json = "..."
}
Run Code Online (Sandbox Code Playgroud)

但是我的json很大,文件不再可用了.我找不到命令行编译的解决方案然后包含它.

是否有解决这两个问题之一,即

  • 隐藏框架内的json或
  • 预编译一个swift文件,然后将其添加到框架中?

Igo*_*ets -1

您可以将 json 文件内容作为 base64 编码字符串添加到源中。

struct JSONFiles {
    internal static let fileOneBase64String = "iVBORw0KGgoAAAANSUhEUgAAAMEAAADLCAYAAADX..."
    static var fileOneJSON: [String: Any] {
        let data = Data(base64Encoded: fileOneBase64String)!
        return try! JSONSerialization.jsonObject(with: data, options: []) as!  [String: Any]
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以稍后在框架中的任何位置使用它

print(JSONFiles.fileOneJSON)
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助

更新:为什么是base64编码的字符串?

Base64 编码字符串的主要好处 - 您不需要转义 JSON 字符串中包含的特殊符号。在添加到 swift 源文件之前,不需要从 json 字符串中删除新行符号/意图符号。参见示例

let string: String = "{ \"name\":\"John\", \"email\": \"hello@stackoverflow\" \"age\":30, \"car\":null }"
Run Code Online (Sandbox Code Playgroud)

但如果json更复杂呢?如果包含10个嵌套级别、数组、字典?

您可以通过 UnitTests 覆盖其中包含的值fileOneBase64String可以解码为 JSON 对象

import XCTest
@testable import MyAwesomeFramework

class FrameworkTests: XCTestCase {

    func testThatBase64EncodedJSONStringCanBeDecoded() {
        let data = Data(base64Encoded: JSONFiles.fileOneBase64String)
        XCTAssertNotNil(data, "Unable to convert base64 string to Data")
        do {
            _ = try JSONSerialization.jsonObject(with: data, options: [])
        } catch {
            XCTFail("Expected decoded JSON ")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 将 json 存储在字符串中有何改进?Base64 更长,对吗? (2认同)