ios - [iOS][AWS Cognito] 'logins' 已弃用 : Use "AWSIdentityProviderManager"

标签 ios objective-c amazon-web-services amazon-cognito amazon-cognito-facebook

我一直在尝试使用 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”已被弃用:使用“AWSIdentityProviderManager”向凭证提供程序提供有效的登录字典

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

亚马逊官方文档(英语、日语)和示例不是最新的,因此我不知道如何正确实现以验证用户身份。

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

AWS Cognito Swift credentials provider "logins is deprecated: Use 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 并告诉我如何在上面的代码中使用转换后的代码? 或者请告诉我官方推荐的代码?

最佳答案

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

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.在你的 View Controller 中。

@property MyProvider *myProvider;

3.使用应使用 token 初始化的 MyProvider 初始化 AWSCognitoCredentialsProvider。

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

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

@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

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

关于ios - [iOS][AWS Cognito] 'logins' 已弃用 : Use "AWSIdentityProviderManager",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38311479/

相关文章:

iphone - 如何有条件地不返回单元格

iphone - 在 NSArray iOS SDK 中更改对象的 alpha 值

ios - 拍照时如何改变 UIImagePickerController 中按钮的颜色?

amazon-web-services - 将 lambda 附加到现有 API GW cloudform

amazon-web-services - 如何在数百个 AWS 实例上拆分数据文件?

c# - 无法解析 AWS Elastic Transcoder 端点

ios - initWithCoder : and initWithFrame: 之间共享初始化方法的命名约定

iphone - 创建 "ipa"文件前是否可以查看应用大小?

ios - 在 UIActivityItemProvider 事件期间显示进度指示器

ios - 如何解决JSON字典