0

我正在尝试在使用 AWSMobileClient 的 iOS 应用程序中使用 Cognito 提供的谷歌联合登录功能。我有最新的放大 (4.11.0) 和 AWS 工具包。

我的 pod 文件中有以下内容:

pod 'AWSAPIGateway'
pod 'AWSMobileClient'
pod 'AWSAuthUI'
pod 'AWSUserPoolsSignIn'
pod 'GoogleSignIn'
pod 'AWSGoogleSignIn'

我使用标准的AWSMobileClient初始化调用然后showSignIn方法来显示登录屏幕,但出现以下异常:

'NSUnknownKeyException', reason: '[<GIDSignIn 0x600003f19e00> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key uiDelegate.'

我的awsconfiguration文件有以下条目:

"GoogleSignIn": {
          "Permissions": "email,profile,openid",
          "ClientId-WebApp": "XXXXXXXXX-YYYYYYYYYYYYYY.apps.googleusercontent.com",
          "ClientId-iOS": "ZZZZZZZZZZZ-VVVVVVVVVVVVV.apps.googleusercontent.com"
      }

这是在我创建身份验证后端时由放大生成的(以及用户池、身份等的其他条目)。我还在谷歌开发者网站上设置了必要的项目和凭据。

使用 Cognito 托管的 UI(浏览器 URL),我可以毫无问题地使用谷歌登录,只是不使用 iOS 应用程序。

如果我删除 ClientId-iOS 条目,则不再发生异常,但登录屏幕没有 google 按钮。

4

1 回答 1

0

不完全是一个答案,但这里有太多的评论。

您的崩溃似乎发生在此处找到的文件中

相关代码:

- (instancetype)initWithGoogleClientID:(NSString *)googleClientID {
    if (self = [super init]) {
        _semaphore = dispatch_semaphore_create(0);
        
        NSOperationQueue *operationQueue = [NSOperationQueue new];
        _executor = [AWSExecutor executorWithOperationQueue:operationQueue];
        
        _signInViewController = nil;
        
        _signInClient = [NSClassFromString(@"GIDSignIn") sharedInstance];
        [self.signInClient setValue:self forKey:@"delegate"];
        [self.signInClient setValue:self forKey:@"uiDelegate"]; // Crashes here
        [self.signInClient setValue:googleClientID forKey:@"clientID"];
        [self.signInClient setValue:@[AWSGoogleSignInProviderClientScope, AWSGoogleSignInProviderOIDCScope] forKey:@"scopes"];
    }
    
    return self;
}

我标记了您的崩溃似乎发生的行。

它正在尝试设置此处看到的属性GIDSignIn

// The object to be notified when sign in dispatch selection is finished.
@property(nonatomic, weak) id<GIDSignInUIDelegate> uiDelegate;

这只是粗略的一瞥,但sharedInatance被调用是在后台线程上创建的,因此存在竞争问题导致问题的可能性。我建议在该区域设置一些断点并进行测试,以查看您所在的线程以及调用时可用的属性。

假设 SDK 有问题,您可以创建一个问题,他们可能会修复它。

于 2020-01-03T21:54:22.707 回答