Linking
Linking は、アプリへの受信リンクとアプリからの送信リンクの両方を操作するための汎用的なインターフェースを提供します。
すべてのリンク (URL) には URL スキームがあり、一部のウェブサイトは https:// または http:// で始まり、その http が URL スキームです。これを略してスキームと呼びましょう。
https の他にも、mailto スキームもおそらくご存じでしょう。mailto スキームのリンクを開くと、オペレーティングシステムはインストールされているメールアプリケーションを開きます。同様に、電話をかけたり SMS を送信したりするためのスキームもあります。組み込みの URL スキームについては、以下をご覧ください。
mailto スキームを使用するのと同様に、カスタム URL スキームを使用することで他のアプリケーションにリンクすることも可能です。例えば、Slack から マジックリンク メールを受け取った場合、Slack を起動 ボタンは、slack://secret/magic-login/other-secret のような href を持つアンカータグです。Slack の場合と同様に、カスタムスキームを処理したいことをオペレーティングシステムに伝えることができます。Slack アプリが開くと、それ自体を開くために使用された URL を受け取ります。これはしばしばディープリンクと呼ばれます。アプリにディープリンクを取得する方法については、以下をご覧ください。
カスタム URL スキームだけがモバイルでアプリケーションを開く唯一の方法ではありません。例えば、モバイルで開かれるリンクを誰かにメールで送りたい場合、カスタム URL スキームを使用することは理想的ではありません。なぜなら、ユーザーがデスクトップでメールを開く可能性があり、その場合リンクは機能しないからです。代わりに、https://www.myapp.io/records/1234546 のような標準の https リンクを使用する必要があります。モバイルでは、これらのリンクはアプリを開くように設定できます。Android ではこの機能は ディープリンク と呼ばれ、iOS では ユニバーサルリンク として知られています。
組み込みの URL スキーム
冒頭で述べたように、すべてのプラットフォームに存在するコア機能のための URL スキームがいくつかあります。以下は網羅的なリストではありませんが、最も一般的に使用されるスキームをカバーしています。
| スキーム | 説明 | iOS | Android |
|---|---|---|---|
mailto | メールアプリを開く 例:mailto: hello@world.dev | ✅ | ✅ |
tel | 電話アプリを開く 例:tel:+123456789 | ✅ | ✅ |
sms | SMSアプリを開く 例:sms:+123456789 | ✅ | ✅ |
https / http | ウェブブラウザアプリを開く 例:https://expo.dev | ✅ | ✅ |
ディープリンクの有効化
アプリでディープリンクを有効にする場合は、以下のガイドをお読みください。
- Android
- iOS
Android でディープリンクのサポートを追加する方法については、「アプリコンテンツのディープリンクの有効化 - ディープリンク用のインテントフィルタの追加」を参照してください。
MainActivity の既存のインスタンスでインテントを受信したい場合は、AndroidManifest.xml で MainActivity の launchMode を singleTask に設定できます。詳細については、<activity> のドキュメントを参照してください。
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
iOSでは、ステップ3で説明されているように、LinkingIOSフォルダーをヘッダー検索パスに追加する必要があります。ここで確認してください。アプリの実行中に受信アプリリンクをリッスンしたい場合は、以下の行を*AppDelegate.mに追加する必要があります。
- ObjectiveC
- Swift
// iOS 9.x or newer
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
アプリがユニバーサルリンクを使用している場合は、以下のコードも追加する必要があります。
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
}
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return RCTLinkingManager.application(app, open: url, options: options)
}
アプリがユニバーサルリンクを使用している場合は、以下のコードも追加する必要があります。
override func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
return RCTLinkingManager.application(
application,
continue: userActivity,
restorationHandler: restorationHandler
)
}
ディープリンクの処理
アプリを開く URL を処理する方法は 2 つあります。
1. アプリがすでに開いている場合、アプリはフォアグラウンドになり、Linking 'url' イベントが発行されます
これらのイベントは、Linking.addEventListener('url', callback) で処理できます。リンクされた URL を持つ callback({url}) が呼び出されます。
2. アプリがまだ開いていない場合、アプリが開き、URL が initialURL として渡されます
これらのイベントは Linking.getInitialURL() で処理できます。これは、URL がある場合はその URL を解決する Promise を返します。
例
リンクを開く、ディープリンク (ユニバーサルリンク)
- TypeScript
- JavaScript
カスタム設定を開く
- TypeScript
- JavaScript
ディープリンクを取得する
- TypeScript
- JavaScript
インテントを送信 (Android)
- TypeScript
- JavaScript
リファレンス
Methods
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 必須 | string | 開く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など、他のURLを使用できます。
このメソッドは Promise オブジェクトを返します。ユーザーがオープンダイアログを確認するか、URL が自動的に開かれた場合、Promise は解決されます。ユーザーがオープンダイアログをキャンセルするか、URL に登録されたアプリケーションがない場合、Promise は拒否されます。
パラメータ
| 名前 | 型 | 説明 |
|---|---|---|
| url 必須 | string | 開くURL。 |
システムが指定された URL の開く方法を知らない場合、このメソッドは失敗します。非 HTTP(S) URL を渡す場合は、まず canOpenURL() をチェックするのが最善です。Web URL の場合、プロトコル ("http://"、"https://") は適切に設定する必要があります!
このメソッドはシミュレータでは異なる動作をする場合があります。例えば、iOSシミュレータではダイヤラアプリへのアクセスがないため、"tel:"リンクは処理できません。
sendIntent() Android
static sendIntent(
action: string,
extras?: Array<{key: string; value: string | number | boolean}>,
): Promise<void>;
extras 付きで Android インテントを起動します。
パラメータ
| 名前 | 型 |
|---|---|
| action 必須 | string |
| extras | Array<{key: string, value: string | number | boolean}> |