0

現在、Cognito と Cloud Logic を利用する iOS アプリケーションに AWS Mobile Hub を使用しています。

見た目が気に入らなかったので、デフォルトの AuthUIViewController を置き換えることにしました。このサンプル プロジェクトを使用して、ユーザー プール経由のサインアップを実装しました: https://github.com/awslabs/aws-sdk-ios-samples/tree/master/CognitoYourUserPools-Sample/Swift

これが私の実装です:

AppDelegate から始めて、サインインする UserPool を一般的にアクセス可能な定数変数に設定します。AWSMobileClient が自分のユーザーがサインインしていると認識しない理由について考えなければならない 1 つの考えは、AWSMobileClient が独自のサービス構成/プールを定義しているためですが、よくわかりません:

func application(_ application: UIApplication, didFinishLaunchingWithOptions     launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    AWSDDLog.add(AWSDDTTYLogger.sharedInstance)
    AWSDDLog.sharedInstance.logLevel = .verbose

    // setup service configuration
    let serviceConfiguration = AWSServiceConfiguration(region: Constants.AWS.CognitoIdentityUserPoolRegion, credentialsProvider: nil)

    // create pool configuration
    let poolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: Constants.AWS.CognitoIdentityUserPoolAppClientId,
                                                                    clientSecret: Constants.AWS.CognitoIdentityUserPoolAppClientSecret,
                                                                    poolId: Constants.AWS.CognitoIdentityUserPoolId)

    // initialize user pool client
    AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: poolConfiguration, forKey: AWSCognitoUserPoolsSignInProviderKey)

    // fetch the user pool client we initialized in above step
    Constants.AWS.pool = AWSCognitoIdentityUserPool(forKey: AWSCognitoUserPoolsSignInProviderKey)

    return AWSMobileClient.sharedInstance().interceptApplication(
        application, didFinishLaunchingWithOptions:
        launchOptions)
} 

AppDelegate が完了すると、アプリケーションは InitialViewController という名前のルート ビュー コントローラーに移動します。ここでは、ユーザーが facebook サインインまたは通常の (ユーザープール) サインインをクリックできるようにします。

class InitialViewController:UIViewController {

@objc func regLogin() {
 //Set a shared constants variable "user" to the current user   
 if (Constants.AWS.user == nil) {
        Constants.AWS.user = Constants.AWS.pool?.currentUser()
    }
    Constants.AWS.pool?.delegate = self

    //This function calls the delegate function startPasswordAuthentication() in the extension below to initiate login
        Constants.AWS.user?.getDetails().continueOnSuccessWith { (task) -> AnyObject? in
            DispatchQueue.main.async(execute: {
    //called after details for user are successfully retrieved after login                
                print(AWSSignInManager.sharedInstance().isLoggedIn)// false
                print(AWSSignInManager.init().isLoggedIn)// false
                print(AWSCognitoUserPoolsSignInProvider.init().isLoggedIn())// false
                print(Constants.AWS.user?.isSignedIn) // true
                AppDelegate.del().signIn()
            })
            return nil
        }
      }
    }

extension InitialViewController: AWSCognitoIdentityInteractiveAuthenticationDelegate {

func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication {
    self.present(loginVC, animated: true, completion: nil)
    return self.loginVC
}
}

ご覧のとおり、関数が機能し、(Constants.AWS.user?.isSignedIn) に従ってユーザーが正常にログインしていることと、ユーザーの詳細を正常に取得できていることがわかります。ただし、ユーザーがログインしているかどうかを AWSSignInManager または UserPoolsSignInProvider に尋ねると、false が返されます。AWSMobileHub が自分のユーザーがログインしていることを認識しないと、Cloud Logic 機能などにアクセスできないため、これは問題です。

アプリケーションが正しく動作するように、ユーザーがユーザー プールにログインしていることを MobileHub とサインイン マネージャーに通知する方法を教えてください。

ありがとう!

4

2 に答える 2