# ユニバーサルリンクを利用する

Appleのユニバーサルリンク (opens new window)機能を使ってアプリのセキュリティを高めることができます。ユニバーサルリンクを設定すると、LINEにより、まずユニバーサルリンクを使ってアプリの起動が試行されます。ユニバーサルリンクが無効な場合は、iOSバンドルIDに基づいたURLがフォールバックとして使用されます(詳しくは、「アプリをチャネルにリンクする」を参照してください)。

ユニバーサルリンク機能の有効化を推奨します

ユニバーサルリンク機能の有効化は必須ではありませんが、アプリケーションの安全性を高めるため使用することを推奨します。

ユーザーにユニバーサルリンクを使ってアプリを起動させるには、以下の手順に従います。

  1. アプリとサーバーを関連づける。
  2. LINE Developersコンソールでユニバーサルリンクを設定する。
  3. ユニバーサルリンクを指定してLoginManager.setupメソッドを呼び出す。
  4. ユニバーサルリンクでアプリが起動した後でログイン結果を制御する。

# 1. アプリとサーバーを関連づける

この手順については、Appleの「Allowing Apps and Websites to Link to Your Content (opens new window)」を参照してください。

以下の作業を完了します。

  • アプリで制御するURLのJSONデータを含むapple-app-site-associationファイルを作成して、HTTPSサーバーに配置する。
  • Associated Domainsのエンタイトルメントをアプリに追加する。

このセクションは、LINEの認可レスポンスを制御するためのユニバーサルリンクがhttps://yourdomain.com/line-auth/であることを前提とします。

apple-app-site-associationファイルのpathsフィールドに/line-auth/*を含めます。有効なapple-app-site-associationファイルは以下のようになります。

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "YOUR_TEAM_ID.com.yourcompany.yourapp",
                "paths": [ "/line-auth/*" ]
            }
        ]
    }
}

ユニバーサルリンクは実際のiOSデバイスでのみテストできることに注意してください。アプリのIDとプロファイルを正しく設定する必要があります。ユニバーサルリンクが動作しない場合は、Appleの「Troubleshooting Universal Links (opens new window)」を参照してください。次の手順に進む前に、ユニバーサルリンクが動作することを確認してください。

# 2. LINE Developersコンソールでユニバーサルリンクを設定する

手順については、「アプリをチャネルにリンクする」を参照してください。この例では、https://yourdomain.com/line-auth/に設定します。

# 3. ユニバーサルリンクを指定してLoginManager.setupメソッドを呼び出す

LoginManager.setupメソッドを呼び出すときに、ユニバーサルリンクをLINE SDK for iOS Swiftに渡します。これにより、ユニバーサルリンクの不正使用を防ぐため、リンクがLINE Developersコンソールとアプリの両方で正しく設定されていることがLINEログインによって検証されます。以下の例では、ユニバーサルリンクはhttps://yourdomain.com/line-auth/です。

let link = URL(string: "https://yourdomain.com/line-auth/")
LoginManager.shared.setup(channelID: "YOUR_CHANNEL_ID", universalLinkURL: link)

LoginManager.setupメソッドについて詳しくは、「iOSアプリにLINEログインを組み込む」を参照してください。

# 4. ユニバーサルリンクでアプリが起動した後でログイン結果を制御する

LINEプラットフォームから返されたログイン結果を制御するには、取得したURLをLoginManagerapplication(_:open:options:)メソッドに渡します。プロジェクトがマルチウィンドウ(iOS13で導入された機能 (opens new window))をサポートするかどうかで、アプリデリゲートクラスまたはシーンデリゲートクラスを変更する必要があります。

# アプリデリゲートを変更する

iOS 12以前では、UIApplicationDelegateオブジェクトを呼び出して、URLを開きます。したがって、アプリデリゲートクラスにapplication(_:continue:restorationHandler:)デリゲートメソッドが存在していれば、以下の行を追加します。デリゲートメソッドが存在しない場合は、以下のとおりにデリゲートメソッドを作成してください。

func application(
    _ app: UIApplication,
    continue userActivity: NSUserActivity,
    restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
{
    if LoginManager.shared.application(app, open: userActivity.webpageURL) {
        return true
    }
    // Your other code to handle universal links and/or user activities.
}

# シーンデリゲートを変更する

iOS 13以降では、UISceneDelegateオブジェクトを呼び出して、URLを開きます。

Xcode 11以降でプロジェクトを作成した場合は、デフォルトでは、プロジェクトにはSceneDelegate.swiftファイルが含まれ、Info.plistファイルにはUIApplicationSceneManifestエントリーが含まれます。

アプリがマルチウィンドウをサポートする場合は、使用するシーンデリゲートクラスに、次の行を追加します。

// SceneDelegate.swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    _ = LoginManager.shared.application(.shared, open: URLContexts.first?.url)
}
注意

ただし、アプリがマルチウィンドウをサポートしていない場合は、UIApplicationDelegateオブジェクトを呼び出して、URLを開きます。アプリデリゲートクラスを変更してください。

これで、ユニバーサルリンクを使ってLINEからアプリを起動し、アプリでログイン結果を制御できるようになりました。