swift - 会话共享在 os x 的特权类中不起作用
问题描述
我正在开发一个处理 mac os 中用户钥匙串的 os x 应用程序。我有一个管理会话数据的 Singleton 类和一个特权机制(没有任何 GUI)。我想通过 Singleton 对象共享特权类的数据。但它不起作用。这是我的代码示例
The Privileged Class:
class ReadKeychain: AuthorizationContext {
@objc func run(){
var singletonObj = SingletonState.shared
singletonObj.oktaAuthenticationStatus = status
}
}
和单例类对象:
class SingletonState {
static let shared = SingletonState()
private init(){}
private let internalQueue = DispatchQueue(label: "com.tecmfa.singletonstateinternal.queue",
qos: .default,
attributes: .concurrent)
private struct _oktaAuthentication
{
var status: String?
}
private var OktaAuthStatus = _oktaAuthentication()
/// oktaAuthentication reference
var oktaAuthenticationStatus: String {
get {
return internalQueue.sync {
return OktaAuthStatus.status!
}
}
set (newStatus) {
internalQueue.async(flags: .barrier) {
self.OktaAuthStatus.status = newStatus
}
}
}
}
- 如果我将班级声明为无特权的,它工作正常
- 但我需要它享有特权
解决方案
不确定它是否与问题有关,但是。你在这里有一个潜在的强制展开引发的崩溃。
当 for 的值oktaAuthenticationStatus
尚未设置但已被读取时,就会发生这种情况。我建议您将此变量的类型更改为可选并删除强制展开:
var oktaAuthenticationStatus: String? {
get {
return internalQueue.sync {
return OktaAuthStatus.status
}
}
set (newStatus) {
internalQueue.async(flags: .barrier) {
self.OktaAuthStatus.status = newStatus
}
}
}
或者更好的是,如果您有少量状态,请将其设为枚举并添加一个选项,例如.none
使其成为默认值。那么该变量将不是可选的。
推荐阅读
- jenkins - 如何获取主分支内部版本号
- javascript - 为什么在一种情况下我在 ExpressJS 中遇到 cors 错误,而在另一种情况下却没有?
- caching - 在 tibco bw 中实现缓存
- ansible - 使用 Ansible 创建目录会导致 /usr/lib/python3.7 中的文件所有权更改
- asp.net-mvc - 检索复选框值并标记为选中
- python - 将文件扩展名(如果是大写)更改为小写的大多数 Pythonic 和最快的方法
- python - 在 Azure Autonmation Runbook 中使用 Python 通过 JobId 获取作业的输出
- angular - Angular - 错误错误:Angular 7中未捕获(承诺)
- javascript - this.state.xxx.map 不是函数
- json - 如何将所有数据加载到选取器视图中