iOS: вызов AWSMobileClient initialize () заставляет getUserAttributes () не вызывать обратный вызов - PullRequest
0 голосов
/ 01 августа 2020

Вот фрагмент кода, который я пытаюсь заставить работать, но пока безуспешно. initialize () работает нормально, но тогда getUserAttributes () не запускает обратный вызов. Не только getUserAttributes (), но и другие AWS вызовы, такие как getTokens (), тоже не запускаются. Поверьте, где-то внутри кода AWS он блокируется. Если я закомментирую initialize (), будет вызван обратный вызов getUserAttributes (). Пробовал различные варианты с DispatchQueue / DispatchGroup, без помощи.

AWSMobileClient pod версии 2.12.7.

import Foundation
import AWSMobileClient

struct AWSUser {
    static let serialQueue = DispatchQueue(label: "serialQueue")
    static let group = DispatchGroup()

    static func initialize() -> Void {
        DispatchQueue.global(qos: .background).async {
            AWSInitialize()
            getAWSUserAttributes()
        }
    }

    static func AWSInitialize() -> Void {

        group.enter()

        AWSMobileClient.default().initialize { (userState, error) in
            // error handling ...

            switch userState {
            case .signedIn:
                //getAWSUserAttributes()
                break
            default:
                break
            }
            group.leave()
        }
    }

    static func getAWSUserAttributes() {
        group.wait()
        group.enter()
        AWSMobileClient.default().getUserAttributes { (attrs, error) in
            // NEVER REACHED!!!
            // BUT WORKS IF AWSMobileClient.default().initialize() is commented out
            group.leave()
        }
    }
}

1 Ответ

1 голос
/ 01 сентября 2020

Для получения обратного вызова или запуска любого события AWSMobile Client убедитесь, что вы реализовали приведенный ниже код в AppDelegate или соответствующем контроллере представления. Если этот метод реализуется, то функция является триггером ...

 //Initialised Use Pool
        func intializeUserPool() -> Void {
            
            AWSDDLog.sharedInstance.logLevel = .verbose // TODO: Disable or reduce log level in production
            AWSDDLog.add(AWSDDTTYLogger.sharedInstance) // TTY = Log everything to Xcode console
            
            //Important for event handler
            initializeAWSMobileClient()
            
        }
        
        // Add user state listener and initialize the AWSMobileClient
        func initializeAWSMobileClient() {
            
            AWSMobileClient.default().initialize { (userState, error) in
                print("Initialise userstate:\(String(describing: userState)) and Info:\(String(describing: error))")
                if let userState = userState {
                    switch(userState){
                    case .signedIn: // is Signed IN
                        print("Logged In")
                        print("Cognito Identity Id (authenticated): \(String(describing: AWSMobileClient.default().identityId))")
                    case .signedOut: // is Signed OUT
                        print("Logged Out")
                        print("Cognito Identity Id (unauthenticated): \(String(describing: AWSMobileClient.default().identityId))")
                    case .signedOutUserPoolsTokenInvalid: // User Pools refresh token INVALID
                        print("User Pools refresh token is invalid or expired.")
                    default:
                        self.signOut()
                    }
                } else if let error = error {
                    print(error.localizedDescription)
                }
            }
            
            //Register State
            self.addUserStateListener() // Register for user state changes
        }
        
        // AWSMobileClient - a realtime notifications for user state changes
        func addUserStateListener() {
            
            AWSMobileClient.default().addUserStateListener(self) { (userState, info) in
                print("Add useruserstate:\(userState) and Info:\(info)")
                switch (userState) {
                case .signedIn:
                    print("Listener status change: signedIn")
                    DispatchQueue.main.async {
                        self.getSession()
                    }
                case .signedOut:
                    print("Listener status change: signedOut")
                case .signedOutFederatedTokensInvalid:
                    print("Listener status change: signedOutFederatedTokensInvalid")
                default:
                    print("Listener: unsupported userstate")
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...