面试题答案
一键面试主要步骤
- 选择共享数据的方式:
- 使用App Groups:
- 在Xcode项目设置中,为主应用和Share Extension都开启App Groups功能。在“Capabilities”选项卡中,找到“App Groups”并启用,添加相同的App Group标识符(例如,group.com.example.shared)。
- 在主应用中,使用
UserDefaults
或FileManager
来访问共享容器中的数据。例如,通过UserDefaults
访问共享数据:
- 使用App Groups:
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
sharedDefaults?.set("Some data", forKey: "sharedKey")
- 在Share Extension中,同样使用`UserDefaults`来读取共享数据:
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
if let sharedValue = sharedDefaults?.string(forKey: "sharedKey") {
print("Shared value: \(sharedValue)")
}
- 使用Key - Value Observing (KVO):
- 在主应用中,注册要观察的属性,并在属性值改变时通知Share Extension。例如,假设有一个共享的
SharedModel
类:
- 在主应用中,注册要观察的属性,并在属性值改变时通知Share Extension。例如,假设有一个共享的
class SharedModel: NSObject {
@objc dynamic var sharedProperty: String = ""
}
let sharedModel = SharedModel()
sharedModel.addObserver(self, forKeyPath: "sharedProperty", options: [.new, .old], context: nil)
sharedModel.sharedProperty = "New value"
- 在Share Extension中,监听主应用发出的通知或注册相同的KVO观察。
2. 数据安全措施:
- 加密:如果共享的数据敏感,可使用加密算法如AES(高级加密标准)对数据进行加密。在iOS中,可以使用
CommonCrypto
框架。例如,加密数据:
import CommonCrypto
func encrypt(data: Data, key: String, iv: String) -> Data? {
let keyData = key.data(using: .utf8)!
let ivData = iv.data(using: .utf8)!
var cryptData = Data(count: data.count + kCCBlockSizeAES128)
let cryptStatus = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
keyData.withUnsafeBytes { keyBytes in
ivData.withUnsafeBytes { ivBytes in
CCCrypt(CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionPKCS7Padding),
keyBytes.baseAddress, kCCKeySizeAES128,
ivBytes.baseAddress,
dataBytes.baseAddress, data.count,
cryptBytes.baseAddress, cryptData.count,
nil)
}
}
}
}
if cryptStatus == kCCSuccess {
cryptData.count -= kCCBlockSizeAES128
return cryptData
}
return nil
}
- 访问控制:在共享容器中,确保只有主应用和Share Extension有访问权限。通过App Groups的配置,其他应用无法访问该共享区域。同时,在代码中对共享数据的读写操作进行权限检查,例如,在读取共享数据时,验证调用者是否来自合法的主应用或Share Extension环境。
关键技术点
- App Groups配置:正确配置主应用和Share Extension的App Groups,确保两者能访问同一共享容器。这涉及到在Xcode项目设置中的操作以及使用正确的App Group标识符。
- 数据存储与读取:熟练使用
UserDefaults
、FileManager
等类来在共享容器中存储和读取数据。了解它们的使用场景和性能特点,例如UserDefaults
适合存储轻量级数据,而FileManager
更适合处理较大文件。 - KVO机制:理解KVO的原理和使用方法,通过监听属性变化来实现主应用和Share Extension之间的数据同步。注意正确注册和移除观察者,避免内存泄漏。
- 加密技术:掌握常用的加密算法和框架,如
CommonCrypto
,对敏感数据进行加密,保证数据在共享过程中的安全性。 - 访问控制:从系统层面(App Groups的权限设置)和代码层面(权限检查逻辑)确保共享数据的访问安全。