2013-08-14 6 views
0

Я пытаюсь получить пароль от брелка с rubyMotion, на OS XRubyMotion: SecKeychainFindGenericPassword & Не можете найти описание указателя для типа '^'

Я попытался это:

# 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 

Независимо от того, что я делаю, нет способа получить пароль.

Оказание помощи; поиск в возрасте, Интернет полон макруби или какао или с примерами, но ничего для рубимоции на эту тему.

ответ

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 

Дайте мне знать, если у вас есть дополнительные вопросы. Удачи!

+0

спасибо за подгонку. Должно было сделать это более ясным, я нацелен на OS X! – MichaelC

+0

Ahh, gotcha. Тем не менее, вы можете дать SSKeychain выстрел. Он совместим с Mac OSX или iOS. – Devon