簡體   English   中英

Appcelerator iOS 應用程序:如何從共享擴展中讀取鑰匙串值?

[英]Appcelerator iOS app: how to read Keychain value from Share Extension?

我有一個測試 Appcelerator iOS-only 應用程序(以簡化事情)。 你可以在這個repo 中獲得整個(非常小的應用程序)

這個應用程序使用Ti.Identity模塊從 Appcelerator 端在 Keychain 中存儲一個值,沒有問題。 問題是我無法從 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 ,並正確打印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 的這個Keychain Wrapper 沒有成功。 我總是得到-25300, /* The specified item could not be found in the keychain. */ -25300, /* The specified item could not be found in the keychain. */

Swift 方面有什么問題?

這可能不是一個完整的答案,因為您的問題很長,但有一個示例應用程序聲稱這樣做

這是他的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM