65
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Swift + Parse.com] アプリ開発(認証編)

Posted at

SwiftとParse.comを使って簡単なブログアプリ開発します。

まずは、認証編です。

#認証種類
・Parse.comの独自認証
・Facebook認証
・Twitter認証

#画面遷移
##Parse.comの独自認証
①新規登録時
screenshot_06.pngscreenshot_07.pngscreenshot_08.png
※パスワードは6文字以上入力します。

②ログイン時
screenshot_10.pngscreenshot_08.png

##Facebook認証
screenshot_15.pngscreenshot_16.pngscreenshot_18.png

##Twitter認証
screenshot_21.pngscreenshot_22.pngscreenshot_23.png

#事前準備
以下のサイトを参考し、Parse.comへの接続テストまで完了します。
【参考】mBaaSを使ってみよう!超簡単にSwiftでTwitterライクなポスト機能を作る

#Parse.comの独自認証
PFLogInViewControllerを使用するため、「プロジェクト名-Bridging-Header.h」ファイルにParseUIを追加します。

プロジェクト名-Bridging-Header.h
#import <ParseUI/ParseUI.h>

フレームワークを追加します。
・Social.framework
・Accounts.framwork
※追加しないと、ビルドエラーが発生するので注意!
screenshot_04.png

##新規プロジェクトの作成
storyboardを開き、UILabelとUIButtonを追加し、loginLabelとloginOrLogoutメソッドへ紐付けます。
screenshot_03.png

LoginとSignUp処理を実装します。

ViewController.swift
//
//  ViewController.swift
//  ParseLoginSample

import UIKit

class ViewController: UIViewController, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate {

    @IBOutlet weak var loginLabel: UILabel!
    @IBOutlet weak var loginBtn: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

// 接続確認テスト
//        var testObject = PFObject(className: "TestObject")
//        testObject.setObject("bar", forKey: "foo")
//        testObject.saveInBackgroundWithBlock({(success, error) in
//            if success {
//                println("登録しました。")
//            } else {
//                println("登録失敗しました。")
//            }
//        })
    }

    override func viewWillAppear(animated: Bool) {
        // ログインしていない場合
        if PFUser.currentUser() == nil {
            loginLabel.text = "ログインしていません。"
            loginBtn.setTitle("login", forState: .Normal)
        } else {
            loginLabel.text = "\(PFUser.currentUser().username) ログイン中"
            loginBtn.setTitle("logout", forState: .Normal)
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func loginOrLogout(sender: AnyObject) {
        // loginボタンクリック時実装
        if PFUser.currentUser() == nil {
            login()
        } else {
            logout()
        }
    }

    // ログイン処理
    func login() {
        // Customize the LogInViewController
        let login = PFLogInViewController()
        login.delegate = self
        login.fields = (PFLogInFields.UsernameAndPassword
            | PFLogInFields.LogInButton
            | PFLogInFields.SignUpButton
            | PFLogInFields.PasswordForgotten
            | PFLogInFields.DismissButton)
        
        // Customize the SignUpViewController
        let signup = PFSignUpViewController()
        signup.fields = (PFSignUpFields.UsernameAndPassword
            | PFSignUpFields.SignUpButton
            | PFSignUpFields.Email
            | PFSignUpFields.DismissButton)
        signup.delegate = self
        login.signUpController = signup
        
        self.presentViewController(login, animated: true, completion: nil)
    }

    // ログアウト処理
    func logout() {
        PFUser.logOut()
        loginLabel.text = "ログインしていません。"
        loginBtn.setTitle("login", forState: .Normal)
    }

    // MARK: - PFLogInViewControllerDelegate

    func logInViewController(logInController: PFLogInViewController!, shouldBeginLogInWithUsername username: String!, password: String!) -> Bool {
        // ユーザ名とパスワードのチェック
        if !username.isEmpty && !password.isEmpty {
            return true
        }
        let alert = UIAlertView(title: "認証エラー", message: "ユーザもしくはパスワード入力が間違っています。", delegate: self, cancelButtonTitle: "キャンセル")
        alert.show()
        return false
    }
    
    func logInViewController(logInController: PFLogInViewController!, didLogInUser user: PFUser!) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func logInViewController(logInController: PFLogInViewController!, didFailToLogInWithError error: NSError!) {
        println("Failed to log in...")
    }
    
    func logInViewControllerDidCancelLogIn(logInController: PFLogInViewController!) {
        println("User dismissed the logInViewController")
    }

    // MARK: - PFSignUpViewControllerDelegate
    
    func signUpViewController(signUpController: PFSignUpViewController!,
        shouldBeginSignUp info: [NSObject : AnyObject]!) -> Bool {

            // パスワードが6文字以下はNG
            if let password = info?["password"] as? String {
                return password.utf16Count >= 6
            }
            return false
    }
    
    func signUpViewController(signUpController: PFSignUpViewController, didSignUpUser user: PFUser) -> Void {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func signUpViewControllerDidCancelSignUp(signUpController: PFSignUpViewController) -> Void {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func signUpViewController(signUpController: PFSignUpViewController!, didFailToSignUpWithError error: NSError!) {
        println("Failed to sign up...")
    }
}

ログイン・サインアップクラス
・PFLoginViewController
・PFSignUpViewController
・PFLogInViewControllerDelegate
・PFSignUpViewControllerDelegate

シミュレーターを起動し、動作確認します。

#Facebook認証
##Facebook DevelopersよりAppを登録
Facebook Developers
screenshot_11.png
App IDとApp Secretをメモします。

##Parse.comの設定画面を開き、さきほどメモしたApp IDとApp Secretを設定
screenshot_12.png

##iOS用Facebook SDKをインストール
インストール後、~{ユーザ}/Documents/FacebookSDK.frameworkをプロジェクトへ取込む。
screenshot_13.png

FacebookSDKを使用するためにヘッダーファイルへ追加します。

プロジェクト名-Bridging-Header.h
#import <FacebookSDK/FacebookSDK.h>
#import <ParseFacebookUtils/PFFacebookUtils.h>

##build settings
info.plistに作成したFacebookアプリのAPP IDを設定します。
①key = "FacebookAppID", type = String, value = your AppID
②key = "FacebookDisplayName", type = String, value = your App Name
③key = URL types = Array, dictionary-type child. That dictionary's child:
④key = URL Schemes, type = Array. The Array's child: type = String, value = "fb" + AppID
screenshot_17.png

##ViewController.swiftのloginメソッド修正

ViewController.swift

    // ログイン処理
    func login() {
        // Customize the LogInViewController
        let login = PFLogInViewController()
        login.delegate = self
        login.fields = (PFLogInFields.UsernameAndPassword
            | PFLogInFields.LogInButton
            | PFLogInFields.SignUpButton
            | PFLogInFields.PasswordForgotten
            | PFLogInFields.Facebook
            | PFLogInFields.DismissButton)
        
        // Customize the SignUpViewController
        let signup = PFSignUpViewController()
        signup.fields = (PFSignUpFields.UsernameAndPassword
            | PFSignUpFields.SignUpButton
            | PFSignUpFields.Email
            | PFSignUpFields.DismissButton)
        signup.delegate = self
        login.signUpController = signup
        
        self.presentViewController(login, animated: true, completion: nil)
    }

login.fieldsにPFLogInFields.Facebookを追加します。

シミュレーターを起動し、動作確認します。

#Twitter認証
##Twitter DevelopersよりAppを登録
screenshot_20.png

上記APIキーをメモ

##AppDelegate.swiftの修正

AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Parse.com設定
        Parse.setApplicationId("アプリケーションID", clientKey: "クライアントキー")

        // facebook初期化
        PFFacebookUtils.initializeFacebook()

        // dev.twitter.comで登録したキーを設定
     PFTwitterUtils.initializeWithConsumerKey("API Key", consumerSecret: "API Secret")
        return true
    }

PFTwitterUtils.initializeWithConsumerKeyを追加し、さきほどメモしたAPIキーを設定します。

##ViewController.swiftのloginメソッド修正

ViewController.swift

    // ログイン処理
    func login() {
        // Customize the LogInViewController
        let login = PFLogInViewController()
        login.delegate = self
        login.fields = (PFLogInFields.UsernameAndPassword
            | PFLogInFields.LogInButton
            | PFLogInFields.SignUpButton
            | PFLogInFields.PasswordForgotten
            | PFLogInFields.Facebook
            | PFLogInFields.Twitter
            | PFLogInFields.DismissButton)
        
        // Customize the SignUpViewController
        let signup = PFSignUpViewController()
        signup.fields = (PFSignUpFields.UsernameAndPassword
            | PFSignUpFields.SignUpButton
            | PFSignUpFields.Email
            | PFSignUpFields.DismissButton)
        signup.delegate = self
        login.signUpController = signup
        
        self.presentViewController(login, animated: true, completion: nil)
    }

login.fieldsにPFLogInFields.Twitterを追加します。

シミュレーターを起動し、動作確認します。

以上。

サンプルプロジェクトをGitHubにアップしました。
GitHub

次回にはアプリ開発(本編)を掲載します。

65
64
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?