Xamarin.iOS でのプロアクティブな提案の概要

この記事では、Xamarin.iOS アプリでプロアクティブな提案を使用して、システムがユーザーに役立つ情報を自動的に事前に提示できるようにすることで、エンゲージメントを促進する方法について説明します。

iOS 10 で初めて導入されたプロアクティブな提案では、ユーザーが適切な時間に役立つ情報を自動的にユーザーに事前に提示することで、Xamarin.iOS アプリとのエンゲージメントのための新しい方法が提供されます。

iOS 10 は、システムが適時にユーザーに役立つ情報を自動的に事前に提示できるようにして、アプリへのエンゲージメントを促進する新しい方法を提示します。 iOS 9 が Spotlight、Handoff、Siri の提案 (「新しい検索 API」を参照してください) を使用してアプリにディープ検索を追加する機能を提供したのと同様に、iOS 10 では、アプリは次の場所からシステムによってユーザーに提示できる機能を公開できます:

  • アプリスイッチャー
  • ロック画面
  • CarPlay
  • マップ
  • Siri のインタラクション
  • QuickType の提案

アプリは、NSUserActivity、Web マークアップ、Core Spotlight、MapKit、Media Player、UIKit などのテクノロジのコレクションを使用して、この機能をシステムに公開します。 さらに、アプリにプロアクティブな提案のサポートを提供することで、より深い Siri との統合が無料で実現します。

位置情報に基づく提案

iOS 10 の新機能であるこの NSUserActivity クラスには、開発者が他のコンテキストで使用できる位置情報を提供できる MapItem プロパティが含まれています。 たとえば、アプリにレストラン レビューが表示される場合、開発者は、ユーザーがアプリで表示しているレストランの場所に MapItem プロパティを設定できます。 ユーザーが Maps アプリに切り替えると、レストランの位置情報が自動的に利用できるようになります。

アプリが App Search をサポートしている場合は、CSSearchableItemAttributesSet クラスの新しい住所コンポーネントを使用して、ユーザーがアクセスする可能性がある場所を指定できます。 MapItem プロパティを設定すると、他のプロパティが自動的に入力されます。

住所コンポーネント プロパティの LatitudeLongitude を設定するだけでなく、Siri がその位置情報への呼び出しを開始できるようにアプリで NamedLocationPhoneNumbers プロパティも指定することをおすすめします。

Web マークアップ ベースの提案

iOS 9 では、ユーザーが Spotlight および Safari の検索結果に表示するコンテンツを強化する構造化データ マークアップを Web サイトに含める機能が追加されました (「Web マークアップを使用した検索」を参照してください)。 iOS 10 では、位置情報に基づくマークアップ (Schema.org で定義されている PostalAddress など) を含める機能が追加され、ユーザーのエクスペリエンスがさらに強化されます。 たとえば、ユーザーが Web サイトでマークされた場所を表示した場合、システムは Maps を開いたときに同じ場所を提案できます。

テキスト ベースの提案

UIKit は iOS 10 で拡張され、UITextInputTraits クラスの TextContentType プロパティを含めて、テキスト領域内のコンテンツのセマンティック意味を指定しました。 この情報を設定すると、通常、システムは適切なキーボードの種類を自動的に選択し、オートコレクトの提案を改善し、他のアプリや Web サイトからの情報を事前に統合することができます。

たとえば、ユーザーが UITextContentType.FullStreetAddress とマークされたテキスト フィールドにテキストを入力している場合、ユーザーが最近表示した場所をフィールドに自動入力することが提案されます。

メディア ベースの提案

アプリが MPPlayableContentManager API を使用してメディアを再生する場合、iOS 10 では、ユーザーはアルバム アートを表示し、ロック画面でアプリを介してメディアを再生できます。

コンテキスト Siri リマインダー

ユーザーが Siri を使用して、後日アプリで現在表示しているコンテンツを表示するためのアラームをすばやく作成できるようにします。 たとえば、アプリでレストランのレビューを、見ていた場合、Siri を呼び出して、「家に着いたらこの事について思い出させて。」と言う可能性がありますSiri は、アプリのレビューへのリンクを含むリマインダーを生成します。

連絡先ベースの提案

アプリの連絡先 (および連絡先情報) を、システムに格納されているすべてのユーザーの連絡先と共に iOS デバイスの連絡先アプリに表示できるようにします。

ライド シェアベースの提案

ライドシェア アプリが MKDirectionsRequest API を使用している場合、iOS 10 では、ユーザーが乗車を希望する可能性が高い場合に、アプリスイッチャーでオプションとして表示されます。 また、Info.plist ファイル内の MKDirectionsApplicationSupportedModes キーの MKDirectionsModeRideShare を指定して、アプリをライドシェア アプリとして登録する必要があります。

アプリがライド シェアのみをサポートしている場合、システムの提案は "Get a rider to... (... へ乗車する)" で始まるでしょう。他の種類のルーティング方向 (Walking や Bike など) がサポートされている場合、システムでは "Get destination to... (...への方向を取得する)" が使用されます

重要

アプリが受け取る MKMapItem オブジェクトには経度と緯度の情報が含まれていない場合があり、ジオコーディングが必要になります。

プロアクティブな提案の実装

Xamarin.iOS アプリへのプロアクティブな提案のサポートを追加するのは、通常、いくつかの API を実装したり、アプリが既に実装している可能性のあるいくつかの API を拡張したりするのと同じくらい簡単です。

プロアクティブな提案は、次の 3 つの主な方法でアプリと連携します:

  • NSUserActivity と Schema.org - NSUserActivity は、ユーザーが現在画面上で操作している情報をシステムが理解するのに役立ちます。 Schema.org は、Web ページに同様の機能を追加します。
  • 場所の提案 - アプリが位置情報に基づく情報を提供または使用する場合、これらの API 拡張機能は、アプリ間でこの情報を共有する新しい方法を提供します。
  • メディア アプリの提案 - システムは、ユーザーと iOS デバイスとのインタラクションのコンテキストに基づいて、アプリとそのメディア コンテンツを昇格させることができます。

また、次の機能を実装することで、アプリでサポートされます:

  • ハンドオフをサポートするために iOS 8 でハンドオフ - NSUserActivityが追加されました。これにより、開発者は 1 つのデバイスでアクティビティを開始し、別のデバイスでアクティビティを続行できます (「ハンドオフの概要」を参照してください)。
  • Spotlight 検索 - iOS 9 では、NSUserActivity を使用して Spotlight 検索結果内からアプリ コンテンツを昇格する機能が追加されました (「コア Spotlight を使用した検索」を参照してください)。
  • コンテキスト Siri アラーム - iOS 10 では、ユーザーがアプリで現在表示しているコンテンツを後日表示するように Siri がすぐにリマインダーを作成できるように NSUserActivity が拡張されています。
  • 場所の提案 - iOS 10 では、アプリ内で表示される場所をキャプチャし、システム全体の多くの場所でそれらを昇格するように NSUserActivity が強化されます。
  • コンテキスト Siri 要求 - NSUserActivityは、実行コンテキスト ユーザーが方向を取得したり、アプリ内から Siri を呼び出す呼び出しを行うことができるように、アプリ内に表示される情報にコンテキストを提供します。
  • 連絡先のインタラクション - iOS 10 の新機能で、NSUserActivity により通信アプリを別の通信方法として連絡先カード (連絡先アプリ内) から昇格できます。

これらの機能には共通するものがあります。これらはすべて、機能を提供するために 1 つの形式または別の形式で NSUserActivity が使用されます。

NSUserActivity

前述のように、NSUserActivity は、ユーザーが画面上で現在どのような情報を扱っているかをシステムが理解するのに役立ちます。 NSUserActivity は、ユーザーがアプリ内を移動するときのユーザーのアクティビティをキャプチャするための軽量状態キャッシュ メカニズムです。 たとえば、レストラン アプリを見ると:

NSUserActivity 軽量状態キャッシュ メカニズム

次のような処理が行われます。

  1. ユーザーがアプリを操作すると、後でアプリの状態を再作成するために NSUserActivity が作成されます。
  2. ユーザーがレストランを検索した場合、同じパターンのアクティビティの作成に従います。
  3. 再び、ユーザーが結果を表示します。 この最後のケースでは、ユーザーは場所を表示しています。iOS 10 では、システムは特定の概念 (場所や通信のインタラクションなど) への認識を深めています。

最後の画面をより詳しく見てみましょう。

NSUserActivity の詳細

ここでは、アプリは NSUserActivity を作成しており、これには、後で状態を再作成するための情報が設定されています。 アプリには、場所の名前や住所などのいくつかのメタデータも含まれています。 このアクティビティが作成されると、これがユーザーの現在の状態を表していることをアプリが iOS に通知します。

次に、アプリは、アクティビティが Handoff のために無線でアドバタイズされるか、場所を提案するための一時的な値として保存されるか、検索結果に表示するためにデバイス上の Spotlight インデックスに追加されるかを決定します。

Handoff と Spotlight 検索の詳細については、ハンドオフの概要に関するガイドと iOS 9 の新しい検索 API のガイドを参照してください。

アクティビティの作成

アクティビティを作成する前に、アクティビティを識別するためにアクティビティの種類識別子を作成する必要があります。 アクティビティの種類識別子は、特定のユーザー アクティビティの種類を一意に識別するために使用される、アプリの Info.plist ファイルの NSUserActivityTypes 配列に追加される短い文字列です。 配列には、アプリがサポートし、アプリ検索に公開するアクティビティごとに 1 つのエントリが存在します。 詳細については、アクティビティの種類識別子の作成に関するリファレンスを参照してください。

アクティビティの例を見てみましょう。

// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Inform system of Activity
activity.BecomeCurrent();

アクティビティの種類識別子を使用して、新しいアクティビティが作成されます。 次に、この状態を後で復元できるように、アクティビティを定義するいくつかのメタデータが作成されます。 その後、アクティビティにわかりやすいタイトルが与えられ、ユーザー情報に添付されます。 最後に、一部の機能が有効になり、アクティビティがシステムに送信されます。

上記のコードは、次の変更を行って、アクティビティにコンテキストを提供するメタデータを含むようにさらに拡張できます:

...

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;

// Inform system of Activity
activity.BecomeCurrent();

開発者がアプリと同じ情報を表示できる Web サイトがある場合、そのアプリには URL を含めることができます。また、アプリがインストールされていない他のデバイス (Handoff 経由) でコンテンツを表示できます:

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

アクティビティの復元

アプリの検索結果 (NSUserActivity) をタップしてユーザーに応答するには、AppDelegate.cs ファイルを編集し、ContinueUserActivity メソッドをオーバーライドします。 次に例を示します。

public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Take action based on the activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.platform":
        // Restore the state of the app here...
        break;
    }

    return true;
}

開発者は、これが上記で作成したアクティビティと同じアクティビティの種類識別子 (com.xamarin.platform) であることを確認する必要があります。 アプリは、ユーザーが中断した場所に状態を復元するために、NSUserActivity に格納されている情報を使用します。

アクティビティを作成する利点

上記の最小限のコードで、アプリは 3 つの新しい iOS 10 機能を利用できるようになりました:

  • Handoff
  • Spotlight 検索
  • コンテキスト Siri リマインダー

次のセクションでは、他の 2 つの新しい iOS 10 機能を有効にする方法について説明します:

  • 場所の提案
  • コンテキスト Siri 要求

位置情報に基づく提案

上記のレストラン検索アプリの例を見てみましょう。 NSUserActivity が実装されており、すべてのメタデータと属性が正しく設定された場合、ユーザーは次のことを実行できます:

  1. 友達と待ち合わせるレストランを見つける。
  2. ユーザーがマルチタスキング アプリスイッチャーを使用してアプリから移動すると、システムは、お気に入りのナビゲーション アプリを使用してレストランへの方向を取得するための提案を (画面の下部に) 自動的に表示します。
  3. ユーザーがメッセージ アプリに切り替えて「待ち合わせは」と入力しはじめると、QuickType キーボードによってレストランの住所への貼り付けが自動的に提案されます。
  4. ユーザーが Maps アプリに切り替わると、レストランの住所が宛先として自動的に提案されます。
  5. これは (NSUserActivity をサポートしている) サード パーティ製アプリでも機能するため、ユーザーはライドシェア アプリに切り替えることができ、そこでも、レストランの住所が目的地として自動的に提案されます。
  6. また、Siri にコンテキストを提供するため、ユーザーはレストラン アプリ内で Siri を呼び出し、"道順の取得..." を求めることができ、Siri は、ユーザーが表示しているレストランへの道順を提供します。

上記のすべての機能には共通点が 1 つあり、それらはすべて、提案の元の場所を示します。 上記の例の場合は、架空のレストラン レビュー アプリです。

iOS 10 では、既存のフレームワークにいくつかの小さな修正と追加を加えることで、アプリでこの機能を利用できるように強化されています:

  • NSUserActivity には、アプリ内で表示される位置情報をキャプチャするための追加のフィールドがあります。
  • 位置情報をキャプチャするために、MapKit と CoreSpotlight にいくつかの追加が行われています。
  • 位置情報に対応する機能が、システム内の Siri、Maps、キーボード、マルチタスキング、その他のアプリに追加されました。

位置情報に基づく提案を実装するには、上記と同じアクティビティ コードから始めます:

// Create App Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" };
activity.ContentAttributeSet = attributes;

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

// Inform system of Activity
activity.BecomeCurrent();

アプリで MapKit を使用している場合は、現在のマップ MKMapItem をアクティビティに追加するのと同じくらい簡単です:

// Save MKMapItem location
activity.MapItem = myMapItem;

アプリが MapKit を使用していない場合は、アプリ検索を採用し、以下の新しい位置情報の属性を指定できます:

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
...

attributes.NamedLocation = "Apple Inc.";
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

上記のコードを詳しく見てみましょう。 まず、すべてのインスタンスで場所の名前が必要です:

attributes.NamedLocation = "Apple Inc.";

次に、テキスト ベースのインスタンス (QuickType キーボードなど) には、場所のテキスト ベースの説明が必要です:

attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";

緯度と経度は省略可能ですが、アプリが送信する正確な場所にユーザーがルーティングされていることを確認します。そのため、これを含める必要があります:

attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;

電話番号を設定することで、アプリは Siri にアクセスできるため、ユーザーは "この場所を呼び出す" などのメッセージをアプリから Siri を呼び出すことができます:

attributes.PhoneNumbers = new string[]{"(800) 275-2273"};

最後に、アプリは、インスタンスがナビゲーションと電話呼び出しに適しているかどうかを示すことができます:

attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

連絡先のインタラクションの実装

iOS 10 の新機能である通信アプリは、連絡先カードから連絡先アプリに深く統合されています。 連絡先のインタラクションを実装したアプリの場合、ユーザーは指定されたアプリの情報を連絡先の特定のユーザーに追加できます。 たとえば、カードの上部にある [クイック操作] ボタンを押してメッセージを送信すると、アタッチされたアプリがメッセージを送信するオプションとして一覧表示されます。

サード パーティ製アプリが選択されている場合は、ユーザーが次に連絡を取りたい場合に、そのアプリを記憶し、指定されたユーザーにメッセージを送信する既定の方法として表示できます。

連絡先のインタラクションは、iOS 10 で導入されたNSUserActivity と新しい意図フレームワークを使用してアプリに実装されます。 意図の操作の詳細については、SiriKit の概念の理解SiriKit の実装に関するガイドを参照 してください。

インタラクションのドネート

アプリがインタラクションをドネートする方法を見てみましょう:

インタラクションのドネートの概要

アプリは 意図 (INIntent)、参加者メタデータ を含む INInteraction オブジェクトを作成します。 意図は、ビデオ通話やテキスト メッセージの送信などのユーザー アクションを表します。 参加者には、通信を受け取るユーザーが含まれます。 メタデータは、メッセージの正常な送信などの追加情報を定義します。

開発者が INIntentINIntentResponse のインスタンスを直接作成することはなく、これらの親クラスを継承した特定の子クラス (アプリがユーザーに代わって達成するタスクに基づく) のいずれかを使用します。 たとえば、テキスト メッセージの送信の場合は INSendMessageIntentINSendMessageIntentResponse です。

インタラクションが完全に設定されたら、DonateInteraction メソッドを呼び出して、対話が使用可能であることをシステムに通知します。

ユーザーが連絡先カードからアプリを操作すると、インタラクションは NSUserActivity とバンドルされ、アプリの起動に使用されます:

インタラクションは、アプリの起動に使用される NSUserActivity にバンドルされます

メッセージの送信意図の次の例を見てみましょう:

using System;
using Foundation;
using UIKit;
using Intents;

namespace MonkeyNotification
{
  public class DonateInteraction
  {
    #region Constructors
    public DonateInteraction ()
    {
    }
    #endregion

    #region Public Methods
    public void SendMessageIntent (string text, INPerson from, INPerson[] to)
    {

      // Create App Activity
      var activity = new NSUserActivity ("com.xamarin.message");

      // Define details
      var info = new NSMutableDictionary ();
      info.Add (new NSString ("message"), new NSString (text));

      // Populate Activity
      activity.Title = "Sent MonkeyChat Message";
      activity.UserInfo = info;

      // Enable capabilities
      activity.EligibleForSearch = true;
      activity.EligibleForHandoff = true;
      activity.EligibleForPublicIndexing = true;

      // Inform system of Activity
      activity.BecomeCurrent ();

      // Create message Intent
      var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

      // Create Intent Reaction
      var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

      // Create interaction
      var interaction = new INInteraction (intent, response);

      // Donate interaction to the system
      interaction.DonateInteraction ((err) => {
        // Handle donation error
        ...
      });
    }
    #endregion
  }
}

このコードを詳しく見ると、NSUserActivity のインスタンスが作成されて設定されます (上の「アクティビティの作成」 セクションを参照してください)。 次に、(INIntent の継承元である) INSendMessageIntent のインスタンスを作成し、送信されるメッセージの詳細を設定します:

var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

INSendMessageIntentResponse が作成され、上記で作成された NSUserActivity が渡されます:

var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

An INInteraction は、先ほど作成したメッセージの送信意図 (INSendMessageIntent) と応答 (INSendMessageIntentResponse) から構築されます:

var interaction = new INInteraction (intent, response);

最後に、システムはインタラクションの通知です:

// Donate interaction to the system
interaction.DonateInteraction ((err) => {
  // Handle donation error
  ...
});

完了ハンドラーが渡され、そこでアプリはドネートの成功または失敗に応答することができます。

アクティビティのベスト プラクティス

Apple は、アクティビティの操作について次のベスト プラクティスを提案します:

  • 遅延ペイロードの更新に NeedsSave を使用します。
  • 現在のアクティビティへの厳密な参照を保持してください。
  • 状態を復元するのに十分な情報のみを含む小さなペイロードのみを転送します。
  • 逆引き DNS 表記を使用して指定することで、アクティビティの種類の識別子が一意でわかりやすいものになっていることを確認します。

Schema.org

上記のように、NSUserActivity は、ユーザーが現在画面上で操作している情報をシステムが理解するのに役立ちます。 Schema.org は、Web ページに同様の機能を追加します。

Schema.org は、同じ種類の位置情報ベースのインタラクションを Web サイトに提供できます。 Apple は、ネイティブ アプリと同様に Safari で表示した場合も同様に動作するように、新しい場所の提案を設計しました。

いくつかの Schema.org 背景:

  • これは、オープンな Web マークアップ ボキャブラリ標準を提供します。
  • Web ページに構造化メタデータを含めれば機能します。
  • 使用可能なさまざまな概念を表す 500 を超えるスキーマがあります。
  • Web サイトに実装することで、開発者はネイティブ アプリで NSUserActivity を使用する利点の一部を得られます。

スキーマは構造のようなツリーに配置され、Restaurant などの特定の型は Local Business などのより汎用的な型から継承されます。 詳細については、Schema.org を参照してください。

たとえば、Web ページに次のデータが含まれている場合です:

<script type="application/ld+json">
{
  "@context":"http://schema.org",
  "@type":"Restaurant",
  "telephone":"(415) 781-1111",
  "url":"https://www.yanksing.com",
  "address":{
    "@type":"PostalAddress",
    "streetAddress":"101 Spear St",
    "addressLocality":"San Francisco",
    "postalCode":"94105",
    "addressRegion":"CA"
  },
  "aggregateRating":{
    "@type":"AggregateRating",
    "ratingValue":"3.5",
    "reviewCount":"2022"
  }
}
</script>

ユーザーが Safari でこのページにアクセスし、別のアプリに切り替えた場合、ページの位置情報がキャプチャされ、システムの他の部分で場所の提案として提供されます (上記のアクティビティを参照)。

Safari は、次のいずれかのスキーマ プロパティに準拠する Web ページ上の内容を抽出します:

  • PostalAddress
  • GeoCoordinates
  • 電話のプロパティ。

詳細については、「Web マークアップを使用した検索」ガイドを参照してください。

場所の提案の使用

この次のセクションでは、システムの他の部分 (Maps アプリなど) や他のサード パーティ製アプリから取得した場所の提案について説明します。

アプリで場所の提案を使用する主な方法は 2 つあります:

  • QuickType キーボードを使用。
  • ルーティング アプリで位置情報を使用して直接。

場所の提案と QuickType キーボード

アプリがテキスト ベースの形式で住所を処理する場合、アプリは QuickType UI を使用して場所の提案を利用できます。iOS 10 では、次の機能を備えた QuickType UI が拡張されます:

  • このアプリでは、UI 内のテキスト フィールドのセマンティック意図に関するヒントを追加できます。
  • このアプリでは、プロアクティブな提案をアプリで取得できます。
  • このアプリは、強化された自動修正の恩恵を受けることができます。

iOS 10 のテキスト フィールド コントロールの新しい TextContentType プロパティを使用すると、開発者は、ユーザーが特定のフィールドに入力する値のセマンティック意図を定義できます。 次に例を示します。

var textField = new UITextField();
textField.TextContentType = UITextContentType.FullStreetAddress;

ユーザーが指定されたフィールドに完全な番地を入力することをアプリが予期していることをシステムに伝えます。 これにより、ユーザーがこのフィールドに値を入力するときに、QuickType キーボードで自動的に場所の提案をキーボードに提供できるようになります。

開発者が UITextContentType 静的クラスで使用できる一般的な型をいくつか次に示します:

  • Name
  • GivenName
  • FamilyName
  • Location
  • FullStreetAddress
  • AddressCityAndState
  • TelephoneNumber
  • EmailAddress

ルーティング アプリと Location Suggestions

このセクションでは、ルーティング アプリ内から直接場所の提案を使用する方法について説明します。 ルーティング アプリでこの機能を追加するために、開発者は次のように既存の MKDirectionsRequest フレームワークを利用します:

  • マルチタスキングでアプリを昇格する。
  • アプリをルーティング アプリとして登録する。
  • MapKit MKDirectionsRequest オブジェクトを使用してアプリの起動を処理する。
  • ユーザーエンゲージメントに基づいて、適切な時期にユーザーにアプリを提案する機能を iOS に提供する。

MapKit MKDirectionsRequest オブジェクトを使用してアプリを起動すると、要求された場所にユーザーの方向を自動的に提供し始めるか、ユーザーが方向を簡単に開始できる UI を表示する必要があります。 次に例を示します。

using System;
using Foundation;
using UIKit;
using MapKit;
using CoreLocation;

namespace MonkeyChat
{
  [Register ("AppDelegate")]
  public class AppDelegate : UIApplicationDelegate, IUISplitViewControllerDelegate
  {
    ...

    public override bool OpenUrl (UIApplication app, NSUrl url, NSDictionary options)
    {
      if (MKDirectionsRequest.IsDirectionsRequestUrl (url)) {
        var request = new MKDirectionsRequest (url);
        var coordinate = request.Destination?.Placemark.Location?.Coordinate;
        var address = request.Destination.Placemark.AddressDictionary;
        if (coordinate.IsValid()) {
          var geocoder = new CLGeocoder ();
          geocoder.GeocodeAddress (address, (place, err) => {
            // Handle the display of the address

          });
        }
      }

      return true;
    }
  }    
}

このコードを詳しく見てみましょう。 有効な目的地要求であるかどうかをテストします:

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

有効である場合は、URL から MKDirectionsRequest が作成されます:

var request = new MKDirectionsRequest(url);

iOS 10 の新機能で、アプリに geo 座標を持たない住所を送信できます。そのため、開発者はアドレスをエンコードする必要があります:

var geocoder = new CLGeocoder();
geocoder.GeocodeAddress(address, (place, err)=> {
  // Handle the display of the address

});

メディア アプリの提案

アプリが、ポッドキャスト アプリやオーディオやビデオなどのストリーミング メディア コンテンツなどのあらゆる種類のメディアを iOS 10 で処理する場合は、システム内の Media Suggestions を利用できます。

メディアを処理するアプリの場合、iOS では次の動作がサポートされます:

  • iOS は、ユーザーが以前の動作に基づいて使用する可能性が高いアプリを昇格させます。
  • アプリに関連する提案は、Spotlight と Today ビューに表示されます。
  • アプリが次のいずれかのトリガーを満たしている場合は、ロック画面の提案に昇格される可能性があります:
    • ヘッドホンまたは Bluetooth デバイス接続後。
    • 車に乗った後。
    • 自宅または職場に到着した後。

iOS 10 に簡単な API 呼び出しを含めることで、開発者はメディア アプリのユーザーにとってより魅力的なロック画面エクスペリエンスを作成できます。 MPPlayableContentManager クラスを使用してメディアの再生を管理すると、アプリのロック画面に完全なメディア コントロール (音楽アプリで表示されるコントロールなど) が表示されます。

using System;
using MediaPlayer;
using UIKit;

namespace MonkeyPlayer
{
  public class PlayableContentDelegate : MPPlayableContentDelegate
  {
    #region Constructors
    public PlayableContentDelegate ()
    {
    }
    #endregion

    #region Override methods
    public override void InitiatePlaybackOfContentItem (MPPlayableContentManager contentManager, Foundation.NSIndexPath indexPath, Action<Foundation.NSError> completionHandler)
    {
      // Access the media item to play
      var item = LoadMediaItem (indexPath);

      // Populate the lock screen
      PopulateNowPlayingItem (item);

      // Prep item to be played
      var status = PreparePlayback (item);

      // Call completion handler
      completionHandler (null);
    }
    #endregion

    #region Public Methods
    public MPMediaItem LoadMediaItem (Foundation.NSIndexPath indexPath)
    {
      var item = new MPMediaItem ();

      // Load item from media store
      ...

      return item;
    }

    public void PopulateNowPlayingItem (MPMediaItem item)
    {
      // Get Info Center and album art
      var infoCenter = MPNowPlayingInfoCenter.DefaultCenter;
      var albumArt = (item.Artwork == null) ? new MPMediaItemArtwork (UIImage.FromFile ("MissingAlbumArt.png")) : item.Artwork;

      // Populate Info Center
      infoCenter.NowPlaying.Title = item.Title;
      infoCenter.NowPlaying.Artist = item.Artist;
      infoCenter.NowPlaying.AlbumTitle = item.AlbumTitle;
      infoCenter.NowPlaying.PlaybackDuration = item.PlaybackDuration;
      infoCenter.NowPlaying.Artwork = albumArt;
    }

    public bool PreparePlayback (MPMediaItem item)
    {
      // Prepare media item for playback
      ...

      // Return results
      return true;
    }
    #endregion
  }
}

まとめ

この記事では、プロアクティブな提案について説明し、開発者がそれらを使用して Xamarin.iOS アプリへのトラフィックを促進する方法について説明しました。 プロアクティブな提案を実装する手順について説明し、使用ガイドラインを示しました。