面试题答案
一键面试数据跨平台同步设计思路
- 使用云服务:利用苹果提供的CloudKit框架,它可以在不同设备间自动同步数据。CloudKit提供了用户账户相关的数据存储,并且支持多设备间的实时同步。通过在应用中配置CloudKit容器,不同设备上的应用可以共享和同步数据。例如,用户在iPhone上记录的运动数据,会自动同步到其Apple Watch上。
- 标识符与版本控制:为每个数据记录设置唯一标识符(如UUID),并添加版本号字段。当数据发生变化时,版本号递增。在同步过程中,根据版本号判断数据是否为最新,避免覆盖新数据。比如,用户在iPhone上更新了健身计划,版本号从1变为2,同步到其他设备时,其他设备可以根据版本号决定是否采用该更新。
- 网络请求与同步策略:应用启动时,发起同步请求,检查本地数据版本与云端数据版本。如果本地版本较低,下载最新数据;如果本地有更新且版本较高,上传数据。采用增量同步策略,只传输有变化的数据,减少网络流量。例如,只同步新记录的运动数据,而不是全部数据。
Swift代码层面数据加密和解密
- 数据加密
- 使用CommonCrypto框架:
import CommonCrypto
func encrypt(data: Data, key: String) -> Data? {
let keyData = key.data(using:.utf8)!
let keyLength = size_t(kCCKeySizeAES256)
let ivLength = size_t(kCCBlockSizeAES128)
var iv = [UInt8](repeating: 0, count: ivLength)
let options = CCOptions(kCCOptionPKCS7Padding)
var outLength: size_t = 0
var encryptedData = Data(count: Int(data.count) + Int(ivLength) + Int(kCCBlockSizeAES128))
let cryptStatus = crypt(
CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES),
options,
keyData.withUnsafeBytes { $0.baseAddress },
keyLength,
&iv,
data.withUnsafeBytes { $0.baseAddress },
data.count,
encryptedData.withUnsafeMutableBytes { $0.baseAddress },
encryptedData.count,
&outLength
)
if cryptStatus == kCCSuccess {
encryptedData.count = Int(outLength)
return encryptedData
}
return nil
}
- **加密示例**:
let originalData = "健身数据".data(using:.utf8)!
let encryptionKey = "12345678901234567890123456789012"
if let encrypted = encrypt(data: originalData, key: encryptionKey) {
print("加密后的数据: \(encrypted)")
}
- 数据解密
- 使用CommonCrypto框架:
func decrypt(data: Data, key: String) -> Data? {
let keyData = key.data(using:.utf8)!
let keyLength = size_t(kCCKeySizeAES256)
let ivLength = size_t(kCCBlockSizeAES128)
var iv = [UInt8](repeating: 0, count: ivLength)
let options = CCOptions(kCCOptionPKCS7Padding)
var outLength: size_t = 0
var decryptedData = Data(count: Int(data.count) + Int(kCCBlockSizeAES128))
let cryptStatus = crypt(
CCOperation(kCCDecrypt),
CCAlgorithm(kCCAlgorithmAES),
options,
keyData.withUnsafeBytes { $0.baseAddress },
keyLength,
&iv,
data.withUnsafeBytes { $0.baseAddress },
data.count,
decryptedData.withUnsafeMutableBytes { $0.baseAddress },
decryptedData.count,
&outLength
)
if cryptStatus == kCCSuccess {
decryptedData.count = Int(outLength)
return decryptedData
}
return nil
}
- **解密示例**:
let encryptedData = // 从存储或传输中获取的加密数据
let decryptionKey = "12345678901234567890123456789012"
if let decrypted = decrypt(data: encryptedData, key: decryptionKey) {
if let decryptedString = String(data: decrypted, encoding:.utf8) {
print("解密后的数据: \(decryptedString)")
}
}
在传输和存储数据时,先调用加密函数对数据进行加密,接收或读取数据时,调用解密函数恢复原始数据,以此保证数据的安全性。