我已经创建了用于存储strTokenValue的计算属性,并将其发送到Web服务。

   private var strTokenValue = String()
    var tokenValue: String {
        get {
            if strTokenValue != "" {
                return strTokenValue
            }
            else {
                if let token = StrongBoxController.sharedInstance.keychainStore.unarchive(objectForKey: "TokenValue") as? Data {
                    strTokenValue = StrongBoxController.sharedInstance.convertDataToString(value: token)
                    return strTokenValue
                }
                else {
                    return ""
                }
            }
        }
        set {
            strTokenValue = ""
            StrongBoxController.sharedInstance.saveValues(value: "\(newValue)", key: “TokenValue”)
        }
    }



我们已经异步发送了每个用户操作,并且我们没有等待跟踪功能Web服务的成功响应,因此我没有在下面的代码中添加成功和失败响应。

func track(actionTaken: String,incidentNumber: String,message: String,completion:@escaping(_ success: Bool, _ error: String,_ actionTakenName: String) -> Void ) {
        DispatchQueue.global(qos: .background).async {
            let url = "\(ServerCommunication.sharedInstance.getDomainBaseUrl())api/track"
            let parameters = [
                “token_value” : self.tokenValue,
                "device_os":"iOS",
                "device_type": UIDevice.modelName,
                "action_taken": actionTaken,
                "message" : message,
            ]
       }
 }

我们已经调用了另一个Web服务来发送图像和tokenValue。



  请求:

      “token_value” : “”,
        "device_os":"iOS",
        "device_type": “iPhone X”,
        "action_taken": “Image captured”,
        "message" : “”,



func convertDataToString(value: Data) -> String {
    return String(decoding: value, as: UTF8.self)
}



public func unarchive(objectForKey key:String) -> Any? {
    guard let data = self.data(forKey: key) else {
        return nil
    }

    let unarchiver = NSKeyedUnarchiver(forReadingWith: data as Data)
    return unarchiver.decodeObject(forKey: key)
}


 @objc func saveValues(value : String, key: String) {
  _ = self.keychainStore.archive(convertStringToData(value: value), key: key, accessibility: kSecAttrAccessibleWhenUnlockedThisDeviceOnly)
 }


在某些情况下,同时调用的Web服务和“ tokenValue”在trackActions Web服务中都为空

最佳答案

似乎问题是您使用convertStringToData保存了数据,而该数据可能未使用convertStringToData。我认为是因为convertDataToString不使用NSKeyedAarchiver
为了解决,您应该使用unarchive
 保存数据使用

func convertDataToString(value: Data) -> String? {
        return String(data: value, encoding: .utf8)
    }
    func convertStringToData(value: String) -> Data? {
        return value.data(using: .utf8)
    }




keychainStore.archive(convertStringToData(value: value), key: key, accessibility: kSecAttrAccessibleWhenUnlockedThisDeviceOnly)


stored = convertDataToString(StrongBoxController.sharedInstance.keychainStore.unarchive(objectForKey: "TokenValue"))

10-06 16:18