開発合宿で OAuth 認証の API を使う iOS サンプルアプリを作った #mokumoku_onsen

1/9(土)〜11(月)で開発合宿に参加してました。

mokumoku-onsen.connpass.com

作ったもの

Swift の勉強のため、 OAuth 認証の Web API を使う iOSアプリを作りました。

スクリーンショット

最初のページ

f:id:sinsoku:20160111145050p:plain

OAuth 認証のあと

f:id:sinsoku:20160111181640p:plain

コード

コードは GitHub に置いてあります。

sinsoku/OAuthSample · GitHub

抜粋

// AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool {
        if (url.host == "oauth-callback") {
            OAuthSwift.handleOpenURL(url)
        }
        return true
    }
}

OAuthSwift の README に従って、AppDelegate にメソッドを追加する。

// ViewController.swift
import OAuthSwift

class ViewController: UIViewController {
    @IBAction func signupWithOAuth(sender: AnyObject) {
        let oauthswift = OAuth2Swift(
            consumerKey:    "<Client ID>",
            consumerSecret: "<Client Secret>",
            authorizeUrl:   "https://github.com/login/oauth/authorize",
            accessTokenUrl: "https://github.com/login/oauth/access_token",
            responseType:   "code"
        )
        oauthswift.authorizeWithCallbackURL(
            NSURL(string: "oauth-sample://oauth-callback")!,
            scope: "", state:"OAuthSample",
            success: { credential, response, parameters in
                print(credential.oauth_token)

                let defaults = NSUserDefaults.standardUserDefaults()
                defaults.setValue(credential.oauth_token, forKey: "oauth_token")

                let nextVC = self.storyboard?.instantiateViewControllerWithIdentifier("DashBoard")
                nextVC?.modalTransitionStyle = .CrossDissolve
                self.presentViewController(nextVC!, animated: true, completion: nil)
            },
            failure: { error in
                print(error.localizedDescription)
            }
        )
    }
}

OAuth 認証を始めるためのボタンを置いて、クリックしたときの処理をこんな感じで書いた。

  1. access_token を userDefaults に保存
  2. シーンの移動
// DashBoardViewController.swift
import Alamofire

class DashBoardViewController: UIViewController {

    @IBOutlet weak var access_token: UILabel!
    
    @IBOutlet weak var apiResult: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let defaults = NSUserDefaults.standardUserDefaults()
        access_token.text = defaults.stringForKey("oauth_token")
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func clickUser(sender: AnyObject) {
        apiResult.text = ""
        Alamofire.request(.GET, "https://api.github.com/user", parameters: ["access_token": access_token.text!])
            .responseJSON { response in
                if let json = response.result.value {
                    self.apiResult.text = json.description
                }
        }
    }
}

OAuth 認証後の画面でボタンを押すと、 /userAPI を実行した結果を画面に表示している。

まとめ

Swift 初心者なのでこのぐらいの機能でも結構時間がかかってしまった。もっとコードを書いて、少しずつ iOS アプリ制作に慣れたい。