我想发布一个可可触摸框架,包括一些包含逻辑的json文件,我不希望框架的用户看到;不幸的是,在.framework文件中仍然可以看到json。
我想把它写进一个快速的档案里:
struct JsonProvider {
static let json = "..."
}但是我的json太大了,文件不能再使用了。我没有找到命令行编译然后包含它的解决方案。
这两个问题之一有解决办法吗?
发布于 2021-11-03 20:57:51
这个问题的答案实际上取决于您需要该文件的安全性。没有什么是100%安全的,但您可以使攻击者或多或少地难以获得访问权限。
选项A:隐藏文件
加一个'.‘在文件名的开头,这将对那些不知道隐藏文件的目录进行隐藏。
注意事项:
选项B:模糊化
使用Base64或其他编码方法对文件进行编码。
注意事项:
选项C:加密或存储在代码中
使用对称算法(如AES )对文件进行加密,并将密码存储在代码中。
或者,删除json文件并在代码中创建一个包含json的字符串的变量。
var myJson = """
{
"jsonData": "value"
}
"""注意事项:
选项D:不要在所有中包含文件
这是一个非常宽泛的主题,超出了您的问题范围,但本质上您在某个地方保存了您的文件。您在哪里和如何这样做同样取决于您需要数据的安全性。理想情况下,通过HTTPS为数据提供服务,并阻止自签名证书在应用程序中使用,这样它就不能被代理(即中间的人)。
URLSession已经在这方面做得很好了,但是您可以通过使用证书钉扎:https://developer.apple.com/news/?id=g9ejcf8y来更进一步。
本质上,您可以在服务器上创建证书配置,并将公钥捆绑在应用程序中,除非满足固定要求,否则连接将被拒绝。请注意,无论证书何时更改,您都必须更新应用程序。
发布于 2020-07-03 13:52:29
有很多种方式:
发布于 2017-09-06 08:24:26
您可以将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]
}
}您以后可以在框架中的任何地方使用它。
print(JSONFiles.fileOneJSON)希望它能帮到你
更新:为什么是base64编码的字符串?
base64编码字符串的主要好处是无需转义包含在JSON中的特殊符号。在添加到快速源文件之前,不需要从json字符串中删除新的行符号/引导符号。见示例
let string: String = "{ \"name\":\"John\", \"email\": \"hello@stackoverflow\" \"age\":30, \"car\":null }"但是如果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 ")
}
}
}https://stackoverflow.com/questions/46060507
复制相似问题