2

我一直在尝试使用 Amazon Cognito 在 iOS 上使用 Facebook 和 Twitter 对用户进行身份验证。我无法实施,因为官方文件很旧。

这是我的代码:

   NSString *token = [FBSDKAccessToken currentAccessToken].tokenString;

   credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionAPNortheast1 identityPoolId:IDENTITY_POOL_ID];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionAPNortheast1
                                                                        credentialsProvider:credentialsProvider];

   credentialsProvider.logins = @{ AWSIdentityProviderFacebook: token };
   NSLog(@"credentialsProvider.logins : %@", credentialsProvider.logins);
   [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

但是 Xcode 这么说‘logins’ is deprecated: Use “AWSIdentityProviderManager” to provide a valid logins dictionary to the credentials provider

我发现 credentialsProvider.logins 返回 [null] 因为登录已被弃用。

亚马逊官方文档(英文、日文)和样本不是最新的,所以我不知道如何正确实施来验证用户。

最后,我在 Swift 中找到了一个解决方案,但我不知道。

AWS Cognito Swift 凭证提供商“不推荐使用登录:使用 AWSIdentityProviderManager”

import Foundation
import AWSCore
import AWSCognito
import AWSCognitoIdentityProvider
class CustomIdentityProvider: NSObject, AWSCognitoIdentityProviderManager{
    var tokens : [NSString : NSString]?
    init(tokens: [NSString : NSString]) {
        self.tokens = tokens
    }
    @objc func logins() -> AWSTask {
        return AWSTask(result: tokens)
    }
}


let customProviderManager = CustomIdentityProvider(tokens: logins!)

self.credentialsProvider = AWSCognitoCredentialsProvider(
   regionType: Constants.COGNITO_REGIONTYPE,
   identityPoolId: Constants.COGNITO_IDENTITY_POOL_ID,
   identityProviderManager: customProviderManager)

您能否将这些代码转换为 Objective-C 并告诉我如何在上面的代码中使用转换后的代码?或者请告诉我官方推荐的代码?

4

2 回答 2

5

几天前我终于想出了如何解决这个问题。

1.将这个用Swift编写的类添加到你的Objc项目中。

// CognitoCustomProviderManager.swift

import Foundation
import AWSCognitoIdentityProvider

class MyProvider:NSObject, AWSIdentityProviderManager{
  var tokens : [NSString : NSString]?
  init(tokens: [NSString : NSString]) {
    self.tokens = tokens
    print("tokens : ", self.tokens);
  }
  @objc func logins() -> AWSTask {
    return AWSTask(result: tokens)
  }
}

2.在您的视图控制器中。

@property MyProvider *myProvider;

3.Initialze AWSCognitoCredentialsProvider with MyProvider 应该用令牌初始化。

MyProvider *Provider = [[MyProvider alloc] initWithTokens:@{AWSIdentityProviderFacebook : token }];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:COGNITO_REGION_TYPE identityPoolId:IDENTITY_POOL_ID identityProviderManager:Provider];

*如果你想在 Objc 中编写 MyProvider。根据{yourProjectName}-Swift.h添加 Swift 文件后创建的内容,也许这应该有效?我还没有检查这段代码是否有效。

@interface MyProvider : NSObject <AWSIdentityProviderManager>
@property (nonatomic, copy) NSDictionary<NSString *, NSString *> * _Nullable tokens;
- (nonnull instancetype)initWithTokens:(NSDictionary<NSString *, NSString *> * _Nonnull)tokens OBJC_DESIGNATED_INITIALIZER;
- (AWSTask * _Nonnull)logins;
@end

我花了很多时间让它工作。所以我希望这篇文章对有同样问题的人有所帮助!谢谢。

于 2016-07-19T17:20:48.390 回答
0

同样的问题:||

我阅读了您发布的解决方案示例,发现有一个更新的示例

更新的示例链接

更新的示例是在 Swift 中实现的,但他们解决了这个问题并由 Object-C 实现。检查更新示例中的文件夹“DeveloperAuthenticated”。

于 2016-07-14T20:10:53.207 回答