2017-01-26 2 views
1

私はユーザー名とパスワードを取るログオン画面を表示するアプリケーション(まだ学習中)を開発しようとしています。これはWebサービスにアクセスして認証し、アクセストークンを返します。userdefaultsキーが存在しない場合にのみログイン画面を表示するには?

アクセストークンはuserdefaultsに格納され、セキュリティ保護されたデータにアクセスできる新しいView Controllerが表示されます。

私の問題は、私のアプリを閉じるときに閉じるように強制すると、再びログインするように頼むことです。

私のログインビューコントローラは最初のビューコントローラであるため、userdefaultsにアクセストークンが存在するかどうかを確認するためのチェックを追加し、セキュリティ保護されたデータにアクセスする新しいView Controllerを表示します。今私の問題は、ログイン画面が常にセキュリティ保護されたビューコントローラの背後に開いているので、最初からアプリケーションを開くときに、セキュアビューコントローラを提示する前にログインビューコントローラを簡単に見ることができるということです。

私は理想的にこれを処理するでしょうか、ユーザのデフォルトキーが存在するとき、最初のView Controllerが保護されたView Controllerに設定されていますか? - これを行うにはどうすればログアウト機能を処理できますか? 'をルートビューコントローラに設定してユーザーのデフォルトをクリアしますが、ログイン画面がビュー階層にないので、これに戻ることはできません。ログアウト時にログイン・ビュー・コントローラを表示した場合、セキュア・ビュー・コントローラはまだログイン・ビュー・コントローラの下に存在します。

申し訳ありませんが、これは少し長時間巻き込まれているが、私は持っている問題を記述しようとしています。

おかげ

+0

@Michael、私はデモを書いて、以下のメインコードを投稿して、参照することができます。デモが必要な場合は、電子メールをここに残してください。 – aircraft

答えて

2

あなたはただ判断するAppdelegate.swiftapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)方法にする必要があります。

しかし、前提条件は、手動操作がウィンドウべきである:

はあなたのinfo.plistにこの行を削除します enter image description here

次に、あなたのAppDelegate.swiftに手動で自分のウィンドウを設定することができます。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    self.window = UIWindow.init(frame: UIScreen.main.bounds) 

    let sb:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil) 

    let isLogin:Bool = UserDefaults.standard.bool(forKey: "isLogin") 
    if isLogin { 

     let vc2 = sb.instantiateViewController(withIdentifier: "ViewController2") 

     self.window?.rootViewController = vc2 
    }else { 
     let vc1 = sb.instantiateViewController(withIdentifier: "ViewController") 
     self.window?.rootViewController = vc1 
    } 

    self.window?.makeKeyAndVisible() 

    return true 
} 

ViewController.swift(LoginVcと見なすことができます):

override func viewDidLoad() { 
    super.viewDidLoad() 

    /* add userdefaults */ 

    UserDefaults.standard.set(true, forKey: "isLogin") 
    UserDefaults.standard.synchronize() 

} 
+0

あなたがやっていることを理解してくれてありがとう@航空機しかし、どのように私はログイン/ログアウトを処理するように感謝したいと思いますユーザーがログインした後、私はメモリを節約するためにログインビューコントローラを取り除く必要がありますほかのすべてのView Controllerを取り除き、ログインビューコントローラを階層に残すだけですか? – Michael

+0

@マイケル、ちょうどrootViewControllerをログインvc – aircraft

+0

に設定することができます。 – Michael

関連する問題