首页 文章

将钥匙串共享添加到已有用户的 生产环境 应用程序

提问于
浏览
7

我们有一个已发布的iOS应用程序 . IDE是XCode6 . 我想添加钥匙串共享以从iOS 8共享扩展访问应用程序中存在的sessionID .

问题是,只要打开钥匙串共享,就无法再访问已存在的sessionID .

只要关闭钥匙串共享,就可以访问它 .

该字典被传递到SecItemCopyMatching,无论“Keychain Groups:”是什么,只要启用了keychain共享,它总是返回-25300(未找到) .

[0] (null)  @"svce" : @"SESSION_ID_KEY"   
[1] (null)  @"r_Data" : @"1"    
[2] (null)  @"m_Limit" : @"m_LimitOne"  
[3] (null)  @"class" : @"genp"  
[4] (null)  @"acct" : @"SESSION_ID_KEY"   
[5] (null)  @"pdmn" : @"ck"

知道为什么访问密钥可能不起作用?我尝试使用捆绑包前缀和名称设置kSecAttrAccessGroup,但它仍然无法在模拟器上运行 .

2 回答

  • 7

    希望我得到你的答案和赏金:)

    我最初遇到了同样的问题并遇到过这篇文章,我知道你提到过你试过捆绑前缀和名称 . 但是让我们进行一次健全检查 .

    MyApp.entitlementsMyApp Extension.entitlements 中,我将 Keychain Access Groups 设置为 $(AppIdentifierPrefix)com.company.MyApp (这是默认值) .

    我使用这个SO答案https://stackoverflow.com/a/20340883访问 ABCD1234 (也就是 AppIdentifierPrefix 值)的值,但硬编码可能不是这里的最佳做法,所以考虑看这个像这样的解决方案https://stackoverflow.com/a/11841898/2588957

    然后在我的应用程序中注意我添加的所有内容以使我当前的代码工作如下: [keychainItem setObject:@"ABCD1234.com.company.MyApp" forKey:(__bridge id)kSecAttrAccessGroup]; 在更新项目之前我现在可以访问我的共享扩展中的钥匙串项目 .

  • 1

    几个月前在iOS 7中实现应用内通信时,我遇到了类似的问题 . 我在Apple's GenericKeyChain sample project发现了这条评论:

    //为模拟器构建的应用程序未签名,因此没有钥匙串访问组
    //供模拟器检查 . 这意味着所有应用程序都可以在运行时查看所有钥匙串项目
    //在模拟器上
    //
    //如果SecItem包含访问组属性,则SecItemAdd和SecItemUpdate
    //模拟器将返回-25243(errSecNoAccessForItem) .

    因此,如果您在模拟器上进行测试,则需要删除“kSecAttrAccessGroup” .

    在设备上它应该使用此密钥 .

相关问题