Parseを触ってみた(iOS-1) - ユーザ管理 -


MBaaSの有名どころであるParseを触ってみた。
色々と出来るのだけども、今回はその中からユーザ管理(の一部)についてまとめてみた。

# MBaaSってなに？
```
スマートフォンアプリの開発に必要な汎用的機能をAPI、SDKで提供しサーバー側のコードを書くことなく、サーバー連携するスマートフォンアプリを効率よく開発出来るようにするクラウドサービス

http://mb.cloud.nifty.com/about.htm
```

# Parseってなに？
2013年にFacebookに買収されたことでも有名になったサービス。
2014年12月には[技術ドキュメント](https://www.parse.com/docs/jp)を日本語化し提供もしている。

機能的としては、「データ管理」、「Push通知」、「Analytics」などがある。


## 値段は？
30 APIリクエスト/秒までは無料。

詳細は以下の参考ページを見ると詳しく載っている。
参考：http://dev.classmethod.jp/smartphone/parse-new-pricing/


# ユーザ管理
今回述べるのは以下の機能ついて

 - ユーザの作成
   - メール認証
 - ログイン/ログアウト
 - パスワードの再設定

上記以外にも、以下の様な機能があるけど今回は割愛。

 - ロール
 - Facebook連携
 - Twitter連携


## 環境
 - iOS
   - SDKの管理はcocoapodsを利用
     - http://cocoadocs.org/docsets/Parse/1.6.4/

```ruby:Podfile
platform :ios, "7.0"

target "parse" do
	pod 'Parse', '~> 1.6'
end
```

## initialize
最初に以下を呼び出しておく必要がある。
AppDelegateの```application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions```で呼んでおくといい。

```objectivec:サンプルコード
 [Parse setApplicationId:@"あなたのApplication ID" clientKey:@"Client Key"];
```
Parseで登録したアプリのSettings -> KeysにあるApplication IDとClient Keyを設定する。

## ユーザの作成
コードとしては、以下だけでユーザを作成してくれる。

```objectivec:サンプルコード
PFUser *user  = [PFUser user];
user.username = @"my name";
user.password = @"my pass";
user.email    = @"email@example.com"; //optional

//上記以外に自身で以下のように追加することも可能
user[@"phone"] = @"650-555-0000";
    
[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
	if (!error) {
		//ユーザの作成に成功
    } else {
    	NSString *errorString = [error userInfo][@"error"];
    	//アプリの作成に失敗
    	//エラー内容を見れば理由がだいたい分かる。
    }
}];
```

 - usernameとpasswordは必須。
 - emailはオプション。
 - 上記3種類以外に追加したい場合は、自身で追加することも可能。


作成するとParseの管理画面に以下の様にUserという項目が出来る。
![スクリーンショット 2015-02-22 21.25.27.png](https://qiita-image-store.s3.amazonaws.com/0/37642/76d1ed9e-908c-27c8-855b-08ad604932b5.png "スクリーンショット 2015-02-22 21.25.27.png")

Parseの管理画面からは、ユーザの削除や情報の編集ができる。

![スクリーンショット 2015-02-22 21.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/37642/8180daa4-0f79-d311-ddd5-0f73689a6115.png "スクリーンショット 2015-02-22 21.34.10.png")

### メール認証
ユーザが登録したメールアドレスが正しいかどうかのメール認証をおこなうのもすごい簡単。

 1. Parseの管理画面(Settings -> Email)で「Verify user emails」をYESに設定する。
 2. ユーザ作成時にemailを設定するようにする。
   - この状態でユーザが作成されるが「emailVerified」がfalseの状態。 
 3. 2で指定したemailに確認メールが届く。
   - 受信したメール本文にあるリンクをクリックすると「emailVerified」がtrueになる。

![スクリーンショット 2015-03-07 16.06.41.png](https://qiita-image-store.s3.amazonaws.com/0/37642/87fe6052-4ae4-6870-19e8-331af475fc92.png "スクリーンショット 2015-03-07 16.06.41.png")


### エラー
エラーが出るのは以下の様なとき

 - すでに同じ名前のusernameが登録されている。
    - username xxxx already taken
 - すでに同じ名前のemailが登録されている。
    - the email address xxx@xxx has already been taken 
 - emailが正しくない。
    - invalid email address


## ログイン/ログアウト
### ログイン
ログインは以下で行うことが出来る。

```objectivec:サンプルコード
[PFUser logInWithUsernameInBackground:@"my name" password:@"my pass"
                                block:^(PFUser *user, NSError *error) {
                                    if (user) {
	                                    //ユーザのログインに成功
                                    } else {
	                                    //ユーザのログインに失敗
                                    }
                                }];
```


ログインしている状況であれば、以下の様に```[PFUser currentUser]```を呼ぶだけでユーザ情報が取得出来る。

```objectivec:サンプルコード
PFUser *currentUser = [PFUser currentUser];
if (currentUser) {
  //ログイン中
} else {
  //ログインしていない
}
```


### ログアウト
ログアウトは以下の1行のみ。
ログアウトをすると、```[PFUser currentUser]```はnilを返す。

```objectivec:サンプルコード
[PFUser logOut]; //ログアウト
PFUser *currentUser = [PFUser currentUser]; //nilが返ってくる。
```


## パスワードの再設定
パスワードの再設定についても簡単に実装出来る。

```objectivec:サンプルコード
[PFUser requestPasswordResetForEmailInBackground:@"email@example.com"];
```

流れとしては以下。

 - ユーザがアカウント作成時に登録したメールアドレスを指定する。
   - 上記のコード
 - 指定したメール宛てにパスワードの再設定のメールが届く。
   - メールの文面は自身でカスタマイズすることが出来る。
 - ユーザがメールに書かれている再設定のリンクをクリックし、パスワードを入力する。

自分で実装すると面倒なこのフローをたった1行で実装することが出来る。


# 最後に
上記のように簡単にユーザ管理周りの実装をすることが出来る。
他にもPush通知やデータ管理が簡単に扱えるので、個人開発であればParseで十分なのではないかなと思う。


# 参考
 - https://parse.com/docs/ios/api/Classes/PFUser.html
 - https://parse.com/docs/jp/ios_guide#users