App Applelerator для iOS: как прочитать значение связки ключей из Share Extension? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть тестовое приложение Appcelerator только для iOS (для упрощения). Вы можете получить целое (действительно маленькое приложение) в этом репо

Это приложение без проблем сохраняет значение в связке ключей со стороны Appcelerator, используя Ti.Identity module . Проблема в том, что я не могу прочитать это значение из Swift.

Код для сохранения чего-либо в связке ключей внутри alloy.js:

var Identity = require('ti.identity');

// Create a keychain item
var keychainItem = Identity.createKeychainItem({
identifier: 'mypassword',
accessGroup: 'group.test.projects'
});


keychainItem.addEventListener('save', function(e) {
    Ti.API.info("Saved!!! ");

    keychainItem.addEventListener('read', function(e) {
            Ti.API.info("Read!!!");
            if (e.success) {
                Ti.API.info(JSON.stringify(e, null, 4));
            } else {
                Ti.API.info("Error" + e);
            }
    });

    keychainItem.read();
});

// Write to the keychain
keychainItem.save('s3cr3t_p4$$w0rd');

Это работает, так как после сохранения я печатаю вахты внутри цепочки для ключей с этой клавишей и печатает правильно s3cr3t_p4$$w0rd.

Теперь, чтобы прочитать это из расширения общего доступа, я добавил расширение в проект. Соответствующие части tiapp.xml:

<ios>
...
<entitlements>
  <dict>
    <key>com.apple.security.application-groups</key>
    <array>
      <string>group.test.projects</string>
    </array>
    <key>keychain-access-groups</key>
    <array>
      <string>$(AppIdentifierPrefix)keychain.test.projects</string>
    </array>
  </dict>
</entitlements>
<extensions>
  <extension projectPath="extensions/TestKeychain.xcodeproj">
    <target name="ShareExtension">
      <provisioning-profiles>
        <devices/>
      </provisioning-profiles>
    </target>
  </extension>
</extensions>

Приложение - это <id>com.testapp</id>

Файл прав в расширении приложения:

<dict>
    <key>com.apple.security.application-groups</key>
    <array>
        <string>group.test.projects</string>
    </array>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)keychain.test.projects</string>
    </array>
</dict>

Чтобы прочитать это из Swift, я пытался:

let domain = "group.test.projects"
let login = "mypassword"
let keychainQuery: [NSString: NSObject] = [
    kSecClass: kSecClassGenericPassword,
    kSecAttrAccount: login as NSObject,
    kSecAttrService: domain as NSObject,
    kSecReturnData: kCFBooleanTrue,
    kSecMatchLimit: kSecMatchLimitOne]
var rawResult: AnyObject?
let keychain_get_status: OSStatus = SecItemCopyMatching(keychainQuery as CFDictionary, &rawResult)

self.textView.text = "Reading something"

if (keychain_get_status == errSecSuccess) {
    if let retrievedData = rawResult as? Data,
        let password = String(data: retrievedData, encoding: String.Encoding.utf8) {
        // "password" contains the password string now
    }
} else {
    self.textView.text = "Error"
}

Также я использовал это Оболочка для ключей от Ti.Identity. Безуспешно. Я всегда получаю -25300, /* The specified item could not be found in the keychain. */

Что не так со стороны Свифта?

1 Ответ

0 голосов
/ 02 мая 2018

Это может быть не полный ответ, так как ваш вопрос довольно длинный, но есть пример приложения, которое утверждает, что делает это. Смотрите здесь

Вот его пример

Пожалуйста, не отрицайте, если это не совсем то, что вам нужно, можете предоставить соответствующую демонстрацию. Не пытался, но вы связались со Slack по этой ссылке - просто попытка дать больше информации.

...