会话共享无法从OS X中的特权类进行

问题描述

我正在开发一个OS X应用程序,该应用程序处理Mac OS中的用户钥匙串。 我有一个用于管理会话数据的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
            }
        }
    }
}
  • 如果我将该类声明为非特权类,那就很好用
  • 但我需要获得特权

解决方法

不确定是否与问题有关。 您在这里可能会因力解开而导致崩溃。

oktaAuthenticationStatus的值尚未设置但已经被读取时,就会发生这种情况。我建议您将此变量的类型更改为可选,并删除强制拆开:

var oktaAuthenticationStatus: String? {
    get {
        return internalQueue.sync {
            return OktaAuthStatus.status
        }
    }
    set (newStatus) {
        internalQueue.async(flags: .barrier) {
            self.OktaAuthStatus.status = newStatus
        }
    }
}

或者更好的是,如果您的状态数量很少,请将其设为枚举并添加一个选项.none作为默认值。那么该变量将不是可选的。