CFDictionaryGetValue无法使用CFStringRef调用

时间:2015-08-31 16:44:33

标签: ios swift swift2 cfstring

我正在尝试实现CFDictionaryGetValue(),如this 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)“

我不明白这与苹果医生如何实施它有何不同。

感谢

2 个答案:

答案 0 :(得分:4)

是的,雷达here

中提到的代码存在问题

我找到了一个解决方法:

  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]

<强>更新

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

的所有changes

答案 1 :(得分:0)

更新了XCode 7.3和Swift 2.2的答案

def _parse(form):
    """
    Returns:
        str:
    """
    if sys.version_info > (3,):
        # on Python 3 form needs to be byte encoded
        encoded_form = []
        for item in form:
            try:
                encoded_form.append(item.encode())
            except AttributeError:
                encoded_form.append(item)

        return b'\r\n'.join(encoded_form)
    return '\r\n'.join(form)

请记住在返回用户名和密码的值时要小心,因为它必须在主线程上