我正在尝试使用rubyMotion从钥匙串中检索密码,在OS X上
我试过了:
# passsword_data_pointer=Pointer.new(:object) #works but empty password
# password_data_pointer=Pointer.new('^') #makes ruby crash and complain 'Can't find pointer description for type '^'
password_data=NSMutableData.new #works but empty password
password_length = Pointer.new('I')
result=SecKeychainFindGenericPassword (
nil,
"some_service_string".length,
"some_service_string",
"some_username_string".length,
"some_username_string",
password_length,
password_data_pointer,#or password_data.bytes
nil
)
# password_string=NSMutableData.dataWithBytes(password_data.bytes, length:password_length[0])
password_string=NSMutableData.dataWithBytes(password_data_pointer, length:password_length[0])
p password_string
无论我做什么,都无法检索密码。
请帮忙;搜索年龄,互联网上充满了macruby或cocoa或c的例子,但没有关于rubymotion的话题。
答案 0 :(得分:1)
我对SecKeychainFindGenericPassword不太熟悉,但我知道您需要设置正确的权利以使用RubyMotion Project Management Guide中讨论的钥匙串。
因此,请确保您的Rakefile中包含以下行:
app.entitlements['keychain-access-groups'] = [
app.seed_id + '.' + app.identifier
]
如果你想要一个更好的钥匙串接口,我可以使用SSKeychain可可包装纸,它可以通过Cocoapods拉入。
在你的Gemfile中:
gem 'cocoapods', '~> 0.23.0'
gem 'motion-cocoapods', '~> 1.3.6'
同样在Rakefile中:
app.pods do
pod 'SSKeychain', '~> 1.2.0'
end
这是我使用SSKeychain存储和检索敏感数据的包装器的简化版本:
class CredentialStore
SERVICE = 'YOUR_APP_NAME'
def set_secure_value(value, for_key: key)
if value
SSKeychain.setPassword(value, forService: SERVICE, account: key)
else
SSKeychain.deletePasswordForService(SERVICE, account: key)
end
end
def secure_value_for_key(key)
SSKeychain.passwordForService(SERVICE, account: key)
end
end
如果您有任何其他问题,请与我们联系。祝你好运!