リンクを受け取る方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
リンクは、ユーザーが共有するデータを表現するための一般的な形式の 1 つです。ユーザーはリンクを (記事や Web サイトなどから) 直接共有することもあります。ユーザーがオンラインで利用できる HTML またはコンテンツを共有しているときには、別の手段としてリンクのサポートも役立ちます。
アプリこのトピックではソース アプリから共有されている単一リンクを受け取る方法について説明します。
理解しておく必要があること
テクノロジ
必要条件
- Visual Studio と関連するテンプレートについて理解している必要があります。
- JavaScript について理解している必要があります。
手順
ステップ 1: 共有コントラクトをサポートする。
アプリで共有コンテンツを受け取るには、事前に共有コントラクトのサポートを宣言する必要があります。このコントラクトを使うと、基本的に、アプリがコンテンツを受け取れることをシステムに通知できます。Microsoft Visual Studio テンプレートを使ってアプリを作る場合は、次の手順に従って共有コントラクトをサポートします。
- デザイナー ビューでマニフェスト ファイル (package.manifest) を開きます。
- [宣言] タブを開きます。
- [使用可能な宣言] ボックスの一覧の [共有ターゲット] を選びます。
- [追加] をクリックして、アプリに共有ターゲット コントラクトのサポートを追加します。
ステップ 2: アプリがリンクをサポートすることを指定する。
リンクをサポートするためには、アプリが URI 形式をサポートすることを指定する必要があります。
- マニフェスト ファイルを開きます。
- [データ形式] セクションで、[新規追加] をクリックします。
- 「"text"」と入力します。
ここまでの手順によって、マニフェストに次のセクションが追加されます。
<Extensions>
<Extension Category="windows.shareTarget">
<ShareTarget>
<DataFormat>uri</DataFormat>
</ShareTarget>
</Extension>
</Extensions>
注 共有ターゲット コントラクト用にアプリがアクティブ化されている場合は、別のエントリ ポイントを指定できます。そのためには、パッケージ マニフェストの [共有ターゲット] 宣言の [アプリ] 設定セクションで [スタート] ページ エントリを変更します。このページのアクティブ化を処理する別の JavaScript ファイルも使うことを強くお勧めします。例については、コンテンツ共有ターゲット アプリ サンプルをご覧ください。
ステップ 3: アプリがどのような状況でアクティブ化されたかを検出するイベント ハンドラーを追加する。
ユーザーがアプリでコンテンツを共有することを選ぶと、システムによってアプリがアクティブ化されます。アクティブ化はさまざまな状況で発生する可能性があるため、アクティブ化が行われた理由を検出するコードを追加する必要があります。これは、kind プロパティの値を調べることで確認できます。
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The application has been launched. Initialize as appropriate.
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
...
}
};
共有ターゲット コントラクト用の専用のスタート ページを使う場合は、kind プロパティのチェックを省略できます。
ステップ 4: ShareOperation オブジェクトを取得する。
ShareOperation オブジェクトには、ユーザーが共有するコンテンツをアプリが取得するために必要なすべてのデータが含まれています。
shareOperation = args.detail.shareOperation;
ステップ 5: activated イベント ハンドラーからすばやく戻る。
activated イベント ハンドラーは、すばやく戻る必要があります。activated イベント ハンドラーからの非同期イベントをキューに入れ、activated イベントから戻った後に共有データの処理が行われるようにします。
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
残りの手順では、shareReady
関数を実装します。
ステップ 6: DataPackageView に URI が含まれているか確認する。
ShareOperation オブジェクトには DataPackageView オブジェクトが含まれています。このオブジェクトは、ソース アプリがデータの作成に使った DataPackage オブジェクトを読み取り専用にしたものです。このオブジェクトを使って、共有されたコンテンツにリンクが含まれているかどうかを確認します。
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.uri)) {
// Code to process URI goes here.
}
アプリで 1 つの形式しかサポートしていないとしても、目的のデータ形式が DataPackage に含まれているかどうかをチェックすることをお勧めします。これにより、後で他のデータ形式やファイル形式をサポートするのが簡単になります。
ステップ 7: リンクを処理する。
URI を取り出すために DataPackageView.getUriAsync メソッドを呼び出します。
shareOperation.data.getUriAsync().then(function (uri) {
if (uri != null) {
// In this sample, we only display the URI. To output the link using this example,
// you need a div tag with an id of "output" in your HTML file.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = uri.absoluteUri;
}
});
ステップ 8: reportCompleted を呼び出す。
アプリでコンテンツの共有が正常に完了したら、reportCompleted を呼び出します。このメソッドを呼び出すと、システムによってアプリが閉じられます。
shareOperation.reportCompleted();
注釈
一部のアプリは、http:// または https:// で始まらない Uniform Resource Identifier (URI) を提供する場合があります。たとえば、ソース アプリは、ユーザーをアプリ自体のコンテンツに直接移動させるアクティブ化プロトコルを提供できます。アプリが既に任意の URI をサポートできる場合は、この機能を既定で使うことができます。アプリが特定の種類の URI だけに制限されている場合は、次のいずれかの方法を検討する必要があります。
- HTML をサポートしている場合は、DataPackage で提供されている HTML を代わりに使います。
- HTML をサポートしていないものの、テキストをサポートしている場合は、DataPackage でテキストを使います。
- 上のどちらのオプションも使えない場合は、特定の URI はサポートしていないことをユーザーに伝えるメッセージの表示を検討します。
どの場合も、データのタイトルと説明をエクスペリエンスに組み込むようにしてください。そうすることで、ユーザーは共有されるものについての詳しいコンテキストを得ることができます。
コンテンツ共有ターゲット アプリ サンプルのコード例を調べると、共有の一部として画像を受け取るアプリのエンド ツー エンドのエクスペリエンス全体を把握できます。
完全な例
var shareOperation = null;
function shareReady(args) {
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.uri)) {
shareOperation.data.getUriAsync().done(function (uri) {
// In this sample, we only display the URI. To output the link using this example,
// you need a div tag with an id of "output" in your HTML file.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Uri: " + uri.absoluteUri;
});
}
}
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The app was launced. Initialize as appropriate.
args.setPromise(WinJS.UI.processAll());
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
// This app was been activated for the Share contract
args.setPromise(WinJS.UI.processAll());
// We receive the ShareOperation object as part of the eventArgs
shareOperation = args.detail.shareOperation;
// We queue an asychronous event so that working with the ShareOperation
// object does not block or delay the return of the activation handler.
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
}
};
関連トピック
Windows.ApplicationModel.DataTransfer