上一讲,我们介绍了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

【Win10 UWP】QQ SDK(二):SDK的回调处理的更多相关文章

  1. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

  2. 【Win10 UWP】微信SDK基本使用方法和基本原理

    上回讲到,作为一个长期散播温暖,散播希望的小清新无公害WP开发者,继QQ SDK之后,又把UWP微信SDK这茬了结了,仅供学习交流. 1.安装微信SDK for UWP 微信官方此前明确说明短时间内暂 ...

  3. 分享QQ第三方登陆SDK

    主要是考虑到QQ的PHP SDK写的真是太烂了,纯属是普及API知识,而不是到手就可以部署的类库..反正自己都写了一个了,就拿出来分享下.. 什么也不多说,直接上代码. Qq_sdk.php < ...

  4. QQ登录-第三方SDK的接入总结(搜索 qq互联)

    由于项目的需要,使用了[QQ登录]SDK 的相关功能!   1.集成[QQ登录]SDK   [QQ登录]SDK下载地址: http://wiki.open.qq.com/wiki/website/SD ...

  5. QQ登录-第三方SDK的接入总结

    由于项目的需要,使用了[QQ登录]SDK 的相关功能!   1.集成[QQ登录]SDK   [QQ登录]SDK下载地址: http://wiki.open.qq.com/wiki/website/SD ...

  6. PHP微信支付开发之扫描支付(模式二)后如何回调

    其实在写这篇文章的时候感觉自己已经落伍了,不过笔者在百度上搜索"微信支付开发之扫描支付(模式二)后如何回调"寻找答案时,发现依旧有很多朋友没有解决这个问题,所以就把自己的解决思路分 ...

  7. Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽

    Win10 UWP版<芒果TV>直播超女,芒果台综艺一网打尽 Win10版UWP<芒果TV>自2015年9月登录商店以来,一直在持续更新,积极改进,拥有芒果台视频的独家点播和直 ...

  8. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  9. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

随机推荐

  1. 粗略读完opengl

    清明节前粗略读完了opengl编程指南第七版,对opengl有了一个大体的了解,并且了解的也很肤浅.有了计算机图形学,线性代数的基础,读起来也不像以前那么吃力了.从简单的绘制点,直线,多边形,到视图变 ...

  2. asp.net下AjaxMethod的使用方法

    使用AjaxMethod可以在客户端异步调用服务端方法,简单地说就是在JS里调用后台.cs文件里的方法, 做一些JS无法做到的操作,如查询数据库 使用AjaxMethod要满足一下几点: 1.如果还没 ...

  3. OpenSSL Heartbleed原因小结

    User发送心跳报文给Server,Server复制心跳报文的内容回应User. memcpy(bp, p1, payload); Server拷贝心跳报文的内容给Client时,如果拷贝的字节数目超 ...

  4. Sharepoint创建List

    (一)在一个环境下创建site 首先在sharepoint 2013 Central Administration中run administration --Application Managemen ...

  5. aa3

    var geoCoordMap = { "海门":[121.15,31.89], "鄂尔多斯":[109.781327,39.608266], "招远 ...

  6. Goals100

    Start:2016.4.10 100天目标:jy_ai学习.swift.设计模式        以10天为周期,开始周会,执行内容:自我检讨本周期,并展望下一个周期:目标一:寻找高效方法.1.思考, ...

  7. php socket解决方案

    最近一直在为移动应用提供 php服务端api,以前 实时交互数据需求不严格(定时从手机端发送http请求),现在业务需求变更, 需要实时交互式接口,必须增加socket. 服务端框架使用YII 1.1 ...

  8. windows守护进程脚本

    通常通过进程名称或者端口号来判断进程是否正在运行.但是windows下进程名常常难以区分,比如有两个python脚本程序A和B同时在执行,进程名都是python.exe.若是通过端口来区分,却又只适用 ...

  9. Java实现Excel导入数据库,数据库中的数据导入到Excel

    private static void executeMethod(JobExecutionContext arg0) throws Exception{ try { TContrastService ...

  10. Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库问题 网上搜了下可以简单粗暴的用 D:\Qt\Qt5.6.0\5.6\msvc2015\bin ...