RubyMotion:SecKeychainFindGenericPassword&找不到类型'^'的指针描述

时间:2013-08-14 20:23:48

标签: macos cocoa macos-carbon rubymotion macruby

我正在尝试使用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的话题。

1 个答案:

答案 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

如果您有任何其他问题,请与我们联系。祝你好运!