Swiftで学ぶユニバーサルリンクの14選完全ガイド

SwiftのユニバーサルリンクのロゴとサンプルコードSwift
この記事は約21分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

モバイルアプリ開発において、Webサイトとアプリ間でのシームレスな遷移は非常に重要です。

AppleのSwiftを使用したiOSアプリ開発には、このような遷移を実現するための「ユニバーサルリンク」という素晴らしい機能があります。

この記事を読めば、Swiftでユニバーサルリンクを使いこなすことができるようになります。

●ユニバーサルリンクとは

ユニバーサルリンクとは、iOSデバイスでの特定のリンクをタップすると、関連するアプリがインストールされていればそのアプリを起動し、そうでなければWebページを表示するという機能です。

これにより、ユーザーはアプリ内の特定の場所やWebページに直接アクセスすることができます。

○ユニバーサルリンクの基本

ユニバーサルリンクは、iOS9以降で利用可能となりました。

この機能を利用するには、アプリのEntitlementsに特定のキーを設定し、関連するドメインを所有していることを証明する必要があります。

そして、そのドメインにホストされるapple-app-site-associationという特定のファイルで、どのようなパスがアプリに関連付けられているかを定義します。

○Swiftとユニバーサルリンクの関係

SwiftはAppleの開発言語であり、iOSアプリ開発に広く使われています。

ユニバーサルリンクをSwiftのアプリで実装する場合、関連するURLを取得し、アプリ内での適切な処理を行うコードを書く必要があります。

具体的には、AppDelegate内の特定のメソッドを利用して、ユニバーサルリンクを通じてアプリが開かれた際の処理を実装します。

ユニバーサルリンクを実装することで、アプリとWebサイト間の遷移がシームレスになり、ユーザーエクスペリエンスが向上します。

また、メールやSNSなどの外部からのリンクを通じて、アプリ内の特定のコンテンツや機能に直接誘導することが可能となります。

●ユニバーサルリンクの使い方

ユニバーサルリンクの魅力は、URLをタップするだけでアプリを起動させることができる点にあります。

ここでは、ユニバーサルリンクの基本的な設定から、Swiftでの実装方法までを解説します。

○サンプルコード1:ユニバーサルリンクの基本的な設定

まず、ユニバーサルリンクを実装するためには、アプリケーションのEntitlementsファイルに必要な情報を記述する必要があります。

<key>com.apple.developer.associated-domains</key>
<array>
    <string>applinks:yourdomain.com</string>
</array>

このコードではyourdomain.comを使ってユニバーサルリンクの設定をしています。

自身のドメインに変更して使用してください。

○サンプルコード2:Swiftでのユニバーサルリンクの受け取り

ユニバーサルリンクを受け取る際の処理は、AppDelegateのcontinue userActivityメソッド内で行います。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
        // ユニバーサルリンクのURLを取得
        print("ユニバーサルリンクURL:\(url)")
    }
    return true
}

このコードでは、ユニバーサルリンクを通じてアプリが起動された際に、リンクのURLを取得しています。

○サンプルコード3:リンクに応じた処理の分岐

ユニバーサルリンクのURLに応じて、異なる処理を行いたい場合もあるでしょう。

下記のサンプルコードでは、特定のパスに応じて異なる画面への遷移を行う方法を表しています。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
        switch url.lastPathComponent {
        case "page1":
            // page1への遷移処理
            print("page1へ遷移")
        case "page2":
            // page2への遷移処理
            print("page2へ遷移")
        default:
            break
        }
    }
    return true
}

このコードを実行すると、ユニバーサルリンクのURLがyourdomain.com/page1であれば”page1へ遷移”と表示され、yourdomain.com/page2であれば”page2へ遷移”と表示されます。

●ユニバーサルリンクの応用例

ユニバーサルリンクは、基本的な使い方だけでなく、様々な応用が可能です。

ここでは、Swiftを用いてユニバーサルリンクの機能をさらに拡張する方法や、特定の目的を達成するためのテクニックを紹介します。

○サンプルコード4:カスタムURLスキームとの併用

ユニバーサルリンクとカスタムURLスキームを併用することで、ユーザーの環境に応じて最適な動作を行うことができます。

func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    // カスタムURLスキームからの起動を検知
    if url.scheme == "customscheme" {
        print("カスタムURLスキームからアプリを起動")
    }
    return true
}

このコードではcustomschemeを使ってカスタムURLスキームからの起動を検知し、対応する処理を行っています。

○サンプルコード5:ディープリンクを用いた特定の画面遷移

ユニバーサルリンクを利用して、アプリ内の特定の画面に直接遷移させることができます。

この機能はディープリンクとして知られ、特定のコンテンツやキャンペーンページへの誘導に役立ちます。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if let url = userActivity.webpageURL, userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        switch url.lastPathComponent {
        case "campaign":
            // キャンペーンページへの遷移処理
            print("キャンペーンページへ遷移")
        default:
            break
        }
    }
    return true
}

このコードを用いると、ユーザーがyourdomain.com/campaignのURLをタップした際、アプリ内のキャンペーンページに直接遷移するようになります。

○サンプルコード6:ユーザー情報を持たせたリンクの作成

ユニバーサルリンクを利用する際の大きな魅力の一つは、リンク内にユーザー固有の情報を持たせることができる点です。

例えば、特定のユーザーを対象としたキャンペーンや、ユーザーごとのカスタマイズされた情報を提供したい場合に役立ちます。

Swiftでこのようなリンクを作成する方法を解説します。

import UIKit

class UniversalLinkManager {
    // ベースとなるURL
    private let baseURL = URL(string: "https://example.com/")!

    // ユーザー情報を持たせたユニバーサルリンクの作成
    func createUserLink(userID: String, campaignID: String) -> URL? {
        var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: true)
        components?.queryItems = [
            URLQueryItem(name: "user", value: userID),
            URLQueryItem(name: "campaign", value: campaignID)
        ]
        return components?.url
    }
}

このコードでは、UniversalLinkManagerというクラス内で、ユーザーIDとキャンペーンIDを持たせたユニバーサルリンクを作成するcreateUserLinkメソッドを定義しています。

このメソッドを呼び出すことで、ユーザーごとのカスタマイズされたリンクを生成することが可能となります。

例えば、ユーザーIDが”12345″でキャンペーンIDが”abcde”の場合、次のようなリンクが生成されます。

Example Domain

このリンクを使用することで、アプリ内でのユーザーの特定やキャンペーンの内容に基づいたカスタマイズされたコンテンツの提供など、多岐にわたる応用が可能となります。

○サンプルコード7:ユニバーサルリンクを用いたプッシュ通知

ユニバーサルリンクは、プッシュ通知と組み合わせることで、よりダイレクトにユーザーをアプリ内の特定の場所に誘導することができます。

プッシュ通知のペイロードにユニバーサルリンクを含めることで、通知をタップした際にアプリが起動し、直接リンク先のコンテンツを表示することができます。

ここでは、プッシュ通知のペイロードのサンプルを紹介します。

{
    "aps": {
        "alert": "新しいキャンペーンのお知らせです!",
        "sound": "default"
    },
    "link": "https://example.com/campaign/newyear2023"
}

アプリがこのペイロードを受け取った際、ユーザーが通知をタップすると、https://example.com/campaign/newyear2023のユニバーサルリンクが開かれ、アプリ内の新年キャンペーンページに直接遷移する仕組みになります。

●注意点と対処法

ユニバーサルリンクをSwiftで実装する際、非常に便利な機能である一方、いくつかの注意点やトラブルが生じることがあります。

これらの問題に適切に対応するための基本的な知識と実践的な方法を、ここでは解説します。

○ユニバーサルリンクの常見のエラー

ユニバーサルリンクを実装する過程で、多くの開発者が遭遇するエラーや問題点をいくつか挙げ、それらの解決策を提案します。

  1. リンクがアプリを起動しない
  • 原因:アプリの設定が不正確、またはユニバーサルリンクの設定が正しくない。
  • 対処法:apple-app-site-associationファイルを確認し、正確な設定を行う。また、アプリの設定やInfo.plistの内容を再確認する。
  1. リンクがブラウザで開かれる
  • 原因:ユニバーサルリンクの設定が正しくない、またはアプリがデバイスにインストールされていない。
  • 対処法:ユニバーサルリンクの設定を見直し、アプリのインストール状況を確認する。
  1. リンクに含まれるパラメータがアプリに正しく伝わらない
  • 原因:アプリ内でのリンクの受け取り方法や、リンクの解析方法が不適切。
  • 対処法:リンクの受け取り方や解析方法を見直す。

□サンプルコード8:エラーハンドリングの方法

Swiftでユニバーサルリンクを実装する際の、リンクの受け取りや解析時のエラーハンドリングの方法を紹介します。

import UIKit

class LinkHandler {
    // ユニバーサルリンクからのデータを解析する
    func handleLink(_ url: URL) -> (userID: String?, campaignID: String?) {
        let components = URLComponents(url: url, resolvingAgainstBaseURL: true)
        let userID = components?.queryItems?.first(where: { $0.name == "user" })?.value
        let campaignID = components?.queryItems?.first(where: { $0.name == "campaign" })?.value

        guard userID != nil && campaignID != nil else {
            // エラーハンドリング: 必要な情報がリンクに含まれていない場合
            print("ユニバーサルリンクのデータが不足しています。")
            return (nil, nil)
        }
        return (userID, campaignID)
    }
}

このコードでは、ユニバーサルリンクのURLを受け取り、その中からユーザーIDとキャンペーンIDを取得しています。

もし、これらの情報が不足していた場合、エラーメッセージを出力するようにしています。

このコードを実行すると、正常にユーザーIDとキャンペーンIDが取得できればその値が返されます。

一方、リンクに必要な情報が不足していた場合、エラーメッセージが表示され、nilの値が返されます。

●ユニバーサルリンクのカスタマイズ方法

Swiftを使用してユニバーサルリンクを実装する際、様々なカスタマイズの方法があります。

これにより、アプリのブランディングやユーザビリティを向上させることが可能となります。

ここでは、Swiftでユニバーサルリンクをカスタマイズする具体的な方法をサンプルコードとともに詳しく説明します。

○サンプルコード9:カスタムデザインの適用

アプリのデザインやブランディングに合わせて、ユニバーサルリンクの表示をカスタマイズする方法を示します。

import UIKit

class CustomLinkViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // カスタムの背景色を設定
        self.view.backgroundColor = UIColor.purple

        // カスタムのラベルを追加
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
        label.text = "ユニバーサルリンクのデモ"
        label.textColor = UIColor.white
        label.textAlignment = .center
        label.center = self.view.center
        self.view.addSubview(label)
    }
}

このコードでは、ユニバーサルリンクを受け取るための画面に、カスタムの背景色やラベルを追加しています。

このようにして、アプリのデザインやブランディングに合わせたデザインを適用することができます。

○サンプルコード10:複数のドメイン対応の設定

複数のドメインからのユニバーサルリンクを受け取る設定方法を紹介します。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.host == "example1.com" {
            // example1.comからのリンクを処理
        } else if url.host == "example2.com" {
            // example2.comからのリンクを処理
        }
        return true
    }
}

このコードでは、受け取ったユニバーサルリンクのドメインに応じて異なる処理を行っています。

例えば、example1.comからのリンクとexample2.comからのリンクで異なる画面遷移や処理を行いたい場合などに有効です。

○サンプルコード11:リンクの有効期限の設定

ユニバーサルリンクを生成する際、そのリンクに有効期限を設定することは、セキュリティ上の理由やマーケティングの戦略に基づき、非常に有効な手段となります。

Swiftでこのような有効期限を持つユニバーサルリンクを設定する方法を説明します。

import UIKit

struct UniversalLink {
    let url: URL
    let expirationDate: Date
}

class LinkManager {
    func createLink(withExpirationInDays days: Int) -> UniversalLink {
        let linkURL = URL(string: "https://example.com/special")!
        let expiration = Calendar.current.date(byAdding: .day, value: days, to: Date())!
        return UniversalLink(url: linkURL, expirationDate: expiration)
    }

    func isValid(link: UniversalLink) -> Bool {
        return Date() <= link.expirationDate
    }
}

let manager = LinkManager()
let linkWith3DaysExpiration = manager.createLink(withExpirationInDays: 3)
print(manager.isValid(link: linkWith3DaysExpiration)) // 現在の日時から3日以内であればtrue

このコードではUniversalLinkという構造体を使って、ユニバーサルリンクのURLとその有効期限の日付を一緒に保持しています。

LinkManagerクラスのcreateLinkメソッドを使用することで、指定した日数後に有効期限が切れるリンクを作成することができます。

さらに、isValidメソッドを使って、与えられたユニバーサルリンクが現在も有効かどうかを確認することができます。

このようにして、特定のキャンペーンやプロモーションに合わせて、有効期限を持つユニバーサルリンクを効果的に利用することができます。

○サンプルコード12:ユーザビリティを向上させるTips

ユーザビリティを向上させるためのユニバーサルリンクの設定方法について紹介します。

ユーザーがリンクをクリックしたときの体験を向上させるための小技や工夫がいくつか存在します。

まず、ユニバーサルリンクをクリックしたときにアプリ内の特定の場所にダイレクトに遷移させる方法を見てみましょう。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        if url.path == "/product/12345" {
            // 商品ID 12345の詳細画面に遷移するロジック
        } else if url.path == "/promotion" {
            // プロモーションページに遷移するロジック
        }

        return true
    }
}

このコードを使用すると、URLのパスに応じて異なる画面に遷移することができます。

例えば、/product/12345というパスが含まれるユニバーサルリンクがクリックされた場合、商品ID 12345の詳細画面に直接遷移するように設定することができます。

●ユニバーサルリンクのトラブルシューティング

ユニバーサルリンクは、Webとアプリをシームレスに連携させる強力なツールですが、実装や運用中にはさまざまなトラブルが発生する可能性があります。

ここでは、Swiftを使用したユニバーサルリンクの一般的なトラブルとその対処法を解説します。

○サンプルコード13:デバッグ方法の紹介

ユニバーサルリンクの動作をデバッグする際、iOSは標準でデバッグツールを提供しています。

下記のコードでは、ユニバーサルリンクの処理をデバッグする際の基本的な手法を表しています。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        // デバッグ用にURLを出力
        print("受け取ったURL: \(url)")

        // 以降、通常のユニバーサルリンクの処理を実施

        return true
    }
}

このコードでは、print関数を利用して、アプリケーションに渡されたURLをコンソールに出力しています。

これにより、実際にどのようなURLがアプリに渡されているのかを確認し、適切にハンドリングされているかをデバッグすることができます。

○サンプルコード14:リンクの効果測定

ユニバーサルリンクのクリック数や変換数を正確に測定することは、マーケティング活動やユーザー体験の向上に役立ちます。

下記のコード例では、ユニバーサルリンクのクリック数をカウントする方法を表しています。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var linkClickCount = 0

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        linkClickCount += 1

        print("ユニバーサルリンククリック数: \(linkClickCount)")

        // 以降、通常のユニバーサルリンクの処理を実施

        return true
    }
}

このコードでは、アプリケーション内でユニバーサルリンクがクリックされるたびに、linkClickCountという変数の値を1つずつ増やしています。

これにより、アプリが起動する度に、どれだけのユーザーがユニバーサルリンクを通じてアプリを利用しているのかを簡易的に計測することができます。

まとめ

ユニバーサルリンクは、iOSのアプリとWebサイトをシームレスに連携させるための強力な技術です。

Swiftを使用することで、その実装やカスタマイズが効率的に行えます。

本ガイドでは、ユニバーサルリンクの基本から応用、トラブルシューティングまで、さまざまな側面を詳細に解説しました。

特に、サンプルコードを通じて、具体的な実装方法やデバッグの手法を学ぶことができるでしょう。

これらの情報を基に、ユニバーサルリンクを効果的に活用し、ユーザーエクスペリエンスの向上やマーケティングの効果を最大化してください。

今後もiOSやSwiftのアップデートに伴い、ユニバーサルリンクの利用方法や最適化の方法が変わる可能性があるため、常に最新の情報を取得し、最適な実装を心掛けることが大切です。