2015-11-06 32 views
0

搭售來讀取鑰匙扣使用python(新手在Mac的Python)的項目調用在python secitemcopymatching

這是我有黑客在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

無論如何,我懷疑這是所有v壞的代碼混合2 mac python機制ctypes和PyObjc。

回答

0

免費橋接不適用於Python​​。考慮使用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") 

然後,你可以通過querySecItemCopyMatching

+0

omg多數民衆贊成複雜:)我會嘗試 – pm100

+0

是啊,這很煩人,因爲你必須使用CF的一切,但希望它不會太瘋狂。 – nneonneo

+0

確定工作並返回-50。我認爲這是因爲查詢不好。 – pm100