升级 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
* Android Q

View File

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

View File

@ -155,4 +155,20 @@ typedef void (^sendResultBlock)(NSDictionary *result);
\return iPhoneTIM下载地址
*/
+ (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

View File

@ -37,6 +37,7 @@ typedef NS_ENUM(NSInteger,QQApiSendResultCode) {
EQQAPIQZONENOTSUPPORTIMAGE = 10001, //qzone分享不支持image类型分享
EQQAPIVERSIONNEEDUPDATE = 10002, //QQ版本太低
ETIMAPIVERSIONNEEDUPDATE = 10004, //TIM版本太低
EAPPURLTYPESILLEGALITY = 20000, //(>=3.3.8)APP的info.plist中UrlTypes字段存在QQ的UrlScheme
};
#pragma mark - QQApiObject()
@ -66,6 +67,9 @@ typedef NS_ENUM(NSUInteger, MiniProgramType) {
MiniProgramType_Preview=4, // 预览版
};
/// 打印回调的block
typedef void(^QQApiLogBolock)(NSString *logStr);
// QQApiObject
/** \brief 所有在QQ及插件间发送的数据对象的根类。
*/
@ -106,9 +110,16 @@ __attribute__((visibility("default"))) @interface QQApiMiniProgramObject : NSObj
//唤起小程序 - QQ 8.1.8
__attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject
@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)
@end
//小程序唤起第三方 - SDK 3.3.9
__attribute__((visibility("default"))) @interface QQApiMiniProgramLaunchObject : QQApiObject
@property(nonatomic,copy) NSString* appParameter; //小程序带来的数据,透传
+ (instancetype)newWithAppParameter:(NSString*)parameter;
@end
// QQApiResultObject
/** \brief 用于请求回应的数据类型。
<h3>可能错误码及描述如下:</h3>

View File

@ -164,8 +164,8 @@ typedef NS_ENUM(NSUInteger, TencentAuthMode) {
/**
* 初始化TencentOAuth对象
* \param appId 第三方应用在互联开放平台申请的唯一标识
* \param delegate 第三方应用用于接收请求返回结果的委托对象
* \param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* \param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象
*/
- (id)initWithAppId:(NSString *)appId
@ -173,15 +173,38 @@ typedef NS_ENUM(NSUInteger, TencentAuthMode) {
/**
* 初始化TencentOAuth对象>=3.3.7
* \param appId 第三方应用在互联开放平台申请的唯一标识
* \param universalLink 第三方应用在互联开放平台注册的universallink和bundleID一一对应
* \param delegate 第三方应用用于接收请求返回结果的委托对象
* \param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* \param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成universallink详见官网说明
* \param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象
*
****【使用说明】*****
* 1、支持BundleId与UniversalLink的一一对应主要目的“是为了解决应用的iPhone版本和iPad HD版本共用同一个AppId导致同时安装情况下的跳转问题"。
* 2 、由于手Q版本在 >=8.1.8 后才支持了这种对应方式所以一旦使用“务必做到”及时知会用户升级手Q版本。
****
*/
- (id)initWithAppId:(NSString *)appId
andUniversalLink:(NSString *)universalLink
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
* \return YES:安装 NO:没安装

View File

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

View File

@ -1,11 +1,11 @@
name: tencent_kit
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>
homepage: https://github.com/v7lin/fake_tencent
environment:
sdk: ">=2.1.0 <3.0.0"
sdk: ">=2.3.0 <3.0.0"
dependencies:
flutter: