在 python 调用 secitemcopymatching

calling secitemcopymatching in python

绑定以使用 python 从钥匙串读取项目(Mac python 的新手)

这是我将在 googlepedia 中找到的一些东西整合在一起的地方

from ctypes import CDll, byref, Structure, POINTER
from Foundation import NSDictionary
class OpaqueObject:
   pass
OpaquePtr = POINTER(OpaqueObject)
Security = CDLL('/System/Library......../Security')
query = NSDictionary.dictionaryWithDictionary({<still working on this part>})
items = OpauePtr()
Security.SecItemCopyMatching(query, byref(items))

{仍在处理此部分},当前为 {"foo":"bar"},这当然是无效查询,但至少应 运行

无论如何它在调用 SecItemCopyMatching 时失败,说它不知道如何转换 param1。我知道该函数被定义为采用 CFDictionary,但我希望免费桥接能够接受 NSDictionary

无论如何,我怀疑这是混合了 2 mac python 机制 ctypes 和 PyObjc 的所有 v 错误代码。

免费桥接不适用于 Python ctypes。考虑改用 CFDictionary

CoreFoundation = CDLL('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')

CoreFoundation.CFDictionaryCreateMutable.restype = OpaquePtr
CoreFoundation.CFStringCreateWithBytes.restype = OpaquePtr
def CFDictionaryAddStringKeyValue(d, k, v):
    ck = CoreFoundation.CFStringCreateWithBytes(None, k, len(k), 0, 0)
    cv = CoreFoundation.CFStringCreateWithBytes(None, v, len(v), 0, 0)
    CoreFoundation.CFDictionaryAddValue(d, ck, cv)
    CoreFoundation.CFRelease(ck)
    CoreFoundation.CFRelease(cv)

query = CoreFoundation.CFDictionaryCreateMutable(None, 0, None, None)
CFDictionaryAddStringKeyValue(query, "foo", "bar")

然后你可以将 query 传递给 SecItemCopyMatching