Как получить имя пользователя для входа с помощью AWS Mobile-hub SDK

Я некоторое время работал над частью входа в мое приложение. Я пытаюсь использовать ASW Mobile Hub для этого дела. Я нашел способ заставить его работать с разными провайдерами, которые мне нужны: мой собственный пул пользователей, FB и Google.

Проблема в том, что я искал здесь и во всей документации AWS, пытаясь найти способ получить пользовательские данные (имя пользователя и некоторые другие пользовательские данные, такие как изображение, электронная почта и т. д.). Я могу получить его, если я использую FBSDK напрямую (используя FBSDKGraphRequest), но я не знаю, как это сделать, если пользователь решит войти в мой когнитивный пул пользователей. Также я не вижу, какого провайдера пользователь использовал после успеха.

Я могу найти другие способы получить это, но использование старого SDK или непосредственно вызовов Cognito изначально не то, что мне нужно. Вот код, который я использую для представления окна входа в систему:

    override func viewDidLoad() {
       super.viewDidLoad()

       if !AWSSignInManager.sharedInstance().isLoggedIn {
         presentAuthUIViewController()
       }
    }

    func presentAuthUIViewController() {
        let config = AWSAuthUIConfiguration()
        config.enableUserPoolsUI = true
        config.addSignInButtonView(class: AWSFacebookSignInButton.self)
        config.addSignInButtonView(class: AWSGoogleSignInButton.self)


        AWSAuthUIViewController.presentViewController(
        with: self.navigationController!,
        configuration: config, completionHandler: { (provider: 
        AWSSignInProvider, error: Error?) in
            if error == nil {
                // SignIn succeeded.
            } else {
                // end user faced error while loggin in, take any 
                required action here.
            }
        })
     }

Итак, вопрос в том, как я могу получить соответствующую информацию о пользователе после успешного входа?


person Alex Ra    schedule 31.01.2018    source источник
comment
Загрузите образец приложения, созданный AWS Mobile Hub, и импортируйте его в Xcode после настройки функций. Он будет содержать реализацию некоторых основных функций, включая получение сведений о пользователе.   -  person Shravya    schedule 01.02.2018
comment
Можете ли вы предоставить мне ссылку на этот пример приложения, единственное, что я могу найти, это несколько строк кода, не связанных друг с другом, различные методы выполнения чего-то похожего, но не одного и того же, и некоторые устаревшие примеры приложений в Swift 2, которые бесполезны... спасибо   -  person Alex Ra    schedule 01.02.2018
comment
Вы можете загрузить образец приложения из своей учетной записи AWS, и образец приложения будет отличаться в зависимости от включенных вами функций. Перейдите по этой ссылке: docs.aws.amazon. com/pinpoint/latest/developerguide/   -  person Shravya    schedule 01.02.2018
comment
До сих пор нет способа получить имя пользователя. Со всей документацией и с этим образцом единственное, что я могу получить (что на самом деле очень ценно), это identityId. Любой другой совет?   -  person Alex Ra    schedule 02.02.2018
comment
Я обновил свой ответ, пожалуйста, проверьте, помогает ли это   -  person Shravya    schedule 02.02.2018
comment
@Alex Ra Удалось найти решение? Я не могу найти ничего, что помогло бы найти основную информацию о пользователе. Я опубликовал это давно: stackoverflow.com/questions/47548201/   -  person Aseem    schedule 04.02.2020


Ответы (2)


Если пользователь использовал логин cognito, вы можете использовать приведенный ниже код, чтобы получить имя пользователя.

let identityManager = AWSIdentityManager.default()
let identityUserName = identityManager.identityProfile?.userName

Для получения провайдера после успеха пользователя сохраните его в сеансе, как показано ниже.

func onLogin(signInProvider: AWSSignInProvider, result: Any?, 
authState: AWSIdentityManagerAuthState, error: Error?) {
  let defaults = UserDefaults.standard
  defaults.set(signInProvider.identityProviderName, forKey: 
     "identityProviderName")
}

Надеюсь, этот ответ поможет.

Обновлен код для получения имени пользователя:

let pool = AWSCognitoIdentityUserPool.init(forKey: "CognitoUserPools")
let username = pool.currentUser()?.username
person Shravya    schedule 01.02.2018
comment
AWSIdentityManager не имеет члена identityProfile? - person Alex Ra; 01.02.2018

Я работал над обходным путем, пока не разобрался с этим более элегантным способом. Я предполагаю, что мне нужно углубиться в понимание Cognito. Но дело в том, что даже образец, предоставленный Amazon, не показывает имя пользователя...

Пример экрана приложения Amazon

Итак, тем временем я изменил исходный код библиотеки Cognito AWSUserPoolsUIOperations, чтобы отправлять мне данные непосредственно в мое приложение в сообщении:

@implementation AWSUserPoolsUIOperations

-(void)loginWithUserName:(NSString *)userName
            password:(NSString *)password
            navigationController:(UINavigationController *)navController
            completionHandler:(nonnull void (^)(id _Nullable, NSError * 
            _Nullable))completionHandler {
            self.userName = userName;

NSDictionary* userInfo = @{@"username": self.userName};

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"UsernameNotification"
 object:nil userInfo:userInfo];

А затем просто получить сообщение в приложении и сохранить значение.

    @objc private func TestNotification(_ notification: NSNotification){
    if let dict = notification.userInfo as NSDictionary? {
        if let username = dict["username"] as? String {
            appEstats.username = username
            defaults.set(username, forKey: sUserName)
        }
    }
}

Как я уже сказал, это не решение, но тем временем оно работает.

person Alex Ra    schedule 06.03.2018