我编写了一个使用 google plus 登录的 iOS 8 应用程序(在目标 C 中)。主应用程序及其共享扩展使用相同的钥匙串,因此使用 GPPSignInButton 从主应用程序登录为扩展提供了身份验证。问题是,如果两个目标以非常特定的顺序运行,我只能让它工作。
这不起作用:
- 打开主应用程序并登录(成功)
- 打开共享扩展并尝试“trySilentAuthentication” - 这会失败,因为对于共享扩展,钥匙串中没有身份验证。
但是 - 这确实有效:
- 首先打开共享扩展 - 正如预期的那样,钥匙串中没有身份验证
- 打开主应用程序并登录(成功)
- 重新打开共享扩展 - 这次钥匙串中有身份验证并且“trySilentAuthentication”成功。
因此,除非在主应用程序登录之前打开它,否则共享扩展似乎无法访问钥匙串中的身份验证。我认为这不是钥匙串的普遍问题,因为我能够分享其他应用程序和扩展程序之间的钥匙串中的对象类型,无论它们打开的顺序如何。
我已经使用两个单独的普通应用程序(没有扩展)做了一些实验,我发现同样的问题发生了 - 应用程序可以在钥匙串中共享 google plus auth,但前提是两个应用程序已经有机会访问 [GPPSignIn sharedInstance ] - 他们甚至不必对共享实例做任何事情,只需访问它。如果您先登录到一个应用程序,然后尝试使用现有的钥匙串加入,那么您将无法访问已经存在的身份验证。
有没有人遇到过这种类型的问题,或者知道如何调试身份验证过程以找出为什么订单如此重要?