MST

星途 面试题库

面试题:Objective-C中App Extensions扩展应用之数据共享

假设你正在开发一个包含Share Extension的应用,如何在主应用和Share Extension之间安全有效地共享数据?请描述主要步骤以及涉及到的关键技术点。
47.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

主要步骤

  1. 选择共享数据的方式
    • 使用App Groups
      • 在Xcode项目设置中,为主应用和Share Extension都开启App Groups功能。在“Capabilities”选项卡中,找到“App Groups”并启用,添加相同的App Group标识符(例如,group.com.example.shared)。
      • 在主应用中,使用UserDefaultsFileManager来访问共享容器中的数据。例如,通过UserDefaults访问共享数据:
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类:
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环境。

关键技术点

  1. App Groups配置:正确配置主应用和Share Extension的App Groups,确保两者能访问同一共享容器。这涉及到在Xcode项目设置中的操作以及使用正确的App Group标识符。
  2. 数据存储与读取:熟练使用UserDefaultsFileManager等类来在共享容器中存储和读取数据。了解它们的使用场景和性能特点,例如UserDefaults适合存储轻量级数据,而FileManager更适合处理较大文件。
  3. KVO机制:理解KVO的原理和使用方法,通过监听属性变化来实现主应用和Share Extension之间的数据同步。注意正确注册和移除观察者,避免内存泄漏。
  4. 加密技术:掌握常用的加密算法和框架,如CommonCrypto,对敏感数据进行加密,保证数据在共享过程中的安全性。
  5. 访问控制:从系统层面(App Groups的权限设置)和代码层面(权限检查逻辑)确保共享数据的访问安全。