升级 1.1.0

This commit is contained in:
v7lin
2020-06-13 17:07:50 +08:00
parent 6f26e545e5
commit a429e546a9
8 changed files with 126 additions and 114 deletions

View File

@ -1,3 +1,8 @@
## 1.1.0 - 2020.06.13
* V2
* Android/iOS SDK
## 1.0.4 - 2019.12.16 ## 1.0.4 - 2019.12.16
* Android Q * Android Q

View File

@ -75,7 +75,8 @@ class _HomeState extends State<Home> {
ListTile( ListTile(
title: const Text('环境检查'), title: const Text('环境检查'),
onTap: () async { onTap: () async {
String content = 'tencent: ${await _tencent.isInstalled()}'; String content =
'QQ install: ${await _tencent.isQQInstalled()}\nTIM install: ${await _tencent.isTIMInstalled()}';
_showTips('环境检查', content); _showTips('环境检查', content);
}, },
), ),
@ -139,7 +140,7 @@ class _HomeState extends State<Home> {
title: const Text('文本分享'), title: const Text('文本分享'),
onTap: () { onTap: () {
_tencent.shareText( _tencent.shareText(
scene: TencentScene.SCENE_QZONE, scene: TencentScene.SCENE_QQ,
summary: '分享测试', summary: '分享测试',
); );
}, },

View File

@ -155,4 +155,20 @@ typedef void (^sendResultBlock)(NSDictionary *result);
\return iPhoneTIM下载地址 \return iPhoneTIM下载地址
*/ */
+ (NSString *)getTIMInstallUrl; + (NSString *)getTIMInstallUrl;
#pragma mark - Log
/*! @brief 调用此函数可以导出QQSDK的Log到第三方中用于定位问题
注意1:SDK会强引用这个block,注意不要导致内存泄漏,注意不要导致内存泄漏
注意2:调用过一次startLog by block之后如果再调用一次任意方式的startLoad,会释放上一次logBlock不再回调上一个logBlock
*
* @param logBlock 打印log的回调block
*/
+ (void)startLogWithBlock:(QQApiLogBolock)logBlock;
///停止回调打印
+ (void)stopLog;
///设置打印日志到文件开关on/off如果不设置默认不打印到文件
+ (void)setSwitchPrintLogToFile:(BOOL)on;
///日志文件目录
+ (NSString*)getLogFilePath;
@end @end

View File

@ -37,6 +37,7 @@ typedef NS_ENUM(NSInteger,QQApiSendResultCode) {
EQQAPIQZONENOTSUPPORTIMAGE = 10001, //qzone分享不支持image类型分享 EQQAPIQZONENOTSUPPORTIMAGE = 10001, //qzone分享不支持image类型分享
EQQAPIVERSIONNEEDUPDATE = 10002, //QQ版本太低 EQQAPIVERSIONNEEDUPDATE = 10002, //QQ版本太低
ETIMAPIVERSIONNEEDUPDATE = 10004, //TIM版本太低 ETIMAPIVERSIONNEEDUPDATE = 10004, //TIM版本太低
EAPPURLTYPESILLEGALITY = 20000, //(>=3.3.8)APP的info.plist中UrlTypes字段存在QQ的UrlScheme
}; };
#pragma mark - QQApiObject() #pragma mark - QQApiObject()
@ -66,6 +67,9 @@ typedef NS_ENUM(NSUInteger, MiniProgramType) {
MiniProgramType_Preview=4, // 预览版 MiniProgramType_Preview=4, // 预览版
}; };
/// 打印回调的block
typedef void(^QQApiLogBolock)(NSString *logStr);
// QQApiObject // QQApiObject
/** \brief 所有在QQ及插件间发送的数据对象的根类。 /** \brief 所有在QQ及插件间发送的数据对象的根类。
*/ */
@ -106,9 +110,16 @@ __attribute__((visibility("default"))) @interface QQApiMiniProgramObject : NSObj
//唤起小程序 - QQ 8.1.8 //唤起小程序 - QQ 8.1.8
__attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject __attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject
@property(nonatomic,retain) NSString* miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定 @property(nonatomic,retain) NSString* miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定
@property(nonatomic,retain) NSString* miniPath; //必填,小程序的展示路径 @property(nonatomic,retain) NSString* miniPath; //小程序的展示路径,不填展示默认小程序首页
@property(nonatomic,assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、开发版(0) @property(nonatomic,assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、开发版(0)
@end @end
//小程序唤起第三方 - SDK 3.3.9
__attribute__((visibility("default"))) @interface QQApiMiniProgramLaunchObject : QQApiObject
@property(nonatomic,copy) NSString* appParameter; //小程序带来的数据,透传
+ (instancetype)newWithAppParameter:(NSString*)parameter;
@end
// QQApiResultObject // QQApiResultObject
/** \brief 用于请求回应的数据类型。 /** \brief 用于请求回应的数据类型。
<h3>可能错误码及描述如下:</h3> <h3>可能错误码及描述如下:</h3>

View File

@ -164,8 +164,8 @@ typedef NS_ENUM(NSUInteger, TencentAuthMode) {
/** /**
* 初始化TencentOAuth对象 * 初始化TencentOAuth对象
* \param appId 第三方应用在互联开放平台申请的唯一标识 * \param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* \param delegate 第三方应用用于接收请求返回结果的委托对象 * \param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象 * \return 初始化后的授权登录对象
*/ */
- (id)initWithAppId:(NSString *)appId - (id)initWithAppId:(NSString *)appId
@ -173,15 +173,38 @@ typedef NS_ENUM(NSUInteger, TencentAuthMode) {
/** /**
* 初始化TencentOAuth对象>=3.3.7 * 初始化TencentOAuth对象>=3.3.7
* \param appId 第三方应用在互联开放平台申请的唯一标识 * \param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* \param universalLink 第三方应用在互联开放平台注册的universallink和bundleID一一对应 * \param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成universallink详见官网说明
* \param delegate 第三方应用用于接收请求返回结果的委托对象 * \param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象 * \return 初始化后的授权登录对象
*
****【使用说明】*****
* 1、支持BundleId与UniversalLink的一一对应主要目的“是为了解决应用的iPhone版本和iPad HD版本共用同一个AppId导致同时安装情况下的跳转问题"。
* 2 、由于手Q版本在 >=8.1.8 后才支持了这种对应方式所以一旦使用“务必做到”及时知会用户升级手Q版本。
****
*/ */
- (id)initWithAppId:(NSString *)appId - (id)initWithAppId:(NSString *)appId
andUniversalLink:(NSString *)universalLink andUniversalLink:(NSString *)universalLink
andDelegate:(id<TencentSessionDelegate>)delegate; andDelegate:(id<TencentSessionDelegate>)delegate;
/**
* 初始化TencentOAuth对象>=3.3.8
* \param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* \param enabled 默认为NO第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式启用后则在iOS9及以上的系统都会生效UniversalLink方式否则默认仅在iOS13及以上的系统生效UniversalLink方式。
* \param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成UniversalLink详见官网说明
* \param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象
*
*****【使用说明】*****
* 1、支持sdk与手Q的交互切换为UniversalLink模式主要目的"是为了避免手Q的UrlScheme被其他应用抢注后导致sdk接口功能受到影响"。
* 2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink所以一旦开启了enabled开关“务必做到”及时知会用户升级手Q版本。
*****
*/
- (id)initWithAppId:(NSString *)appId
enableUniveralLink:(BOOL)enabled
universalLink:(NSString *)universalLink
delegate:(id<TencentSessionDelegate>)delegate;
/** /**
* 判断用户手机上是否安装手机QQ * 判断用户手机上是否安装手机QQ
* \return YES:安装 NO:没安装 * \return YES:安装 NO:没安装

View File

@ -20,7 +20,6 @@ class Tencent {
static const String _METHOD_REGISTERAPP = 'registerApp'; static const String _METHOD_REGISTERAPP = 'registerApp';
static const String _METHOD_ISQQINSTALLED = 'isQQInstalled'; static const String _METHOD_ISQQINSTALLED = 'isQQInstalled';
static const String _METHOD_ISTIMINSTALLED = 'isTIMInstalled'; static const String _METHOD_ISTIMINSTALLED = 'isTIMInstalled';
static const String _METHOD_ISQQLITEINSTALLED = 'isQQLiteInstalled';
static const String _METHOD_LOGIN = 'login'; static const String _METHOD_LOGIN = 'login';
static const String _METHOD_LOGOUT = 'logout'; static const String _METHOD_LOGOUT = 'logout';
static const String _METHOD_SHAREMOOD = 'shareMood'; static const String _METHOD_SHAREMOOD = 'shareMood';
@ -77,16 +76,14 @@ class Tencent {
}) { }) {
assert(appId != null && appId.isNotEmpty); assert(appId != null && appId.isNotEmpty);
assert(!Platform.isIOS || universalLink == null); assert(!Platform.isIOS || universalLink == null);
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_APPID: appId, _METHOD_REGISTERAPP,
// _ARGUMENT_KEY_UNIVERSALLINK: universalLink, <String, dynamic>{
}; _ARGUMENT_KEY_APPID: appId,
if (universalLink?.isNotEmpty ?? false)
/// 兼容 iOS 空安全 -> NSNull _ARGUMENT_KEY_UNIVERSALLINK: universalLink,
if (universalLink != null) { },
arguments[_ARGUMENT_KEY_UNIVERSALLINK] = universalLink; );
}
return _channel.invokeMethod(_METHOD_REGISTERAPP, arguments);
} }
/// 登录 /// 登录
@ -99,13 +96,6 @@ class Tencent {
return _shareRespStreamController.stream; return _shareRespStreamController.stream;
} }
/// 检查QQ是否已安装
Future<bool> isInstalled() async {
return (await isQQInstalled()) ||
(await isTIMInstalled()) ||
(await isQQLiteInstalled());
}
/// 检查QQ是否已安装 /// 检查QQ是否已安装
Future<bool> isQQInstalled() { Future<bool> isQQInstalled() {
return _channel.invokeMethod(_METHOD_ISQQINSTALLED); return _channel.invokeMethod(_METHOD_ISQQINSTALLED);
@ -116,11 +106,6 @@ class Tencent {
return _channel.invokeMethod(_METHOD_ISTIMINSTALLED); return _channel.invokeMethod(_METHOD_ISTIMINSTALLED);
} }
/// 检查QQ是否已安装
Future<bool> isQQLiteInstalled() {
return _channel.invokeMethod(_METHOD_ISQQLITEINSTALLED);
}
/// 登录 /// 登录
Future<void> login({ Future<void> login({
@required List<String> scope, @required List<String> scope,
@ -214,27 +199,17 @@ class Tencent {
assert(imageUri != null && imageUri.isScheme(_SCHEME_FILE)); assert(imageUri != null && imageUri.isScheme(_SCHEME_FILE));
}); });
} }
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_SCENE: scene, _METHOD_SHAREMOOD,
// _ARGUMENT_KEY_SUMMARY: summary, <String, dynamic>{
// _ARGUMENT_KEY_IMAGEURIS: imageUris != null ? new List.generate(imageUris.length, (int index) { _ARGUMENT_KEY_SCENE: scene,
// return imageUris[index].toString(); if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary,
// }) : null, if (imageUris?.isNotEmpty ?? false)
// _ARGUMENT_KEY_VIDEOURI: videoUri != null ? videoUri.toString() : null, _ARGUMENT_KEY_IMAGEURIS:
}; imageUris.map((Uri imageUri) => imageUri.toString()).toList(),
if (videoUri != null) _ARGUMENT_KEY_VIDEOURI: videoUri.toString(),
/// 兼容 iOS 空安全 -> NSNull },
if (summary != null && summary.isNotEmpty) { );
arguments[_ARGUMENT_KEY_SUMMARY] = summary;
}
if (imageUris != null && imageUris.isNotEmpty) {
arguments[_ARGUMENT_KEY_IMAGEURIS] =
imageUris.map((Uri imageUri) => imageUri.toString()).toList();
}
if (videoUri != null) {
arguments[_ARGUMENT_KEY_VIDEOURI] = videoUri.toString();
}
return _channel.invokeMethod(_METHOD_SHAREMOOD, arguments);
} }
/// 分享 - 文本Android调用的是系统API故而不会有回调 /// 分享 - 文本Android调用的是系统API故而不会有回调
@ -244,11 +219,13 @@ class Tencent {
}) { }) {
assert(scene == TencentScene.SCENE_QQ); assert(scene == TencentScene.SCENE_QQ);
assert(summary != null && summary.isNotEmpty); assert(summary != null && summary.isNotEmpty);
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_SCENE: scene, _METHOD_SHARETEXT,
_ARGUMENT_KEY_SUMMARY: summary, <String, dynamic>{
}; _ARGUMENT_KEY_SCENE: scene,
return _channel.invokeMethod(_METHOD_SHARETEXT, arguments); _ARGUMENT_KEY_SUMMARY: summary,
},
);
} }
/// 分享 - 图片 /// 分享 - 图片
@ -260,18 +237,15 @@ class Tencent {
}) { }) {
assert(scene == TencentScene.SCENE_QQ); assert(scene == TencentScene.SCENE_QQ);
assert(imageUri != null && imageUri.isScheme(_SCHEME_FILE)); assert(imageUri != null && imageUri.isScheme(_SCHEME_FILE));
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_SCENE: scene, _METHOD_SHAREIMAGE,
_ARGUMENT_KEY_IMAGEURI: imageUri.toString(), <String, dynamic>{
// _ARGUMENT_KEY_APPNAME: appName, _ARGUMENT_KEY_SCENE: scene,
_ARGUMENT_KEY_EXTINT: extInt, _ARGUMENT_KEY_IMAGEURI: imageUri.toString(),
}; if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName,
_ARGUMENT_KEY_EXTINT: extInt,
/// 兼容 iOS 空安全 -> NSNull },
if (appName != null && appName.isNotEmpty) { );
arguments[_ARGUMENT_KEY_APPNAME] = appName;
}
return _channel.invokeMethod(_METHOD_SHAREIMAGE, arguments);
} }
/// 分享 - 音乐 /// 分享 - 音乐
@ -289,28 +263,19 @@ class Tencent {
assert(title != null && title.isNotEmpty); assert(title != null && title.isNotEmpty);
assert(musicUrl != null && musicUrl.isNotEmpty); assert(musicUrl != null && musicUrl.isNotEmpty);
assert(targetUrl != null && targetUrl.isNotEmpty); assert(targetUrl != null && targetUrl.isNotEmpty);
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_SCENE: scene, _METHOD_SHAREMUSIC,
_ARGUMENT_KEY_TITLE: title, <String, dynamic>{
// _ARGUMENT_KEY_SUMMARY: summary, _ARGUMENT_KEY_SCENE: scene,
// _ARGUMENT_KEY_IMAGEURI: imageUri != null ? imageUri.toString() : null, _ARGUMENT_KEY_TITLE: title,
_ARGUMENT_KEY_MUSICURL: musicUrl, if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary,
_ARGUMENT_KEY_TARGETURL: targetUrl, if (imageUri != null) _ARGUMENT_KEY_IMAGEURI: imageUri.toString(),
// _ARGUMENT_KEY_APPNAME: appName, _ARGUMENT_KEY_MUSICURL: musicUrl,
_ARGUMENT_KEY_EXTINT: extInt, _ARGUMENT_KEY_TARGETURL: targetUrl,
}; if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName,
_ARGUMENT_KEY_EXTINT: extInt,
/// 兼容 iOS 空安全 -> NSNull },
if (summary != null && summary.isNotEmpty) { );
arguments[_ARGUMENT_KEY_SUMMARY] = summary;
}
if (imageUri != null) {
arguments[_ARGUMENT_KEY_IMAGEURI] = imageUri.toString();
}
if (appName != null && appName.isNotEmpty) {
arguments[_ARGUMENT_KEY_APPNAME] = appName;
}
return _channel.invokeMethod(_METHOD_SHAREMUSIC, arguments);
} }
/// 分享 - 网页 /// 分享 - 网页
@ -325,26 +290,17 @@ class Tencent {
}) { }) {
assert(title != null && title.isNotEmpty); assert(title != null && title.isNotEmpty);
assert(targetUrl != null && targetUrl.isNotEmpty); assert(targetUrl != null && targetUrl.isNotEmpty);
final Map<String, dynamic> arguments = <String, dynamic>{ return _channel.invokeMethod(
_ARGUMENT_KEY_SCENE: scene, _METHOD_SHAREWEBPAGE,
_ARGUMENT_KEY_TITLE: title, <String, dynamic>{
// _ARGUMENT_KEY_SUMMARY: summary, _ARGUMENT_KEY_SCENE: scene,
// _ARGUMENT_KEY_IMAGEURI: imageUri != null ? imageUri.toString() : null, _ARGUMENT_KEY_TITLE: title,
_ARGUMENT_KEY_TARGETURL: targetUrl, if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary,
// _ARGUMENT_KEY_APPNAME: appName, if (imageUri != null) _ARGUMENT_KEY_IMAGEURI: imageUri.toString(),
_ARGUMENT_KEY_EXTINT: extInt, _ARGUMENT_KEY_TARGETURL: targetUrl,
}; if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName,
_ARGUMENT_KEY_EXTINT: extInt,
/// 兼容 iOS 空安全 -> NSNull },
if (summary != null && summary.isNotEmpty) { );
arguments[_ARGUMENT_KEY_SUMMARY] = summary;
}
if (imageUri != null) {
arguments[_ARGUMENT_KEY_IMAGEURI] = imageUri.toString();
}
if (appName != null && appName.isNotEmpty) {
arguments[_ARGUMENT_KEY_APPNAME] = appName;
}
return _channel.invokeMethod(_METHOD_SHAREWEBPAGE, arguments);
} }
} }

View File

@ -1,11 +1,11 @@
name: tencent_kit name: tencent_kit
description: A powerful Flutter plugin allowing developers to share or authorize with natvie android & iOS Tencent SDKs. description: A powerful Flutter plugin allowing developers to share or authorize with natvie android & iOS Tencent SDKs.
version: 1.0.4 version: 1.1.0
# author: v7lin <v7lin@qq.com> # author: v7lin <v7lin@qq.com>
homepage: https://github.com/v7lin/fake_tencent homepage: https://github.com/v7lin/fake_tencent
environment: environment:
sdk: ">=2.1.0 <3.0.0" sdk: ">=2.3.0 <3.0.0"
dependencies: dependencies:
flutter: flutter: