上一讲,我们介绍了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. WebAPI的初步认识(CURD)

    1.创建一个MVC项目,选择API 2.在Models层里添加Product类,IProductRepository接口,ProductRepository类 public class Product ...

  2. OpenSource.organization-in-github

    1. gosquared https://github.com/gosquared 2. slack https://github.com/slackhq 3. The New York Times ...

  3. Web程序的运行原理及流程(二)

    其实WEB服务器和WEB应用服务器这两个概念特别容易混淆  可以理解为装了不同软件(服务)的两台计算机(服务器)吧 先对两个概念做一个简单介绍 了解了基本的概念 我们再用两个典型的例子做一下比较(建立 ...

  4. 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验

    实验内容 1.配置环境 2.使用vi 编辑器阅读理解源码 2.编译应用程序 运行 make 产生可执行文件httpd 3.下载调试 使用 NFS 服务方式将HTTPD 下载到开发板上,并拷贝测试用的网 ...

  5. 说说Statement、PreparedStatement和CallableStatement的异同(转)

    1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wrapper.PreparedStatem ...

  6. ios页面弹出方式《笔记》

    1.presentViewController 方式,动画效果是从底部弹出,主要用在除导航类页面的弹出 let anotherVC = UIStoryboard(name: "Main&qu ...

  7. silverLight--绑定数据dataGrid

    后台代码编写 ,为表格绑定数据: using System; using System.Collections.Generic; using System.Linq; using System.Net ...

  8. 跟我学-Java底层技术系列文章

    对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库  HashCode深入理解 java线程框架窥探 2.集合类     java枚举类使用 递归 ...

  9. 正确获得android设备的IP地址

    网上此类获得android设备IP地址相关的文章有不少,有一篇是比较通用的,但有一个问题:有些设备默认的是IPv6的地址,那段代码获得的就是IPv6的地址.但这显然不是我们想要的,我们需要的是IPv4 ...

  10. php设计模式--单例模式

    单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式是一种常见的设计模式,在计算机系统中,线程池.缓 ...