2017-02-19 131 views
0

我在嘗試使用cognito aws進行簽名時出現以下錯誤,它實際上會檢查用戶憑據,但會在運行時崩潰應用程序。使用AWS登錄

我想在成功登錄後顯示我的mainView,並且我不知道我丟失了什麼,但是當我運行它時應用程序崩潰。

我希望我解釋清楚自己。

2017-02-19 19:46:12.770 HDPTestV2[28298:5420991] -[AWSTask exception]: unrecognized selector sent to instance 0x60000006ab40 
2017-02-19 19:46:12.773 HDPTestV2[28298:5420991] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AWSTask exception]: unrecognized selector sent to instance 0x60000006ab40' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010b32dd4b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x000000010ad9621e objc_exception_throw + 48 
    2 CoreFoundation      0x000000010b39df04 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132 
    3 CoreFoundation      0x000000010b2b3005 ___forwarding___ + 1013 
    4 CoreFoundation      0x000000010b2b2b88 _CF_forwarding_prep_0 + 120 
    5 HDPTestV2       0x0000000109d9f8f7 __35-[AWSIdentityManager completeLogin]_block_invoke_2 + 263 
    6 libdispatch.dylib     0x000000010d84f978 _dispatch_call_block_and_release + 12 
    7 libdispatch.dylib     0x000000010d8790cd _dispatch_client_callout + 8 
    8 libdispatch.dylib     0x000000010d8598a4 _dispatch_main_queue_callback_4CF + 406 
    9 CoreFoundation      0x000000010b2f1e49 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    10 CoreFoundation      0x000000010b2b737d __CFRunLoopRun + 2205 
    11 CoreFoundation      0x000000010b2b6884 CFRunLoopRunSpecific + 420 
    12 GraphicsServices     0x000000010f79ca6f GSEventRunModal + 161 
    13 UIKit        0x000000010b751c68 UIApplicationMain + 159 
    14 HDPTestV2       0x0000000109d9c8af main + 111 
    15 libdyld.dylib      0x000000010d8c568d start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

- > SignInController.swift

// SignInViewController.swift 
// HDPTestV2 
// 
// Created by Gael Wamba Musikingala on 2017/02/19. 
// Copyright © 2017 Gael Wamba Musikingala. All rights reserved. 
// 

import UIKit 
import AWSMobileHubHelper 
import AWSCognitoIdentityProvider 

class SignInViewController: UIViewController { 

    @IBOutlet weak var usernameField: UITextField! 
    @IBOutlet weak var passwordField: UITextField! 

    var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func onSignIn(_ sender: UIButton) { 
     self.handleCustomSignIn() 
    } 

    func handleLoginWithSignInProvider(signInProvider: AWSSignInProvider){ 
     AWSIdentityManager.defaultIdentityManager().loginWithSign(signInProvider) { (result:Any?, error: Error?) in 
      if error == nil { 
       /* Handle successful login. */ 
       DispatchQueue.main.async(execute:{ 
        let mainViewController = self.storyboard!.instantiateViewController(withIdentifier: "MainView") as! MainViewController 
        let appDelegate = UIApplication.shared.delegate as! AppDelegate 
        appDelegate.window?.rootViewController = mainViewController 
        appDelegate.window?.makeKeyAndVisible() 
       }) 
      } 
      print("Login with signin provider result = \(result), error = \(error)") 
     } 
    } 

} 

---> SignInViewControllerExtensions.swift

import Foundation 
import AWSCognitoIdentityProvider 
import AWSMobileHubHelper 

// Extension containing methods which call different operations on Cognito User Pools (Sign In, Sign Up, Forgot Password) 
extension SignInViewController { 

    func handleCustomSignIn() { 
     // set the interactive auth delegate to self, since this view controller handles the login process for user pools 
     AWSCognitoUserPoolsSignInProvider.sharedInstance().setInteractiveAuthDelegate(self) 
     self.handleLoginWithSignInProvider(signInProvider: AWSCognitoUserPoolsSignInProvider.sharedInstance()) 
    } 

    func handleUserPoolSignUp() { 
     let storyboard = UIStoryboard(name: "UserPools", bundle: nil) 
     let viewController = storyboard.instantiateViewController(withIdentifier: "SignUp") 
      self.present(viewController, animated:true, completion:nil); 
    } 

    func handleUserPoolForgotPassword() { 
     let storyboard = UIStoryboard(name: "UserPools", bundle: nil) 
     let viewController = storyboard.instantiateViewController(withIdentifier: "ForgotPassword") 
      self.present(viewController, animated:true, completion:nil); 
    } 
} 

// Extension to adopt the `AWSCognitoIdentityInteractiveAuthenticationDelegate` protocol 
extension SignInViewController: AWSCognitoIdentityInteractiveAuthenticationDelegate { 

    // this function handles the UI setup for initial login screen, in our case, since we are already on the login screen, we just return the View Controller instance 
    func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication { 
     return self as AWSCognitoIdentityPasswordAuthentication 
    } 

    // prepare and setup the ViewController that manages the Multi-Factor Authentication 
    func startMultiFactorAuthentication() -> AWSCognitoIdentityMultiFactorAuthentication { 
     let storyboard = UIStoryboard(name: "UserPools", bundle: nil) 
     let viewController = storyboard.instantiateViewController(withIdentifier: "MFA") 
     DispatchQueue.main.async(execute: { 
      self.present(viewController, animated:true, completion:nil); 
     }) 
     return viewController as! AWSCognitoIdentityMultiFactorAuthentication 
    } 
} 

// Extension to adopt the `AWSCognitoIdentityPasswordAuthentication` protocol 
extension SignInViewController: AWSCognitoIdentityPasswordAuthentication { 

    func getDetails(_ authenticationInput: AWSCognitoIdentityPasswordAuthenticationInput, 
      passwordAuthenticationCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>){ 
     self.passwordAuthenticationCompletion = passwordAuthenticationCompletionSource 
    } 

    func didCompleteStepWithError(_ error: Error?){ 
     if let error = error { 
      let errorString = (error as NSError).userInfo 
      DispatchQueue.main.async(execute: { 
      UIAlertView(title: errorString["__type"] as? String, 
         message: errorString["message"] as? String, 
         delegate: nil, 
         cancelButtonTitle: "Ok").show() 
      }) 
     } 

    } 
} 

// Extension to adopt the `AWSCognitoUserPoolsSignInHandler` protocol 
extension SignInViewController: AWSCognitoUserPoolsSignInHandler { 
    func handleUserPoolSignInFlowStart() { 
     // check if both username and password fields are provided 
     guard let username = self.usernameField.text, !username.isEmpty, 
      let password = self.passwordField.text, !password.isEmpty else { 
       DispatchQueue.main.async(execute: { 
        UIAlertView(title: "Missing UserName/Password", 
         message: "Please enter a valid user name/password.", 
         delegate: nil, 
         cancelButtonTitle: "Ok").show() 
       }) 
       return 
     } 
     // set the task completion result as an object of AWSCognitoIdentityPasswordAuthenticationDetails with username and password that the app user provides 
     self.passwordAuthenticationCompletion?.set(result: AWSCognitoIdentityPasswordAuthenticationDetails(username: username, password: password)) 
    } 
} 

- > AppDelegate.swift

// AppDelegate.swift 
// HDPTestV2 
// 
// Created by Gael Wamba Musikingala on 2017/02/18. 
// Copyright © 2017 Gael Wamba Musikingala. All rights reserved. 
// 

import UIKit 
import AWSMobileHubHelper 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 
     return AWSMobileClient.sharedInstance.didFinishLaunching(application: application, withOptions: launchOptions as [NSObject : AnyObject]?) 
    } 

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { 
     return AWSMobileClient.sharedInstance.withApplication(application: application, withURL: url as NSURL, withSourceApplication: sourceApplication, withAnnotation: annotation as AnyObject) 
    } 

    func applicationWillResignActive(_ application: UIApplication) { 
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
     // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 
    } 

    func applicationDidEnterBackground(_ application: UIApplication) { 
     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    } 

    func applicationWillEnterForeground(_ application: UIApplication) { 
     // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    } 

    func applicationDidBecomeActive(_ application: UIApplication) { 
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
     AWSMobileClient.sharedInstance.applicationDidBecomeActive(application: application) 
    } 

    func applicationWillTerminate(_ application: UIApplication) { 
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    } 


} 

回答

0
DispatchQueue.main.async(execute:{ 
       let mainViewController = self.storyboard!.instantiateViewController(withIdentifier: "MainView") as! MainViewController 
       let appDelegate = UIApplication.shared.delegate as! AppDelegate 
       appDelegate.window?.rootViewController = mainViewController 
       appDelegate.window?.makeKeyAndVisible() 
      }) 

評論這條線一段時間,並在這裏打印一些東西,並檢查你到達那裏或沒有?