簡體   English   中英

CFDictionaryGetValue無法使用CFStringRef調用

[英]CFDictionaryGetValue can't invoke with CFStringRef

我正在嘗試實現CFDictionaryGetValue(), 如此appledoc列表3中所示:

server = CFDictionaryGetValue(credentialDict, kSecAttrServer);
userName = CFDictionaryGetValue(credentialDict, kSecAttrAccount);
password = CFDictionaryGetValue(credentialDict, kSecSharedPassword);

我這樣實施了

let userName = CFDictionaryGetValue(credentialDict, kSecAttrAccount)
let password = CFDictionaryGetValue(credentialDict, kSecSharedPassword)

但我得到錯誤“無法調用”CFDictionaryGetValue“與類型的參數列表”(CFDictionaryRef,CFStringRef)“

我不明白這與蘋果doc如何實現它有何不同。

謝謝

是的,有在雷達提到代碼的問題在這里

我找到了一個解決方法:

  let unsafeCred = CFArrayGetValueAtIndex(credentials, 0)
  let credential: CFDictionaryRef = unsafeBitCast(unsafeCred, CFDictionaryRef.self)
  let dict: Dictionary<String, String> = credential as! Dictionary<String, String>
  let username = dict[kSecAttrAccount as String]
  let password = dict[kSecSharedPassword.takeRetainedValue() as! String]

UPDATE

SecRequestSharedWebCredential("www.reddit.com", .None)  {
  credentials, error in 
    if CFArrayGetCount(credentials) > 0 {
      let dict = unsafeBitCast(
               CFArrayGetValueAtIndex(credentials, 0), 
               CFDictionaryRef.self) as Dictionary
    let username = dict[kSecAttrAccount as String]
    let password = dict[kSecSharedPassword as String]
    login(username, password)
  }
}

請注意這里的區別:

iOS8上

var kSecSharedPassword: Unmanaged<AnyObject>!
func SecRequestSharedWebCredential(_ fqdn: CFString!,
                                   _ account: CFString!,
                                   _ completionHandler: ((CFArray!,
                                            CFError!) -> Void)!)

iOS9

let kSecSharedPassword: CFString
func SecRequestSharedWebCredential(_ fqdn: CFString?, 
                                   _ account: CFString?, 
                                   _ completionHandler: (CFArray?, CFError?) -> Void)

以下是swift2 / iOS9 / xcode7的所有更改

更新了XCode 7.3和Swift 2.2的答案

      if CFArrayGetCount(credentials) > 0 {
            let dict = unsafeBitCast(CFArrayGetValueAtIndex(credentials, 0), CFDictionaryRef.self) as NSDictionary
            let username = dict[kSecAttrAccount as String] as! String
            let password = dict[kSecSharedPassword as String] as! String
            dispatch_async(dispatch_get_main_queue()) {
                completion(error: nil, username: username, password: password)
            }

請記住在返回用戶名和密碼的值時要小心,因為它必須在主線程上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM