Swiftで別アプリを起動する9つの方法

Swiftで他のアプリを起動する方法の解説とサンプルコードSwift
この記事は約24分で読めます。

 

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

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

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

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

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

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

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

はじめに

Swiftを学び始めると、様々な機能や実装方法が出てきますが、中でも「アプリ内から別のアプリを起動する」方法は、ユーザー体験を向上させる上で非常に有用です。

この記事を読めば、Swiftを使用してアプリ内から別アプリを起動する方法を9通り身につけることができるようになります。

●Swiftで別アプリを起動する背景

日常的に使用するアプリは数多く、それらのアプリ間でのスムーズな連携は、ユーザーにとって非常に有益です。

例えば、SNSアプリ内からカメラアプリを起動したり、メールアプリからカレンダーアプリに移動したりすることが考えられます。

○なぜアプリ内から別アプリを起動したいのか?

アプリ間の連携を実現することで、次のようなメリットがあります。

  1. ユーザビリティの向上:ユーザーが求める情報や機能へのアクセスを簡単にする。
  2. ユーザーエンゲージメントの向上:アプリ内での操作をスムーズにし、アプリの使用頻度や滞在時間を増加させる可能性がある。
  3. サードパーティアプリとの連携:他のアプリとのデータ共有や機能連携を可能にし、より豊かな機能を提供できる。

○SwiftのURLスキームの基本

Swiftで他のアプリを起動する際の基本的な方法は、URLスキームを使用することです。

URLスキームは、アプリごとに固有のURLを指定することで、そのアプリを起動する機能を持っています。

このコードではUIApplicationのopenメソッドを使って、URLスキームを用いて別のアプリを起動するコードを表しています。

この例ではURLの文字列を用いてSafariで特定のWebページを開く操作をしています。

import UIKit

class ViewController: UIViewController {

    @IBAction func openSafariButtonTapped(_ sender: UIButton) {
        if let url = URL(string: "https://www.example.com") {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
}

ボタンをタップすると、Safariで「https://www.example.com」というURLのWebページが開きます。

これがURLスキームを利用した基本的なアプリの起動方法です。

●別アプリを起動する9つの方法

Swiftを用いて、アプリ内から別のアプリを起動する方法は様々あります。

ユーザーの使いやすさや目的に応じて、適切な方法を選ぶことができます。

ここでは、特に実用的な9つの方法を取り上げ、それぞれの特徴や実装方法を解説します。

○サンプルコード1:基本的なURLスキームを使ったアプリ起動

最もシンプルな方法は、特定のURLスキームを使ってアプリを起動する方法です。

これは先程紹介した方法と同じですが、再度簡潔に説明します。

このコードでは、UIApplicationopenメソッドを利用して、指定したURLスキームに基づきアプリを起動するコードを表しています。

この例では、Twitterのアプリを起動する操作をしています。

import UIKit

class ViewController: UIViewController {

    @IBAction func openTwitterButtonTapped(_ sender: UIButton) {
        if let url = URL(string: "twitter://") {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
}

ボタンを押すと、Twitterのアプリが起動します。

もしTwitterのアプリがインストールされていない場合、何も起こらないので注意が必要です。

○サンプルコード2:パラメータを伴うURLスキームを使った起動

URLスキームを使用する場合、特定のページや機能を直接起動するためにパラメータを追加することができます。

このコードでは、UIApplicationopenメソッドを使って、URLスキームにパラメータを追加し、特定のユーザのTwitterプロフィールページを開く操作をしています。

import UIKit

class ViewController: UIViewController {

    @IBAction func openUserProfileButtonTapped(_ sender: UIButton) {
        let username = "apple"
        if let url = URL(string: "twitter://user?screen_name=\(username)") {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
}

ボタンをタップすると、”apple”というユーザー名のTwitterプロフィールページがアプリ内で開きます。

○サンプルコード3:Universal Linksを用いたアプリの起動

Universal Links(ユニバーサルリンク)はiOS9以降で利用可能な機能で、特定のURLをアプリで開くためのリンクとして設定することができます。

この機能を利用することで、アプリがインストールされている場合にはアプリを起動し、インストールされていない場合にはWebページを表示する、といった挙動を実現することができます。

このコードでは、Universal Linksを用いて、指定されたURLをアプリ内で開く挙動を表しています。

この例では、特定のWebページをアプリで開く操作をしています。

まず、アプリのInfo.plistに下記の設定を追加します。

<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLSchemes</key>
<array>
    <string>https</string>
</array>
<key>CFBundleURLName</key>
<string>com.yourdomain.app</string>

次に、AppDelegateに下記のコードを追加します。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return false
    }

    // ここでURLを適切に処理します。
    handleURL(url)

    return true
}

func handleURL(_ url: URL) {
    // URLに応じてアプリ内の特定の画面に遷移させる等の処理を行う。
}

この設定とコードにより、指定されたUniversal Linkをクリックした際、handleURL関数が呼び出され、アプリ内の特定の画面に遷移させる等の処理を行うことができます。

○サンプルコード4:SFSafariViewControllerを利用した方法

SFSafariViewControllerは、アプリ内にSafariのブラウザ環境を取り込むことができるクラスです。

このクラスを利用することで、ユーザーにアプリから離れることなくWebコンテンツを表示させることができます。

このコードでは、SFSafariViewControllerを使って、アプリ内でWebページを表示する操作をしています。

import SafariServices

class ViewController: UIViewController {

    @IBAction func openWebPageButtonTapped(_ sender: UIButton) {
        let urlString = "https://www.example.com"
        if let url = URL(string: urlString) {
            let safariVC = SFSafariViewController(url: url)
            self.present(safariVC, animated: true, completion: nil)
        }
    }
}

ボタンを押すと、指定したWebページがアプリ内に組み込まれたブラウザで開きます。

ユーザー体験を損なうことなく、外部のWebコンテンツにアクセスすることができます。

○サンプルコード5:アプリがインストールされていない場合のリダイレクト

アプリの普及やマーケティング活動を考えると、アプリがユーザーのデバイスにインストールされていない場合のリダイレクトは非常に重要です。

Swiftでこれを実現する方法は、URLスキームの存在チェックを行い、もしアプリがインストールされていなければ、App Storeや特定のWebページにリダイレクトすることが考えられます。

このコードでは、URLスキームをチェックし、アプリがインストールされていない場合にApp Storeにリダイレクトする挙動を表しています。

この例では、独自のURLスキームをチェックし、存在しなければApp Storeのリンクに飛ばすという操作を実装しています。

import UIKit

class ViewController: UIViewController {

    @IBAction func openAppOrRedirect(_ sender: UIButton) {
        let appURLScheme = "yourAppScheme://"

        if let url = URL(string: appURLScheme), UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            // アプリがインストールされていない場合の処理
            if let appStoreURL = URL(string: "https://apps.apple.com/jp/app/your-app-id") {
                UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
            }
        }
    }
}

このコードにより、yourAppScheme://というURLスキームを持つアプリがインストールされていればそのアプリが開き、そうでなければ指定したApp StoreのURLが開きます。

これにより、ユーザーはアプリがインストールされていない場合にはApp Storeへと導かれ、必要に応じてアプリをダウンロードできるようになります。

○サンプルコード6:ディープリンクを利用した起動

ディープリンクは、アプリを特定の状態やページで起動するためのリンクです。

このテクニックは、特定のキャンペーンやプロモーションを実施する際、ユーザーを直接特定のページや機能へと誘導するのに非常に便利です。

このコードでは、ディープリンクを利用してアプリ内の特定のページを開く挙動を表しています。

この例では、受け取ったディープリンクの情報を元に特定のページに遷移する処理を行っています。

import UIKit

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

    // ディープリンクからの情報を取得
    let deepLinkInfo = url.host

    if deepLinkInfo == "promo" {
        // プロモーションページへ遷移する処理
        navigateToPromoPage()
    }
    // その他、さまざまなディープリンクに応じた処理を追加できます

    return true
}

func navigateToPromoPage() {
    // プロモーションページへの遷移処理
}

上記のサンプルでは、アプリがディープリンクyourAppScheme://promoで開かれた場合、navigateToPromoPage関数が呼び出され、プロモーションページに遷移する処理が実行されます。

○サンプルコード7:ショートカットを利用したアプリ起動

iOSのホーム画面でアイコンを長押しすることで表示される「ショートカット」機能は、Swiftでの開発においても非常に役立ちます。

ユーザーが一般的なアプリの起動方法以外で、特定の機能やページに瞬時にアクセスすることを可能にするため、ユーザビリティの向上に大いに寄与します。

このコードでは、ショートカットを使ってアプリを起動し、特定の画面に遷移する挙動を表しています。

この例では、ショートカットからの入力を受け取り、それに応じたページに遷移する処理を行っています。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

        // ショートカットのtypeを確認
        if shortcutItem.type == "com.yourapp.openprofile" {
            openProfilePage()
            completionHandler(true)
        } else {
            completionHandler(false)
        }
    }

    func openProfilePage() {
        // プロフィールページへの遷移処理
        if let navigationController = window?.rootViewController as? UINavigationController,
           let mainViewController = navigationController.viewControllers.first as? MainViewController {
            mainViewController.navigateToProfile()
        }
    }
}

このサンプルコードの中で、performActionForメソッドは、ショートカットからのアプリの起動時に呼び出されます。

そして、shortcutItem.typeを使用して、どのショートカットからアプリが起動されたかを判別します。

ここでは、「com.yourapp.openprofile」というタイプのショートカットからアプリが起動された場合、プロフィールページに遷移する処理を実行しています。

このショートカット機能を用いることで、ユーザーは特定の機能やページに直接アクセスできるため、アプリの操作性やユーザー体験が大幅に向上します。

○サンプルコード8:Widgetからのアプリ起動

iOS 14以降、ウィジェットという機能が追加されました。

これにより、ユーザーはホーム画面にアプリのウィジェットを配置することで、アプリの一部の情報や機能に簡単にアクセスできるようになりました。

そして、このウィジェットをタップすることで、アプリを起動することも可能です。

このコードでは、ウィジェットをタップした際にアプリを起動し、特定の画面に遷移する挙動を示しています。

この例では、ウィジェットからの入力を受け取り、それに応じて特定のページに遷移する処理を実装しています。

import UIKit
import WidgetKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        // ウィジェットからの遷移情報を取得
        if let targetPage = userInfo["targetPage"] as? String {
            navigateTo(targetPage: targetPage)
            completionHandler(.newData)
        } else {
            completionHandler(.noData)
        }
    }

    func navigateTo(targetPage: String) {
        // 指定されたページへの遷移処理
        if let navigationController = window?.rootViewController as? UINavigationController {
            switch targetPage {
            case "profile":
                navigationController.pushViewController(ProfileViewController(), animated: true)
            case "settings":
                navigationController.pushViewController(SettingsViewController(), animated: true)
            default:
                break
            }
        }
    }
}

このサンプルコードの中で、ウィジェットからのアプリの起動時にdidReceiveRemoteNotificationメソッドが呼び出されます。

そして、userInfo辞書から「targetPage」というキーの情報を取得して、それに応じたページに遷移する処理を実行しています。

○サンプルコード9:プッシュ通知からのアプリ起動

Swiftでのアプリ開発において、プッシュ通知はユーザーエンゲージメントを向上させるための重要な手段となっています。

この通知をタップすることで、ユーザーはアプリを起動するだけでなく、特定のページや機能へ直接アクセスできるようになります。

このコードでは、プッシュ通知を受け取った際の挙動を定義しています。

具体的には、通知の内容に基づき、適切なページや機能への遷移を行います。

この例では、通知のペイロードに含まれる情報を解析し、それに応じて適切な画面に遷移する処理を行っています。

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {

        // 通知ペイロードから遷移先情報を取得
        if let targetPage = userInfo["targetPage"] as? String {
            navigateTo(targetPage: targetPage)
        }
    }

    func navigateTo(targetPage: String) {
        // 指定されたページへの遷移処理
        if let navigationController = window?.rootViewController as? UINavigationController {
            switch targetPage {
            case "profile":
                navigationController.pushViewController(ProfileViewController(), animated: true)
            case "settings":
                navigationController.pushViewController(SettingsViewController(), animated: true)
            default:
                break
            }
        }
    }
}

通知を受け取った際にdidReceiveRemoteNotificationメソッドが呼び出されます。

このメソッド内で、通知のペイロードからtargetPageというキーで指定された遷移先情報を取得し、それに基づいて適切なページへの遷移を行っています。

プッシュ通知の適切な活用により、アプリの活動率やユーザーエンゲージメントを大幅に向上させることが期待できます。

特に、新機能の紹介や重要なお知らせなど、ユーザーに確実に伝えたい情報がある場合に、このような通知の活用は非常に効果的です。

●注意点と対処法

Swiftで別アプリを起動する際、いくつかの重要な注意点やリスクが存在します。

これらの注意点を理解し、適切に対処することで、アプリの品質やユーザーエクスペリエンスを向上させることができます。

○セキュリティ上のリスクとその対策

アプリ間連携の際、セキュリティ上のリスクは無視できません。

特にURLスキームを使用する場合、悪意のある第三者によって不正なURLスキームが使われる可能性があります。

このようなリスクを回避するための方法を紹介します。

□ホワイトリスト方式の導入

あらかじめ承認されたURLスキームのみを受け入れることで、不正な操作を防ぐことができます。

このコードでは、許可されたURLスキームのリストを持ち、そのリスト内のURLスキームのみを扱うように設定しています。

この例では、approvedURLSchemesに許可されたURLスキームのリストを持ち、それに基づいてURLスキームのチェックを行います。

let approvedURLSchemes: [String] = ["app1", "app2"]

func handleOpenURL(_ url: URL) -> Bool {
    // URLスキームのチェック
    if approvedURLSchemes.contains(url.scheme ?? "") {
        // 適切な処理を行う
        return true
    } else {
        // 不正なURLスキームの場合は処理を行わない
        return false
    }
}

□URLスキームの隠蔽

URLスキームを外部に公開しない、または予測困難なものにすることで、悪意のある第三者の攻撃を難しくします。

○起動できない場合のエラーハンドリング

アプリの起動や連携時には、様々な理由でエラーが発生する可能性があります。

例えば、目的のアプリがインストールされていない、URLスキームが正しくないなどの理由で、起動や連携が失敗することが考えられます。

こういったエラーに対しては、ユーザーに適切なフィードバックを提供することが重要です。

下記のサンプルコードでは、指定したアプリの起動を試み、失敗した場合にはエラーメッセージを表示する処理を表しています。

import UIKit

func openAppWithScheme(_ scheme: String) {
    if let url = URL(string: scheme) {
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            showAlertWithMessage("該当するアプリがインストールされていません。")
        }
    }
}

func showAlertWithMessage(_ message: String) {
    let alert = UIAlertController(title: "エラー", message: message, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)
}

ユーザーがアプリの起動や連携を試みた際にエラーが発生すると、彼らはフラストレーションを感じることが考えられます。

そのため、エラーの原因や対処方法を明確に伝えることで、ユーザーエクスペリエンスの低下を防ぐことができます。

●アプリ間の連携を深めるカスタマイズ方法

Swiftを使用してアプリ間での連携を実現する際、さらなるカスタマイズや拡張性を追求することで、より高度なユーザーエクスペリエンスを提供することが可能です。

ここでは、アプリ間のデータ共有や双方向通信の方法を中心に、連携をより深化させるカスタマイズ方法について詳しく解説します。

○データの共有方法とサンプルコード

Swiftにおけるアプリ間でのデータの共有は、URLスキームを使用することで、パラメータとしてデータを渡す方法が一般的です。

このコードでは、shareDataという関数を使って、別のアプリに文字列のデータを渡すコードを表しています。

この例では、shareStringという文字列をパラメータとしてURLスキームを組み立て、それを使用して別のアプリを起動しています。

import UIKit

func shareData() {
    let shareString = "HelloFromAppA"
    if let url = URL(string: "appB://data?\(shareString)") {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

これにより、appBというアプリが起動され、起動時にHelloFromAppAという文字列がパラメータとして受け取られます。

○レスポンスURLを設定して双方向の通信を行う方法

単方向のデータ共有だけでなく、双方向の通信を行いたい場合には、レスポンスURLを設定することで、データのやり取りをより柔軟に行うことができます。

このコードでは、appAからappBへデータを送り、その後、appBからappAへのレスポンスを受け取る方法を表しています。

func sendDataAndReceiveResponse() {
    let sendData = "DataFromAppA"
    if let url = URL(string: "appB://data?\(sendData)&responseURL=appA://response") {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

上記のコードをappAに実装することで、appBにデータを送信し、その後のレスポンスをappA://responseのURLスキームで受け取ることができます。

まとめ

Swiftで別のアプリを起動する方法は多岐にわたり、さまざまなシチュエーションや要件に対応できるように設計されています。

本記事では、基本的なURLスキームから、Universal Links、ディープリンク、ウィジェットやプッシュ通知を利用したアプリの起動方法まで、幅広いテクニックを紹介しました。

また、アプリ間のデータの共有や双方向通信を実現するカスタマイズ方法についても詳しく解説しました。

これらの方法を組み合わせることで、ユーザーエクスペリエンスを向上させるだけでなく、異なるアプリ間でのスムーズな連携を実現することができます。

Swiftのアプリ間連携の技術は、今後も進化していくことでしょう。

その変化に柔軟に対応し、常に最新のテクニックを取り入れることで、ユーザーにとって価値あるアプリを提供し続けることが可能となります。

本記事がSwiftのアプリ間連携に関する疑問の解消や、新しい技術の習得に役立てば幸いです。