共用方式為


Xamarin 中的 watchOS 主動式建議

本文說明如何在 watchOS 3 應用程式中使用主動式建議來推動參與,方法是讓系統自動向用戶呈現有用的資訊。

觀看OS 3的新功能:主動式建議會藉由在適當時間主動向用戶呈現有用的資訊,以向使用者呈現與 Xamarin.iOS 應用程式互動的新聞方式。

關於主動式建議

watchOS 3 的新功能包含MapItem屬性,NSUserActivity可讓應用程式提供可用於其他內容的位置資訊。 例如,如果應用程式顯示旅館評論並提供MapItem位置,如果使用者切換至 地圖 應用程式,他們剛檢視的旅館位置就可供使用。

應用程式會使用 、MapKit、媒體播放器 和 UIKit 等NSUserActivity技術集合,向系統公開此功能。 此外,藉由為應用程式提供主動式建議支援,可免費取得更深入的 Siri 整合。

以位置為基礎的建議

在 watchOS 3 的新功能中,類別 NSUserActivity 包含 MapItem 屬性,可讓開發人員提供可在其他內容中使用的位置資訊。 例如,如果應用程式顯示餐廳評論,開發人員可以將 屬性設定 MapItem 為使用者在應用程式中檢視之餐廳的位置。 如果使用者切換至 地圖 應用程式,則餐廳的位置會自動提供。

如果應用程式支援應用程式搜尋,則可以使用 類別的新位址元件 CSSearchableItemAttributesSet 來指定使用者可能想要流覽的位置。 藉由設定 MapItem 屬性,其他屬性會自動填入。

除了設定 LatitudeLongitude 位址元件屬性之外,建議應用程式也提供 NamedLocationPhoneNumbers 屬性,因此 Siri 可以起始對位置的呼叫。

關係型 Siri 提醒

允許使用者使用 Siri 快速提醒,以在稍後的應用程式中檢視他們目前在應用程式中檢視的內容。 例如,如果他們在應用程式中觀看餐廳評論,他們可以叫用 Siri,並說 「當我回家時提醒我這件事」。 Siri 會產生提醒,其中包含應用程式中檢閱的連結。

實作主動式建議

將主動式建議支援新增至 Xamarin.iOS 應用程式通常和實作幾個 API 一樣簡單,或擴充應用程式可能已經實作的幾個 API。

主動式建議會以三種主要方式與應用程式搭配使用:

  • NSUserActivity - 協助系統了解使用者目前在螢幕上使用的資訊。
  • 位置建議 - 如果應用程式提供或取用以位置為基礎的信息,這些 API 延伸模組會提供新的方式,跨應用程式共用此資訊。

並且藉由實作下列專案,在應用程式中受到支援:

  • 內容相關 Siri 提醒 - 在 iOS 10 中, NSUserActivity 已擴充為允許 Siri 快速提醒,以檢視他們目前在應用程式中檢視的內容,稍後日期。
  • 位置建議 - iOS 10 增強 NSUserActivity 功能,以擷取應用程式內檢視的位置,並在整個系統的許多位置推廣這些位置。
  • 內容相關 Siri 要求 - NSUserActivity 會提供內容給 Siri 應用程式內呈現的資訊,讓使用者可以從應用程式內取得指示或撥打通話。

所有這些功能都有一個共同點,它們全都以一種形式或另一種形式使用 NSUserActivity 來提供其功能。

NSUserActivity

如上所述, NSUserActivity 協助系統了解使用者目前在螢幕上使用的資訊。 NSUserActivity 是輕量狀態快取機制,可擷取使用者在瀏覽應用程式時的活動。 例如,查看餐廳應用程式:

餐廳應用程式

使用下列互動:

  1. 當使用者與應用程式搭配使用時, NSUserActivity 會建立 ,以稍後重新建立應用程式的狀態。
  2. 如果使用者搜尋餐廳,則會遵循相同的建立活動模式。
  3. 同樣地,當用戶檢視結果時。 在此最後一個案例中,使用者正在檢視位置,而且在iOS 10中,系統會更瞭解某些概念(例如位置或通訊互動)。

仔細看看最後一個畫面:

NSUserActivity 承載

在這裡,應用程式正在建立 NSUserActivity ,並已填入資訊,以便稍後重新建立狀態。 應用程式也包含一些元數據,例如位置的名稱和位址。 建立此活動之後,應用程式可讓iOS知道它代表使用者的目前狀態。

然後,應用程式會決定活動是否會透過無線方式公告 Handoff,並儲存為位置建議的暫存值,或新增至裝置上的焦點索引,以在搜尋結果中顯示。

如需遞交和焦點搜尋的詳細資訊,請參閱我們的 遞交 簡介和 iOS 9新的搜尋API 指南。

建立活動

建立活動之前,必須建立活動類型標識元才能識別它。 活動類型標識碼是新增至 NSUserActivityTypes 應用程式 Info.plist 檔案數位的簡短字串,用來唯一識別指定的用戶活動類型。 應用程式支援並公開給應用程式搜尋的每個活動,陣列中將會有一個專案。 如需詳細資訊,請參閱建立 活動類型標識元參考

檢視活動的範例:

// 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();

如果開發人員的網站能夠顯示與應用程式相同的資訊,應用程式可以包含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 的資訊,將狀態還原回用戶離開的位置。

建立活動的優點

在上述程式代碼數量最少的情況下,應用程式現在能夠利用三個新的 iOS 10 功能:

  • Handoff
  • 焦點搜尋
  • 關係型 Siri 提醒

下一節將探討如何啟用另外兩個新的 iOS 10 功能:

  • 位置建議
  • 關係型 Siri 要求

以位置為基礎的建議

以上述餐廳搜尋應用程式的範例為例。 如果已實 NSUserActivity 作並正確填入所有元資料和屬性,使用者就能夠執行下列動作:

  1. 在應用程式中尋找想要與朋友見面的餐館。
  2. 如果使用者切換至 地圖 應用程式,餐廳的位址會自動建議為目的地。
  3. 這甚至適用於第三方應用程式(支援 NSUserActivity),因此使用者也可以切換至拼車應用程式,並自動建議餐廳位址作為目的地。
  4. 它也提供 Siri 的內容,讓使用者可以在餐廳應用程式內叫用 Siri,並詢問 「取得指示...」 ,Siri 會提供使用者正在檢視之餐廳的指示。

上述所有功能都有一個共同點,它們都表示建議原本來自何處。 在上述範例中,它是虛構的餐館評論應用程式。

watchOS 3 已增強,可透過數個小修改和現有架構的新增功能,為應用程式啟用此功能:

  • NSUserActivity 有其他欄位可用來擷取應用程式內檢視的位置資訊。
  • MapKit 和 CoreSpotlight 已新增數項以擷取位置。
  • 位置感知功能已新增至 Siri、地圖、多任務處理和其他系統中的應用程式。

若要實作以位置為基礎的建議,請從上述相同的活動程序代碼開始:

// 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;

活動最佳做法

使用活動時,Apple 會建議下列最佳做法:

  • 用於 NeedsSave 延遲承載更新。
  • 請務必保留目前活動的強式參考。
  • 只傳輸包含足夠資訊以還原狀態的小型承載。
  • 請確定活動類型識別碼是唯一且描述性的,方法是使用反向 DNS 表示法來指定它們。

取用位置建議

下一節將討論取用來自系統其他部分的位置建議(例如 地圖 應用程式)或其他第三方應用程式。

路由應用程式和位置建議

本節將探討直接從路由應用程式內取用位置建議。 若要讓路由應用程式新增這項功能,開發人員會利用現有的 MKDirectionsRequest 架構,如下所示:

  • 在多任務處理中升級應用程式。
  • 將應用程式註冊為路由應用程式。
  • 使用 MapKit MKDirectionsRequest 物件處理啟動應用程式。
  • 讓 watchOS 能夠瞭解如何根據用戶參與來建議應用程式。

當應用程式開始使用 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);

watchOS 3 的新功能,應用程式可以傳送沒有地理座標的位址,這會導致開發人員需要編碼位址:

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

});

摘要

本文涵蓋主動式建議,並示範開發人員如何使用它們將流量導向 Xamarin.iOS 應用程式以進行 watchOS。 其中涵蓋實作主動式建議並呈現使用指導方針的步驟。