本文へスキップ

Linking

Linking は、アプリへの着信リンクと発信リンクの両方とやり取りするための一般的なインターフェースを提供します。

すべてのリンク(URL)にはURLスキームがあります。一部のウェブサイトはhttps://またはhttp://で始まり、httpがURLスキームです。ここでは簡単にスキームと呼びます。

httpsに加えて、mailtoスキームにも精通しているでしょう。mailtoスキームのリンクを開くと、オペレーティングシステムはインストールされているメールアプリケーションを開きます。同様に、電話をかけるためのスキームやSMSを送信するためのスキームもあります。組み込みのURLスキームについては、以下で詳しく説明します。

mailtoスキームを使用するのと同じように、カスタムURLスキームを使用して他のアプリケーションにリンクすることも可能です。たとえば、Slackからマジックリンクメールを受け取ると、「Slackを起動」ボタンは、次のようなhrefを持つアンカータグです。slack://secret/magic-login/other-secret。Slackの場合と同様に、カスタムスキームを処理したいことをオペレーティングシステムに伝えることができます。Slackアプリが開くと、それを開くために使用されたURLを受け取ります。これは、多くの場合、ディープリンクと呼ばれます。アプリへのディープリンクの取得方法について詳しくは後述します。

カスタムURLスキームは、モバイルでアプリケーションを開く唯一の方法ではありません。メール内のリンクでカスタムURLスキームを使用すると、デスクトップではリンクが壊れてしまうため、使用すべきではありません。代わりに、https://www.myapp.io/records/1234546などの通常のhttpsリンクを使用します。モバイルでは、そのリンクでアプリを開きたいです。Androidではこれをディープリンク(iOSではユニバーサルリンク)と呼びます。

組み込みURLスキーム

はじめに述べたように、すべてのプラットフォームに存在するコア機能用のいくつかのURLスキームがあります。以下は網羅的なリストではありませんが、最も一般的に使用されるスキームを網羅しています。

スキーム説明iOSAndroid
mailtoメールアプリを開きます。例: mailto: support@expo.io
tel電話アプリを開きます。例: tel:+123456789
smsSMSアプリを開きます。例: sms:+123456789
https / httpWebブラウザアプリを開きます。例: https://expo.io

アプリでディープリンクを有効にするには、以下のガイドを参照してください。

Androidでディープリンクのサポートを追加する方法については、アプリコンテンツのディープリンクの有効化 - ディープリンクのインテントフィルターの追加を参照してください。

既存のMainActivityインスタンスでインテントを受け取る場合は、AndroidManifest.xmlでMainActivityのlaunchModesingleTaskに設定できます。<activity>ドキュメントで詳細情報を確認してください。

<activity
android:name=".MainActivity"
android:launchMode="singleTask">

アプリを開くURLを処理するには、2つの方法があります。

1. アプリが既に開いていて、アプリがフォアグラウンドにあり、Linking 'url'イベントが発生した場合

これらのイベントはLinking.addEventListener('url', callback)で処理できます。リンクされたURLを使用してcallback({url})を呼び出します。

2. アプリがまだ開いていない場合、アプリが開き、urlがinitialURLとして渡されます

これらのイベントはLinking.getInitialURL()で処理できます。これは、URLが存在する場合は、そのURLに解決されるPromiseを返します。


カスタム設定を開く

インテントを送信する(Android)

参照

メソッド

addEventListener()

static addEventListener(
type: 'url',
handler: (event: {url: string}) => void,
): EmitterSubscription;

urlイベントタイプをリッスンし、ハンドラーを提供することで、Linkingの変更に対するハンドラーを追加します。


canOpenURL()

static canOpenURL(url: string): Promise<boolean>;

インストールされているアプリが特定のURLを処理できるかどうかを判断します。

このメソッドはPromiseオブジェクトを返します。指定されたURLを処理できるかどうかが決定されると、Promiseが解決され、最初の引数に開くことができるかどうかが渡されます。

URLを開くことができるかどうかを確認することが不可能な場合、またはAndroid 11(SDK 30)をターゲットにしていてAndroidManifest.xmlに関連するインテントクエリを指定していない場合は、AndroidでPromiseは拒否されます。同様に、iOSでは、Info.plist内のLSApplicationQueriesSchemesキーに特定のスキームを追加していない場合は、Promiseは拒否されます(下記参照)。

パラメーター

名前説明
url
必須
文字列開くURL。

Web URLの場合、プロトコル("http://""https://")を適切に設定する必要があります!

このメソッドはiOS 9以降に制限があります。Apple公式ドキュメントから

  • アプリが以前のバージョンのiOSにリンクされているが、iOS 9.0以降で実行されている場合、このメソッドを最大50回呼び出すことができます。その制限に達すると、その後の呼び出しは常にfalseに解決されます。ユーザーがアプリを再インストールまたはアップグレードすると、iOSは制限をリセットします。

iOS 9以降では、アプリはInfo.plist内にLSApplicationQueriesSchemesキーを提供する必要もあります。そうでない場合、canOpenURL()は常にfalseに解決されます。

Android 11(SDK 30)をターゲットにしている場合は、処理するスキームのインテントをAndroidManifest.xmlで指定する必要があります。一般的なインテントのリストはこちらにあります。

たとえば、httpsスキームを処理するには、マニフェストに次のものを追加する必要があります。

<manifest ...>
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https"/>
</intent>
</queries>
</manifest>

getInitialURL()

static getInitialURL(): Promise<string | null>;

アプリの起動がアプリリンクによってトリガーされた場合、リンクURLが返されます。そうでない場合はnullが返されます。

Androidでディープリンクをサポートするには、https://developer.android.com/training/app-indexing/deep-linking.html#handling-intentsを参照してください。

リモートJSデバッグがアクティブな場合、getInitialURLはnullを返す可能性があります。確実に渡されるように、デバッガーを無効にしてください。


openSettings()

static openSettings(): Promise<void>;

設定アプリを開き、アプリにカスタム設定がある場合は表示します。


openURL()

static openURL(url: string): Promise<any>;

インストールされているアプリのいずれかを使用して、指定されたurlを開こうとします。

場所(例:Androidでは「geo:37.484847,-122.148386」、iOSでは「https://maps.apple.com/?ll=37.484847,-122.148386」)、連絡先、またはインストールされているアプリで開くことができるその他のURLを使用できます。

このメソッドはPromiseオブジェクトを返します。ユーザーが開くダイアログを承認した場合、またはURLが自動的に開かれた場合、Promiseは解決されます。ユーザーが開くダイアログをキャンセルした場合、またはそのURLに対応する登録済みアプリケーションがない場合、Promiseは拒否されます。

パラメーター

名前説明
url
必須
文字列開くURL。

指定されたURLを開く方法がシステムに認識されていない場合、このメソッドは失敗します。http(s)以外のURLを渡す場合は、事前にcanOpenURL()を確認することをお勧めします。

Web URLの場合、プロトコル("http://""https://")を適切に設定する必要があります!

このメソッドはシミュレーターでは異なる動作をする可能性があります。例えば、"tel:"リンクは、ダイヤラーアプリにアクセスできないため、iOSシミュレーターでは処理できません。


sendIntent()
Android

static sendIntent(
action: string,
extras?: Array<{key: string; value: string | number | boolean}>,
): Promise<void>;

追加情報付きでAndroid Intentを起動します。

パラメーター

名前
アクション
必須
文字列
追加情報Array<{key: string, value: string | number | boolean}>