小娜作為我們的全能秘書,能夠幫我們設置提醒、推薦新聞、查詢天氣、聊天講段子,現在還能幫助我們追蹤快遞,大家可以移步微軟小娜懶癌支持中心閱讀相關軟文,不想移步的朋友也可以通過下面的動圖來了解一下效果,看一下Win10上的網購剁手之旅是如何的更加舒適省心。

(以此動圖來向熱心博主瘋狂的懶羊羊表示感謝,該博主向我們推薦了ScreenToGif,使我們的博客更生動)
如何在我們的應用/網站中集成“小娜追蹤快遞”功能呢?
這和把大象裝在冰箱一樣簡單,只需要三步:1)打開IDE,加載工程;2)加入包含ms-cortana://InterestTracking Deep-link的HyperLink或者Button控件;3)編譯部署,把IDE關上。
沒學會?!好吧,我們還是更詳細的講一下。第一步和第三步就不說了,主要說一下第二步。
首先我們來看一下小娜Deep-link的格式,如下圖:

參數部分是URL編碼過的Json串,該Json對象是一個數組,數組中的元素包含以下屬性:
| 屬性名 | 注釋 | 類型 |
| type | 目前該屬性值固定為package | string |
| CarrierName | 快遞公司名稱 | string |
| TrackingNumber | 快遞單號 | string |
可以使用如下代碼得到Deep-link字符串:
public class MailPackage { public string type { get; set; } public string TrackingNumber { get; set; } public string CarrierName { get; set; } } public string GenerateCortanaDeepLink(string carrierName, string trackingNumber) { if (string.IsNullOrWhiteSpace(carrierName) || string.IsNullOrWhiteSpace(trackingNumber)) { return null; } // JSON對象 IList<MailPackage> mailPackages = new List<MailPackage>(); MailPackage mailPackage = new MailPackage { type = "package", TrackingNumber = trackingNumber, CarrierName = carrierName }; mailPackages.Add(mailPackage); // 序列化 var serializer = new DataContractJsonSerializer(typeof(List<MailPackage>)); var stream = new MemoryStream(); serializer.WriteObject(stream, mailPackages); byte[] dataBytes = new byte[stream.Length]; stream.Position = 0; stream.Read(dataBytes, 0, (int)stream.Length); string dataString = Encoding.UTF8.GetString(dataBytes); // Url encode string encodeData = System.Net.WebUtility.UrlEncode(dataString); // DeepLink string url = string.Format("ms-cortana://InterestTracking?parameter={0}", encodeData); return url; }
有了Deep-link后,我們有多種方式來使用
在網頁中,將Deep-link作為一個超鏈接來使用就可以
<a href="ms-cortana://InterestTracking?parameter={URL encoded package info JSON string}">Tell Cortana</a>
在UWP應用中,如果你使用的是HyperlinkButton,在XAML中你可以這樣用
<HyperlinkButton NavigateUri="ms-cortana://InterestTracking?parameter={URL encoded package info JSON string}" />
如果你使用其它控件,你可以在其點擊事件處理中加入如下代碼
Windows.System.Launcher.LaunchUriAsync("ms-cortana://InterestTracking?parameter={URL encoded package info JSON string}");
另外需要提到一點,使用Deep-link的方式來讓小娜追蹤快遞,是在14332之后的預覽版才有的功能。淘寶、旺信在發布時考慮到有的用戶沒有升級預覽版,但也有的用戶可以提前嘗鮮新功能並給我們反饋改進意見,所以在代碼中加入了對系統版本的判斷,只有系統達到一定版本才能看到追蹤快遞這個按鈕。下面提供兩個關於版本號處理的函數,供大家參考。
一個是將當前系統版本號取出並轉為字符串:
public static string GetOperatingSystemVersion() { string sv = AnalyticsInfo.VersionInfo.DeviceFamilyVersion; ulong v = ulong.Parse(sv); ulong v1 = (v & 0xFFFF000000000000L) >> 48; ulong v2 = (v & 0x0000FFFF00000000L) >> 32; ulong v3 = (v & 0x00000000FFFF0000L) >> 16; ulong v4 = v & 0x000000000000FFFFL; string version = $"{v1}.{v2}.{v3}.{v4}"; return version; }
另一個是輸入一個版本號,得到對應的ulong值,方便與系統版本號AnalyticsInfo.VersionInfo.DeviceFamilyVersion比較大小:
public static ulong GenerateUlongFromVersion(ushort Major, ushort Minor, ushort Build, ushort Revision) { return ((ulong)Major << 48) + ((ulong)Minor << 32) + ((ulong)Build << 16) + ((ulong)Revision); }
是不是很簡單啊,有沒有很想體驗一下啊,快來加入Windows預覽體驗吧,然后自己動手試一試!示例代碼可點此下載。
當然,小娜的這個功能還沒有正式Release,可能會存在一些Bug。比如我們在內部試用時就發現不同數據源過來的快遞公司名稱不一致,有的是圓通快遞,有的卻是圓通速遞。針對此,小娜團隊積極應對,對能收集到的快遞公司名作了對應的映射關系,使得常見的快遞公司的不同叫法都可以匹配到正確的記錄。
如果各位博主在使用中發現任何問題,歡迎積極的給我們留言。另外,如果你對這個功能有任何好的建議或期望,也請告訴我們,萬一哪天實現了呢。
