Xamarin 中的 watchOS 主動式建議
本文說明如何在 watchOS 3 應用程式中使用主動式建議來推動參與,方法是讓系統自動向用戶呈現有用的資訊。
觀看OS 3的新功能:主動式建議會藉由在適當時間主動向用戶呈現有用的資訊,以向使用者呈現與 Xamarin.iOS 應用程式互動的新聞方式。
關於主動式建議
watchOS 3 的新功能包含MapItem
屬性,NSUserActivity
可讓應用程式提供可用於其他內容的位置資訊。 例如,如果應用程式顯示旅館評論並提供MapItem
位置,如果使用者切換至 地圖 應用程式,他們剛檢視的旅館位置就可供使用。
應用程式會使用 、MapKit、媒體播放器 和 UIKit 等NSUserActivity
技術集合,向系統公開此功能。 此外,藉由為應用程式提供主動式建議支援,可免費取得更深入的 Siri 整合。
以位置為基礎的建議
在 watchOS 3 的新功能中,類別 NSUserActivity
包含 MapItem
屬性,可讓開發人員提供可在其他內容中使用的位置資訊。 例如,如果應用程式顯示餐廳評論,開發人員可以將 屬性設定 MapItem
為使用者在應用程式中檢視之餐廳的位置。 如果使用者切換至 地圖 應用程式,則餐廳的位置會自動提供。
如果應用程式支援應用程式搜尋,則可以使用 類別的新位址元件 CSSearchableItemAttributesSet
來指定使用者可能想要流覽的位置。 藉由設定 MapItem
屬性,其他屬性會自動填入。
除了設定 Latitude
和 Longitude
位址元件屬性之外,建議應用程式也提供 NamedLocation
和 PhoneNumbers
屬性,因此 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
是輕量狀態快取機制,可擷取使用者在瀏覽應用程式時的活動。 例如,查看餐廳應用程式:
使用下列互動:
- 當使用者與應用程式搭配使用時,
NSUserActivity
會建立 ,以稍後重新建立應用程式的狀態。 - 如果使用者搜尋餐廳,則會遵循相同的建立活動模式。
- 同樣地,當用戶檢視結果時。 在此最後一個案例中,使用者正在檢視位置,而且在iOS 10中,系統會更瞭解某些概念(例如位置或通訊互動)。
仔細看看最後一個畫面:
在這裡,應用程式正在建立 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
作並正確填入所有元資料和屬性,使用者就能夠執行下列動作:
- 在應用程式中尋找想要與朋友見面的餐館。
- 如果使用者切換至 地圖 應用程式,餐廳的位址會自動建議為目的地。
- 這甚至適用於第三方應用程式(支援
NSUserActivity
),因此使用者也可以切換至拼車應用程式,並自動建議餐廳位址作為目的地。 - 它也提供 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。 其中涵蓋實作主動式建議並呈現使用指導方針的步驟。