Swift中的SecAccessControlCreateWithFlags()

Nic*_*ari 5 security-framework core-foundation ios swift

我试图从快速代码中调用Security.framework中的函数.忘记"错误输出"(最后)参数一秒,如果我调用这样的函数:

let accessControlRef = SecAccessControlCreateFlags(
            kCFAllocatorDefault,
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
            SecAccessControlCreateFlags.UserPresence,
            nil
        )
Run Code Online (Sandbox Code Playgroud)

我发现以下错误:

找不到类型为'SecAccessControlCreateFlags'的初始值设定项,它接受类型'(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)'的参数列表

...但是,如果我将代码重新格式化为以下内容:

let allocator:CFAllocatorRef! = kCFAllocatorDefault

let protection:AnyObject!     = kSecAttrAccessibleWhenUnlockedThisDeviceOnly

let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence


let accessControlRef = SecAccessControlCreateWithFlags(
    allocator,
    protection,
    flags,
    nil
)
Run Code Online (Sandbox Code Playgroud)

(特定类型-eg,CFAllocatorRef- 取自Xcode自动完成时的函数原型)...它编译没有问题.这是怎么回事?

接下来是错误参数.我应该通过什么?迁移我的Objective-C代码,我很想传递以下变量(&当然是前缀):

var accessControlError:CFErrorRef! = nil
Run Code Online (Sandbox Code Playgroud)

...给出了错误:

无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)的参数列表调用'SecAccessControlCreateWithFlags'

相反,如果我传递了以下变量(再次使用address-of运算符):

var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
Run Code Online (Sandbox Code Playgroud)

(与原型自动完成建议的类型相同),我得到:

无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout UnsafeMutablePointer?>)的参数列表调用'SecAccessControlCreateWithFlags'

......那么,是什么给出的?

编辑:忘记错误参数.我好像在拿地址两次(即指向指针的指针).相反,我应该这样做:

var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'

let allocator:CFAllocatorRef!         = kCFAllocatorDefault
let protection:AnyObject!             = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence 

let accessControlRef = SecAccessControlCreateWithFlags(
        allocator,
        protection,
        flags,
        accessControlError // <- Notice the lack of '&'
)
Run Code Online (Sandbox Code Playgroud)

来源:此答案中的示例代码.

Nic*_*ari 8

(好的,所以没有人在一段时间内添加任何新的见解,所以我将用我上次编辑的内容回答我自己的问题:)

解答:忘记错误参数.我好像在拿地址两次(即指向指针的指针).相反,我应该这样做:

let accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'

let allocator:CFAllocator!         = kCFAllocatorDefault
let protection:AnyObject!             = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.userPresence 

let accessControlRef = SecAccessControlCreateWithFlags(
        allocator,
        protection,
        flags,
        accessControlError // <- Notice the lack of '&'
) 
Run Code Online (Sandbox Code Playgroud)

  • FWIW,您还可以使用"var error:Unmanaged <CFErrorRef>?" 并传递参考"&error"参考:https://developer.apple.com/videos/play/wwdc2015/706/ (8认同)