腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件。腾讯QQ支持在线聊天、视频通话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ邮箱等多种功能,并可与多种通讯终端相连。2015年,QQ继续为用户创造良好的通讯体验!其标志是一只戴着红色围巾的小企鹅。
QQPlus 原生插件是 qq 原生插件的升级版,开放平台的移动端 SDK,开发者集成此原生插件可以实现登陆、获取用户信息、分享内容到 QQ 客户端等功能。登陆授权时,原生插件内部会先判断当前设备是否已安装 QQ 客户端,若没安装则弹出网页版登陆页面,若已安装则跳转到 QQ 客户端提示用户登陆授权。
开发者使用本原生插件之前需要先到腾讯开放平台申请开发者账号,并在账号内填写相应信息创建自己的 APP,从而获取 APP ID。详情参考腾讯开放平台应用接入新手指引
使用此原生插件之前需先配置config文件的Feature,方法如下:
<feature name="QQPlus">
<param name="urlScheme" value="tencent101064640" />
<param name="apiKey" value="101064640" />
</feature>
字段描述:
urlScheme:(必须配置)用于实现应用间跳转及数据交换,本应用可以启动QQ客户端,也可以从QQ客户端跳回本应用。urlScheme 的 value 值是从腾讯开放平台获取的 APP ID 与 tencent 拼接而成。APP ID 申请方法参考腾讯开放平台应用接入简介。
apiKey:(必须配置)从腾讯开放平台获取的 APP ID,申请方法参考腾讯开放平台应用接入简介。
**关于 Universal Link **
Universal Links(通用链接),是苹果在iOS9之后,提供的一种“通过传统HTTP链接来跳转APP”的能力。该特性相较于传统的Custom URL Scheme方式,具备唯一、安全、私有和简单的优势。
如何使用
创建 entitlements 文件,Yonbuilder 移动开发平台上的开发者,可通过此文件告诉编译服务器开通 Associated Domain 功能。配置方法参考论坛帖子。配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:developer.yonyou.com</string>
</array>
</dict>
</plist>
其中 com.apple.developer.associated-domains 对应的值applinks:developer.yonyou.com 是配置的你的应用的
开通 Associated Domains。 登录苹果开发者账号,在左侧列表里找到 Identifiers,选中后再找到你的 Bundle ID (包名),选中该包名,配置开启其 Associated Domains 功能。如下下图所示:
服务器端支持苹果 Universal Links。支持方法参考 论坛帖子。
创建自己的Universal Links服务, 可参见苹果官方文档Support Universal Links
互联官网注册自己的Universal Links链接并必须校验通过,可参见互联官网操作指引
// 在调用互联SDK相关功能接口之前,需要应用在确认用户已授权应用获取设备信息后,调用下面代码通知 SDK:
setIsPermissionGranted({
granted:true
});
// 如果未调用该接口或传参为false时,调用其它功能接口将直接返回失败。
通知sdk是否获得获取手机信息的权限
setIsPermissionGranted({params})
granted:
var qq = api.require('QQPlus');
qq.setIsPermissionGranted({
granted:true
});
iOS系统,Android系统
可提供的1.1.9及更高版本
判断当前设备是否安装了 QQ 客户端
注:在高版本的iPhone手机上,需要配置
<preference name="querySchemes" value="mqq,mqqapi"/>
installed(callback(ret))
ret:
{
status: //布尔类型;是否安装了 QQ 客户端
}
var qq = api.require('QQPlus');
qq.installed(function(ret, err) {
if (ret.status) {
api.alert({ msg: "安装" });
} else {
api.alert({ msg: "没有安装" });
}
});
iOS系统,Android系统
可提供的1.0.2及更高版本
登陆qq
login({parmas},callback(ret, err))
apiKey:
ret:
{
status: true, //布尔类型;操作成功状态值
accessToken:'', //字符串类型;返回token
openId:'' //字符串类型;返回openID
eventType:'', //字符串类型;只有iOS端返回unionid时有值didGetUnionID
unionid:'' //字符串类型;QQ用户的统一标示,对当前开发者账号唯一,iOS端仅当eventType为didGetUnionID时有值
//必须先通过邮件向腾讯官方申请,获取权限,否则unionID无法获取,申请邮箱:connect@qq.com
//详情参考:http://www.jianshu.com/p/5775fcead59b
}
err:
{
msg:'' //字符串类型;错误描述
}
var qq = api.require('QQPlus');
qq.login(function(ret, err) {
api.alert({
title: 'id和token',
msg: ret.openId + ret.accessToken
});
});
iOS系统,Android系统
可提供的1.0.0及更高版本
登出qq
logout(callback(ret, err))
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg:'' //字符串类型;错误描述
}
var qq = api.require('QQPlus');
qq.logout(function(ret, err) {
if (ret.status) {
api.alert({ msg: '登出成功' });
} else {
api.alert({ msg: err.msg });
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
获取用户信息
getUserInfo(callback(ret, err))
ret:
{
status: true, //布尔类型;操作成功状态值
info: //JSON对象;包含用户信息描述,内部字段如下:
// city :用户所在城市
// figureurl :空间小头像(30)地址
// figureurl_1 :空间中头像(50)地址
// figureurl_2 :空间大头像(100)地址
// figureurl_qq_1 :用户小头像(40)地址
// figureurl_qq_2 :用户大头像(100)地址
// gender :用户性别
// is_yellow_vip :是否为黄钻用户
// level :用户账号级别
// nickname :用户昵称
// province :用户所在省份
// yellow_vip_level :用户账户黄钻等级
}
err:
{
msg:'' //字符串类型;错误描述
}
var qq = api.require('QQPlus');
qq.getUserInfo(function(ret, err) {
if (ret.status) {
api.alert({ msg: JSON.stringify(ret) });
} else {
api.alert({ msg: err.msg });
}
});
iOS系统,Android系统
可提供的1.0.1及更高版本
分享纯文本到手机 QQ(空间、群聊、讨论组、好友),在 android 平台上此接口无回调,在 iOS 平台分享成功无回调
shareText({params}, callback(ret, err))
text:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg: '', //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
var qq = api.require('QQPlus');
qq.shareText({
text: 'testtext'
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
分享单张本地图片到 QQ 空间或 QQ 好友、讨论组、群聊
shareImage({params}, callback(ret, err))
type:
imgPath:
title:
description:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg:'' //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
var qq = api.require('QQPlus');
qq.shareImage({
type : 'QZone',
imgPath: 'widget://res/img.png'
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
分享新闻到 QQ 空间或 QQ 好友、讨论组、群聊
shareNews({params}, callback(ret, err))
url:
title:
description:
imgUrl:
type:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg:'' //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
var qq = api.require('QQPlus');
qq.shareNews({
url: 'http://www.uzmap.com',
title: '新闻分享',
description: '新闻描述',
imgUrl: 'http://upload.wabei.cn/2011/0807/20110807025817844.jpg'
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
分享音乐到QQ 空间或 QQ 好友、讨论组、群聊
shareMusic({params}, callback(ret, err))
audioUrl:
targetUrl:
title:
description:
imgUrl:
type:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg:'' //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
var qq = api.require('QQPlus');
qq.shareMusic({
audioUrl: 'http://7xq864.com1.z0.glb.clouddn.com/builder/591bde468d4e44b21cc225b7b6e1129a.mp3',
targetUrl: 'http://douban.fm/?start=8508g3c27g-3&cid=-3',
title: '桔子香水',
description: '任贤齐',
imgUrl: 'http://upload.wabei.cn/2011/0807/20110807025817844.jpg'
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
分享本地视频到 QQ 空间
shareVideo({params}, callback(ret, err))
videoUrl:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg: '', //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
示例代码
var qq = api.require('QQPlus');
qq.shareVideo({
videoUrl: 'fs://video.mp4'
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
//iOS测试代码
var UIMediaScanner = api.require('UIMediaScanner');
UIMediaScanner.open({
type: 'video',
column: 4,
classify: true,
max: 4,
sort: {
key: 'time',
order: 'desc'
},
texts: {
stateText: '已选择*项',
cancelText: '取消',
finishText: '完成'
},
styles: {
bg: '#fff',
mark: {
icon: '',
position: 'bottom_left',
size: 20
},
nav: {
bg: '#eee',
stateColor: '#000',
stateSize: 18,
cancelBg: 'rgba(0,0,0,0)',
cancelColor: '#000',
cancelSize: 18,
finishBg: 'rgba(0,0,0,0)',
finishColor: '#000',
finishSize: 18
}
},
exchange: true,
rotation: true
}, function(ret) {
if (ret) {
var video = ret.list[0];
var qq = api.require('QQPlus');
qq.shareVideo({
videoUrl: video.path,
title: "hello! test."
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本
发表说说到 QQ 空间
shareMood({params}, callback(ret, err))
summary:
imgUrls:
ret:
{
status: true //布尔类型;操作成功状态值
}
err:
{
msg:'' //字符串类型;错误描述
code: 0 //数字类型;错误码,错误码说明:
0:EQQAPISENDSUCESS
1:EQQAPIQQNOTINSTALLED
2:EQQAPIQQNOTSUPPORTAPI
3:EQQAPIMESSAGETYPEINVALID
4:EQQAPIMESSAGECONTENTNULL
5:EQQAPIMESSAGECONTENTINVALID
6:EQQAPIAPPNOTREGISTED
7:EQQAPIAPPSHAREASYNC
-1:EQQAPISENDFAILD
-4:用户取消分享
10000:qzone分享不支持text类型分享
10001:qzone分享不支持image类型分享
10002:当前QQ版本太低,需要更新至新版本才可以支持
}
示例代码
var qq = api.require('QQPlus');
qq.shareMood({
summary: '测试分享说说',
imgUrls: ['fs://img1.jpg','fs://img2.jpg']
},function(ret,err){
if (ret.status){
alert("分享成功!");
} else {
api.alert({msg: JSON.stringify(err)});
}
});
iOS系统,Android系统
可提供的1.0.0及更高版本