上一講,咱們介紹了QQ SDK的使用方法,請看《【Win10 UWP】QQ SDK(一):SDK基本使用方法》html
從前面的介紹中咱們知道,咱們的應用和QQ客戶端之間須要經過文件類型和協議關聯進行互調。咱們須要調起QQ客戶端進行分享或受權,同時QQ分享完成或受權完成以後,也須要調起咱們的應用進行回調通知,把結果告訴咱們的應用。數據庫
<uap:Extension Category="windows.fileTypeAssociation"> <uap:FileTypeAssociation Name="test"> <uap:SupportedFileTypes> <uap:FileType ContentType="application/qqsdkconnect">.qc-xxxxxxxxxx</uap:FileType> </uap:SupportedFileTypes> </uap:FileTypeAssociation> </uap:Extension>
看一下咱們在Package.appxmanifest裏進行的文件類型關聯聲明,聲明瞭一種.qc-xxxxxxxxxx(其中xxx爲你的AppId),表示我當前的應用可以打開這種後綴格式的文件,從而也就實現把個人應用調起來;顯而易見,QQ客戶端在回調的時候會生成這種後綴格式的文件,而且咱們注意到在分享成功以後,QQ客戶端會提示是否「返回應用」,當點擊了「返回應用」,至關於QQ客戶端想要打開這個文件;因爲AppId的惟一性,能保證這個文件只能用個人應用打開;咱們的應用打開這個文件後,就能讀取這個文件的內容並講結果進行解析啦。windows
經過文件類型關聯打開這個文件以後,在App.cs裏,protected override void OnFileActivated(FileActivatedEventArgs args)方法會被觸發,讀取args.Files[0]這個文件的內容進行解析便可。app
QQSDK類提供CanHandleWindowsFileTypeAssociation(IStorageFile file)方法和HandleOpenWindowsFileTypeAssociation(IStorageFile file)方法分別用來判斷文件是否可解析,而且解析文件的內容。處理結果返回一個ResponseResult類型的對象,這就是咱們要的回調結果了。async
<uap:Extension Category="windows.protocol"> <uap:Protocol Name="qc-xxxxxxxxxx" /> </uap:Extension>
協議關聯比較簡單,聲明一個qc-xxxxxxxxxx的協議,QQ客戶端在「返回應用」的時候也能夠經過Launcher.LaunchUriAsync(new Uri("qc-xxxxxxxxxxx"))的方法把咱們的應用調起來,在App.cs裏,protected override async void OnActivated(IActivatedEventArgs args)方法會被觸發,回調內容附帶在args.Uri中。ide
因爲觸發Activated的場景比較多(除了Protocol外),須要判斷一下args.Kind是否爲ActivationKind.Protocol纔可進行處理。學習
QQSDK類提供CanHandleWindowsProtocolUri(string uri)方法和HandleOpenWindowsProtocolUri(string uri)方法分別用來判斷協議是否可解析,而且解析協議的內容。處理結果一樣返回一個ResponseResult類型的對象,這就是咱們要的回調結果了。spa
這二者的區別只是在於回調結果數據量較大時,QQ客戶端以文件類型回調(如登陸受權、調用Open API等情形),數據量較小時(如分享)只須要以協議形式回調。實際上,我認爲QQ SDK只須要統一使用文件類型關聯就足夠了。code
QQ SDK回調的處理仍是須要很多代碼量的,若是每一個項目都要寫這些重複代碼實際上是比較煩的。這裏我寫了一個擴展輔助ConnectQQSDK.Extensions,將全部的回調處理都進行了封裝,只須要簡單調用便可。htm
ConnectQQSDK.Extensions庫nuget下載地址:https://www.nuget.org/packages/ConnectQQSDK.Extensions/1.0.0
或者控制檯輸入PM> Install-Package ConnectQQSDK.Extensions
在App.cs的OnLaunched方法裏,調用封裝過的初始化方法
QQSDKHelper.Initialize("xxxxxxxxxx", new QQCallback());
其中QQCallback是一個繼承了ConnectWPQQSDK.Extensions.IQQSDKCallback接口的類型,對於回調結果,用本身的應用認爲合適的方法進行顯示或存儲。好比分享的回調結果,能夠本身用Toast或MessageDialog顯示出來;好比登陸受權的回調結果,能夠本身存儲在獨立存儲或本地數據庫中。Do It Yourself!
public class QQCallback : IQQSDKCallback { public void OnHandleResult(ResponseResult result) { switch (result.OpenType) { case SDKOpenMessageType.eMessageTypeAuth:
// 登陸受權結果,反序列化result.ResultMsg獲得Token、OpenId、過時時間等信息 break; case SDKOpenMessageType.eMessageTypeShare:
// ToastPrompt.Show(result.ResultCode == ResponseRetCode.SUCCESS ? "分享成功": "分享失敗"); break; case SDKOpenMessageType.eMessageTypeOpenAPI:
// OpenAPI結果,反序列化result.ResultMsg獲得相應信息,具體返回值請查看Open API官方文檔 break; } } }
反序列能夠用Json.Net或系統自帶的DataContractJsonSerializer,再也不多說。
在App.cs的OnActivated方法裏:
protected override async void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); await QQSDKHelper.OnActicated(args); }
在OnFileActivated方法裏:
protected override async void OnFileActivated(FileActivatedEventArgs args) { base.OnFileActivated(args); await QQSDKHelper.OnFileActivated(args); }
以上就是在應用裏須要添加的代碼,比起本身去處理SDK的回調結果要簡單不少。
QQSDKHelper.cs源碼
public static class QQSDKHelper { public static void Initialize(string appId, IQQSDKCallback callback = null) { AppId = appId; Callback = callback; QQSDK.Instance.Initialize(appId); } public static async Task OnActicated(IActivatedEventArgs e) { try { if (e.Kind == ActivationKind.Protocol) { var frame = Window.Current.Content as Frame; if (frame == null) { return; } var protocalArgs = (ProtocolActivatedEventArgs) e; if (protocalArgs.Uri == null) { return; } if (protocalArgs.Uri.Scheme.Equals($"qc-{AppId}")) { if (QQSDK.Instance.CanHandleWindowsProtocolUri(protocalArgs.Uri.ToString())) { var result = await QQSDK.Instance.HandleOpenWindowsProtocolUri(protocalArgs.Uri.ToString()); HandleResult(result); } } } } catch (Exception) { // ignored } } public static async Task OnFileActivated(FileActivatedEventArgs e) { try { var file = e.Files?.FirstOrDefault() as IStorageFile; if (file == null) { return; } if (QQSDK.Instance.CanHandleWindowsFileTypeAssociation(file)) { var result = await QQSDK.Instance.HandleOpenWindowsFileTypeAssociation(file); HandleResult(result); } } catch (Exception) { // ignored } } private static void HandleResult(ResponseResult result) { Callback?.OnHandleResult(result); } public static IQQSDKCallback Callback { get; private set; } public static string AppId { get; private set; } }
IQQSDKCallback.cs源碼
public interface IQQSDKCallback { void OnHandleResult(ResponseResult result); }
本文僅用於學習交流,轉載請註明出處:http://www.cnblogs.com/zhxilin/p/4664093.html