2017-05-23 2 views
0

私はUserDefaultsを使用してユーザーデータ(メールとパスワード)を格納するアプリケーションを持っています。ユーザーがこの情報を送信すると、次にユーザーがアプリを開いたときに、(ユーザーのデータが記録されている限り)アプリは登録ビューを表示しません。ユーザーのデフォルトに格納されているデータがない場合のみ、現在のログイン画面

これはセッションで行うことができますが、アプリに一度だけ登録ビューを表示するように指示するにはどうすればよいですか(情報の変更が必要な場合)?たとえば、ログインする必要があります。また、アプリケーションを開くと、すべてが既に読み込まれています(メイン画面)。

私のアプリはPHPを通してドメインに情報を送信するので、PHPセッションが役に立ちます。

+2

はちょうどそれが空でないかどうかを確認するために、キーの辞書値を確認...あなたのアプリケーションに国家保存修復を有効にする私の見解***で –

+0

は***だろうより良いオプション。 - https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Storagegies YourAppApp /Strategiesを実装してYourAppApp.htmlを実装する – user1046037

答えて

0

は、あなたは、あなたがトークンで扱っているモバイルアプリケーションやAPIを扱っている、特別に認証のいくつかの種類がありdidFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLauchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    guard let email = UserDefaults.standard.value(forKey: "email"), let password = UserDefaults.standard.value(forKey: "password") else { 
     // Not set up yet 
     showRegistration() 
     return true 
    } 

    // Already signing up 
    showLoginView() 

    return true 

} 
0

アプリのロジックを行うことができます。 これは、それが通常に行く方法です:あなたは、サーバーにそれを接続するためのAPI開発者または所有者があなたのアプリケーションのために作成されているあなたのclientSecret &のclientIdであなたの名&パスワードを送信

  1. 。コード例:

    func loginUser(email:String, pass:String, completion:@escaping (_ status:Bool, _ error:Error?, _ msg:String?) ->()) 
    { 
    
    //Get Api keys from plist file then send login request 
    helper.getApiKeys { (id, key) in 
    
        let parameters = [ 
    
         "grant_type":"password", 
         "client_id":id, 
         "client_secret":key, 
         "username":email, 
         "password":pass, 
         "scope":"" 
    
         ] as [String : Any] 
    
        let header = [ 
         "Content-Type":"application/json" 
        ] 
    
        Alamofire.request(loginUserURL!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: header) 
         .validate(statusCode: 200..<300) 
         .responseJSON { (response) in 
          switch response.result { 
          case .success(_): 
           let json = response.result.value! 
           let swiftyJson = JSON(json) 
           guard let expires = swiftyJson["expires_in"].double else { 
            return 
           } 
           let accessToken = swiftyJson["access_token"].stringValue 
           let refreshToken = swiftyJson["refresh_token"].stringValue 
           self.helper.setToken(expires: expires, aToken: accessToken, rToken: refreshToken) 
    
           completion(true, nil, nil) 
    
          case .failure(let err): 
           //print(err) 
           if response.response?.statusCode == 401 { 
            completion(false,err,"Invalid Username or Password") 
           } else { 
            completion(false, err, "Error Logging In") 
           } 
          } 
        } 
    
    } 
    
    } 
    
  2. あなたは、私が「アクセストークン」は「トークンを更新し、」構築された閉鎖機能で受信し「有効期限」

  3. あなたはトークンを保存有効期限はアプリ内でUserDefaultsを使用してログインしたページに移動します。コード例:

    //Save token in userdefaults 
    func setToken(expires:Double, aToken:String, rToken:String) { 
    
    //Change to expiry unix timeinterval date 
    let expiryTime = Date().timeIntervalSince1970 + expires 
    
    let userDefaults = UserDefaults.standard 
    userDefaults.set(expiryTime, forKey: "expires_in") 
    userDefaults.set(aToken, forKey: "access_token") 
    userDefaults.set(rToken, forKey: "refresh_token") 
    } 
    
  4. はその後たびにアプリは、ユーザーが認証されるかどうかをチェックフォアグラウンドに来ます。つまり、UserDefaultsに保存されているトークンが存在するかどうかをチェックすることを意味します。トークンの有効期限は今日のタイムスタンプによって有効です。有効期限が切れている場合は、トークンを更新できます。コード例:

    //Get tokens 
    private func getTokens (completion:(_ expires:TimeInterval?, _ accessToken:String?, _ refreshToken: String?) ->()) 
    { 
    let userDefaults = UserDefaults.standard 
    let access = userDefaults.string(forKey: "access_token") 
    let refresh = userDefaults.string(forKey: "refresh_token") 
    let expiry = userDefaults.double(forKey: "expires_in") 
    
    if (access != nil && refresh != nil) { 
        completion(expiry, access, refresh) 
    } else { 
        completion(nil,nil,nil) 
    } 
    } 
    
    //Check if user is already Authenticated 
    func isAuth() -> Bool { 
    
    var status = false 
    var apiId = Int() 
    var apiKey = String() 
    
    //Get tokens and test expiry time 
    getTokens { (expiry, accessToken, refreshToken) in 
        if (accessToken != nil && refreshToken != nil) { 
    
         //If due to expiry then refresh 
         if ((expiry! - Date().timeIntervalSince1970) < 2592000 /* 1 month */) { 
          print(expiry!); print(Date().timeIntervalSince1970) 
          getApiKeys(completion: { (id, key) in 
           apiId = id 
           apiKey = key 
          }) 
          refresh(refreshToken: refreshToken!, grantType: "refresh_token", clientId: apiId, clientSecret: apiKey, scope: "", completion: { (stat, err, msg) in 
    
           if stat { 
            status = true 
           } else { 
            status = false 
           } 
          }) 
    
         } else { 
          status = true 
         } 
    
        } else { 
         status = false 
        } 
    } 
    
    if status { 
        return true 
    } else { 
        return false 
    } 
    } 
    
  5. これは、ユーザは常にログインしているとisAuth()関数がfalseを返した場合を除いて、ログインのViewControllerに送られないことを意味します。私のケースでは、有効期限を過ぎたか、ユーザーがログアウトして自分のトークンを削除しました。コード例:

    //Delete token for loggin out 
    func logOut() { 
    
    let userDefaults = UserDefaults.standard 
    userDefaults.removeObject(forKey: "expires_in") 
    userDefaults.removeObject(forKey: "access_token") 
    
    // Segue user to login page 
    
    } 
    
関連する問題