URLスキームの使い方 LINEアプリでiOS(Swift)とAndroid(Java)


URLスキームを使うことで、アクテビティ状態のアプリを別アプリへ飛ばすことが出来ます。今回はLINEを利用した書き方について説明していきます。
　例えばLINEでメッセージを送ったり、カメラを起動することができます。LINE MESSAGE APIの仕様については[こちら](https://developers.line.me/ja/docs/messaging-api/using-line-url-scheme/)を参考ください。

## 環境
Mac：Sierra 10.12.6
Swift 4.0
Xcode 9.2
Android Studio 2.3


## 前提
### カスタムURLスキームとUniversal linksについて
　[LINEのMessage APIについての公式ドキュメント](https://developers.line.me/ja/docs/messaging-api/using-line-url-scheme/)に記載しているとおり、別のアプリケーションからLINEを開くには指定のURLを使うんですが、**line://**か**https://line.me/R/ **の2通りあります。前者がカスタムURLスキームを使うもので、後者がUniversal linksを使ったものになります。
　どちらのURLでもすでに特定のアプリ（今回ではLINE）がインストール済みの場合は、アプリが開く挙動は変わらないのですが、インストール済みではない場合に挙動が変わってきます。
- line://  ▶何もおきないか、エラーページが開く
- https://line.me/R/　　▶Webブラウザが開き、LINEアプリのダウンロードを求めるページが開く


![line@android.gif](https://qiita-image-store.s3.amazonaws.com/0/135757/8d9d07cf-70bd-9378-64d4-0a1b8ab1c73f.gif "line@android.gif")



なので、line://のようなカスタムURLスキームを利用する場合は、開けなかった時、つまりはアプリをインストールしていないときの挙動を設定しないと、ユーザーにとって「あれ？何も起こらない」みたいになりかねません。

### LINE＠のリンク
自分のアカウントの友達追加をするには、自分のアカウントのURLを知る必要があります。[こちら](https://affiliate-jpn.com/archives/7015)の③友達追加URLに説明が載っています。
簡単に書くと、メニューの友だち画面▶URLを共有、で出来ます。

## iOSの実装方法

### Info.plistにScheme登録
Info.plistに``LSApplicationQueriesSchemes``というキーでTypeをArrayにし、そこにアイテムを追加し、TypeをStringでvalueをlineにします。
　これを設定しないと、指定したアプリがインストール済みでもエラーになります。これは、Appleがユーザーの他のアプリ情報をプライバシー対象としたためです。そのため、アプリに関係ない別アプリのインストール情報を調べることは出来ません。


### コード
　下記のようになります。
　実装上注意するのは、urlを開くメソッドopenURLがiOS10以降で非推奨となったため、10以降ではopenを使います。
　また、URLスキームを利用する場合は、インストール済みではない場合の処理も書くようにしましょう。

```swift

//        let urlscheme = "https://line.me/R/ti/p/hoghoge" // Universal links
let urlscheme = "line://ti/p/hoghoge" //カスタムURLスキーム
        
        // URL作成
        guard let url = URL(string: urlscheme) else {
            return
        }
        
        if UIApplication.shared.canOpenURL(url) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(url, options: [:], completionHandler: { (succes) in
                
                })
            }else{
                UIApplication.shared.openURL(url)
            }
        }else {
            // LINEアプリが無い場合
            let alertController = UIAlertController(title: "エラー",
                                                    message: "LINEがインストールされていません",
                                                    preferredStyle: UIAlertControllerStyle.alert)
            alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default))
            present(alertController,animated: true,completion: nil)


```

![line@ios.gif](https://qiita-image-store.s3.amazonaws.com/0/135757/57127b40-45ad-5b39-791a-f43d56ea85a4.gif "line@ios.gif")


## Androidの実装方法

### コード（https/httpの場合）
単純にURIを叩くだけで可能です。
今回はtextViewをタッチすると開くようにしました。

```
String uri = "https://line.me.R/"
textView.setAutoLinkMask(Linkify.ALL);
textView.setText(uri);
```

### コード(スキーム名を使う場合)
Intentを使います。

```
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("line://"));startActivity(intent);
```

Androidのほうは、ManifestファイルをいじらなくてもOKです。（自作でカスタムURLを作る場合は、いじる必要があります。）

## 参考
- https://developers.line.me/ja/docs/messaging-api/using-line-url-scheme/
- https://qiita.com/le_skamba/items/c9810a0e6df27097d502