【Win10 UWP】QQ SDK(二):SDK的回調處理


上一講,我們介紹了QQ SDK的使用方法,請看《【Win10 UWP】QQ SDK(一):SDK基本使用方法》

 

一. 回調的基本形式

從前面的介紹中我們知道,我們的應用和QQ客戶端之間需要通過文件類型和協議關聯進行互調。我們需要調起QQ客戶端進行分享或授權,同時QQ分享完成或授權完成之后,也需要調起我們的應用進行回調通知,把結果告訴我們的應用。

1. 文件類型關聯

<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的唯一性,能保證這個文件只能用我的應用打開;我們的應用打開這個文件后,就能讀取這個文件的內容並講結果進行解析啦。

通過文件類型關聯打開這個文件之后,在App.cs里,protected override void OnFileActivated(FileActivatedEventArgs args)方法會被觸發,讀取args.Files[0]這個文件的內容進行解析即可。

QQSDK類提供CanHandleWindowsFileTypeAssociation(IStorageFile file)方法和HandleOpenWindowsFileTypeAssociation(IStorageFile  file)方法分別用來判斷文件是否可解析,並且解析文件的內容。處理結果返回一個ResponseResult類型的對象,這就是我們要的回調結果了。

 

2. 協議關聯

<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中。

由於觸發Activated的場景比較多(除了Protocol外),需要判斷一下args.Kind是否為ActivationKind.Protocol才可進行處理。

QQSDK類提供CanHandleWindowsProtocolUri(string uri)方法和HandleOpenWindowsProtocolUri(string uri)方法分別用來判斷協議是否可解析,並且解析協議的內容。處理結果同樣返回一個ResponseResult類型的對象,這就是我們要的回調結果了。

 

這兩者的區別只是在於回調結果數據量較大時,QQ客戶端以文件類型回調(如登錄授權、調用Open API等情形),數據量較小時(如分享)只需要以協議形式回調。實際上,我認為QQ SDK只需要統一使用文件類型關聯就足夠了。

 

二. QQ SDK擴展輔助

QQ SDK回調的處理還是需要不少代碼量的,如果每個項目都要寫這些重復代碼其實是比較煩的。這里我寫了一個擴展輔助ConnectQQSDK.Extensions,將所有的回調處理都進行了封裝,只需要簡單調用即可。

ConnectQQSDK.Extensions庫nuget下載地址:https://www.nuget.org/packages/ConnectQQSDK.Extensions/1.0.0

或者控制台輸入PM> Install-Package ConnectQQSDK.Extensions

 

1. 初始化方法

在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,不再多說。

 

2. 文件關聯和協議關聯處理

在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的回調結果要簡單很多。

 

三. QQ 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM