iOS LINEでログイン(Line SDK)

# はじめに
LINEアカウントを利用したログイン機能の実装方法について、まとめました。

#### ①ログイン画面
ログインボタンを押下すると、認証画面に遷移する

![Screen Shot 2017-06-23 at 22.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/71694/6eb302af-c4ce-cf23-84cf-69c3a25e88e3.png)

#### ②認証画面
認証画面で同意するボタンを押下すると、ログインできる
![Screen Shot 2017-06-23 at 22.46.52.png](https://qiita-image-store.s3.amazonaws.com/0/71694/5b0013dc-dc01-81bc-07cb-3fede98c9c6f.png)

## 手順
#### ①[LINE Business Center](https://business.line.me/ja/)でアカウントを登録する

#### ②チャネルを作成し、Channel IDを取得する
<img width="490" alt="スクリーンショット 2017-06-23 22.32.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/aa8452be-26b1-496b-3e7c-d02e48907726.png">

#### ③Bundle IDとiOS Schemeを設定する
LINE developersのTechnical configurationからBundle IDとiOS Schemeを設定する

なお、iOS Schemeは、「line3rdp.{Bundle-ID}」という命名にすること
下記の例は、Bundle IDが「jp.st-ventures.ios-line-login-demo」

<img width="807" alt="スクリーンショット 2017-06-23 22.06.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/c8b80bd0-aef2-1537-66da-25e7fc061718.png">

#### ④Cocoa PodsでLineSDKをインストールする

```:Podfile
pod 'LineSDK', '~> 4.0.2'  
```

#### ⑤Line SDKをダウンロードする

LINE developersのDownload SDKから[LineSDK_ios_4.0.2.zip](https://developers.line.me/ba/download/sdk/u3e6301863cbc63e50a752d9ed11f07ae)をダウンロードする

<img width="819" alt="スクリーンショット 2017-06-23 22.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/4a964e79-1238-e072-65ed-1a1854fcc37d.png">

#### ⑥フレームワークを追加する
下記のフレームワークを追加する
・CoreTelephony.framework
・Security.framework
・LineSDK.framework　←　⑤でダウンロードしたSDK

<img width="665" alt="スクリーンショット 2017-06-23 21.52.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/89441eb7-848e-528b-789a-5935a81be2ef.png">

#### ⑦Capabilitiesの「Keychain Sharing」をONにする

<img width="914" alt="スクリーンショット 2017-06-23 22.14.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/5210dcaa-7f1e-8857-1171-51d186703ce6.png">

#### ⑧Info.plistを設定する
Info.plistにチャネルIDとURLスキームを設定する
なお、チャネルIDは、②で取得した値を設定する

```:Info.plist
<key>LineSDKConfig</key>
<dict>
    <key>ChannelID</key>
    <string>{CHANNEL ID}</string>
</dict>      
```

```:Info.plist
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>lineauth</string>
    <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
```

#### ⑨AppDelegateにLINEからアプリが呼ばれたときの処理を追加する

```swift:AppDelegate.swift

import UIKit
import LineSDK

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        return LineSDKLogin.sharedInstance().handleOpen(url)
    }
}
```

#### ⑩ログイン画面で、ログイン処理を実装する

```swift:ViewController.swift
import UIKit
import LineSDK

final class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        LineSDKLogin.sharedInstance().delegate = self
    }

    @IBAction func didTapLogin(_ sender: UIButton) {
        LineSDKLogin.sharedInstance().start()
    }
}
// MARK: - LineSDKLoginDelegate
extension ViewController: LineSDKLoginDelegate {

    func didLogin(_ login: LineSDKLogin,
                  credential: LineSDKCredential?,
                  profile: LineSDKProfile?,
                  error: Error?) {

        if error != nil {
            print(error.debugDescription)
            return
        }

        // アクセストークン
        if let accessToken = credential?.accessToken {
            print("accessToken : \(accessToken)")
        }

        // 表示名
        if let displayName = profile?.displayName {
            print("displayName : \(displayName)")
        }

        // ユーザID
        if let userID = profile?.userID {
            print("userID : \(userID)")
        }

        // プロフィール写真のURL
        if let pictureURL = profile?.pictureURL {
            print("profile Picture URL : \(pictureURL)")
        }
    }
}
```
### ■補足情報
ちなみに、ログアウトは、下記のとおり。

```swift:
        let apiClient = LineSDKAPI(configuration: LineSDKConfiguration.defaultConfig())

        apiClient.logout(queue: .main) { (success, error) in

            if error != nil {
                print(error?.localizedDescription ?? "")
                return
            }

            if success {
                self.dismiss(animated: true, completion: nil)
            }
        }
```

# 公式マニュアル
詳細は、[公式マニュアル](https://developers.line.me/ios/development-with-sdk-v2)に丁寧に記載されています。