增加换肤功能

This commit is contained in:
启星
2025-08-14 10:07:49 +08:00
parent f6964c1e89
commit 4f9318d98e
8789 changed files with 978530 additions and 2 deletions

View File

@@ -0,0 +1,42 @@
<?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>AvailableLibraries</key>
<array>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_i386_x86_64-simulator</string>
<key>LibraryPath</key>
<string>TencentOpenAPI.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>i386</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>TencentOpenAPI.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,338 @@
<?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>files</key>
<dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/Modules/module.modulemap</key>
<data>
NyClSJF5AkbzsaKwZiYthWwFtEQ=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/QQApiInterface.h</key>
<data>
gGvGGJpjkKChFdTHG4JCYcZFU4Q=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h</key>
<data>
bR/sIFOcBRXlm/PPqkV9E5cBGW0=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/SDKDef.h</key>
<data>
pNuALDKV3dBaHRTHj87Ha0FRn2M=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/TencentOAuth.h</key>
<data>
qY4CtCUAIMH/VEBpkqo8h+uRhy8=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/TencentOpenApiUmbrellaHeader.h</key>
<data>
qGEWrIy0/CmpJkMMCxSd9xQoDh0=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/PrivacyInfo.xcprivacy</key>
<data>
NQnJAwD5Cl2cdaDNq498CVy7QsU=
</data>
<key>ios-arm64_armv7/TencentOpenAPI.framework/TencentOpenAPI</key>
<data>
NN04LW43ikzIT3W64odX5+4dKfQ=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/Modules/module.modulemap</key>
<data>
NyClSJF5AkbzsaKwZiYthWwFtEQ=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/QQApiInterface.h</key>
<data>
gGvGGJpjkKChFdTHG4JCYcZFU4Q=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h</key>
<data>
bR/sIFOcBRXlm/PPqkV9E5cBGW0=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/SDKDef.h</key>
<data>
pNuALDKV3dBaHRTHj87Ha0FRn2M=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/TencentOAuth.h</key>
<data>
qY4CtCUAIMH/VEBpkqo8h+uRhy8=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/TencentOpenApiUmbrellaHeader.h</key>
<data>
qGEWrIy0/CmpJkMMCxSd9xQoDh0=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/PrivacyInfo.xcprivacy</key>
<data>
NQnJAwD5Cl2cdaDNq498CVy7QsU=
</data>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/TencentOpenAPI</key>
<data>
YaSNr/4iXdMf0ABNzNjThh6Ovd4=
</data>
</dict>
<key>files2</key>
<dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
NyClSJF5AkbzsaKwZiYthWwFtEQ=
</data>
<key>hash2</key>
<data>
foQZVVDy5Y31H0ExXBx9x0xFKY8cAS8r03UUsRf4BiE=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/QQApiInterface.h</key>
<dict>
<key>hash</key>
<data>
gGvGGJpjkKChFdTHG4JCYcZFU4Q=
</data>
<key>hash2</key>
<data>
MxO8YQDQsllAe5FE7OhaoXJ0m7es4H7C/BX/1bwH/aM=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h</key>
<dict>
<key>hash</key>
<data>
bR/sIFOcBRXlm/PPqkV9E5cBGW0=
</data>
<key>hash2</key>
<data>
3anKz8DaNOJRnDNgPEW2oyacBhq9160MiwLe8VQ5r9Q=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/SDKDef.h</key>
<dict>
<key>hash</key>
<data>
pNuALDKV3dBaHRTHj87Ha0FRn2M=
</data>
<key>hash2</key>
<data>
GqM+994bCqOt7Y0BeiHKE53NauFkYQkGums/PGAPcyo=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/TencentOAuth.h</key>
<dict>
<key>hash</key>
<data>
qY4CtCUAIMH/VEBpkqo8h+uRhy8=
</data>
<key>hash2</key>
<data>
xT3XtPEo90J7djfYWyf/8z0YS2IzECDHUGqfpQUYM9g=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/Headers/TencentOpenApiUmbrellaHeader.h</key>
<dict>
<key>hash</key>
<data>
qGEWrIy0/CmpJkMMCxSd9xQoDh0=
</data>
<key>hash2</key>
<data>
/WKoVcUHfNNJlwWXqATrmrg8erC1ZXQ33PY6t7yp7o0=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
NQnJAwD5Cl2cdaDNq498CVy7QsU=
</data>
<key>hash2</key>
<data>
Q8KZWbmrIft5Xi6JXOchEUdN4mK7Ao545O0RGUHTTcI=
</data>
</dict>
<key>ios-arm64_armv7/TencentOpenAPI.framework/TencentOpenAPI</key>
<dict>
<key>hash</key>
<data>
NN04LW43ikzIT3W64odX5+4dKfQ=
</data>
<key>hash2</key>
<data>
3k0T5SqN9XWe6OMpeba+dHK6FCjzxXjquC9Fu6Kf5+w=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
NyClSJF5AkbzsaKwZiYthWwFtEQ=
</data>
<key>hash2</key>
<data>
foQZVVDy5Y31H0ExXBx9x0xFKY8cAS8r03UUsRf4BiE=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/QQApiInterface.h</key>
<dict>
<key>hash</key>
<data>
gGvGGJpjkKChFdTHG4JCYcZFU4Q=
</data>
<key>hash2</key>
<data>
MxO8YQDQsllAe5FE7OhaoXJ0m7es4H7C/BX/1bwH/aM=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h</key>
<dict>
<key>hash</key>
<data>
bR/sIFOcBRXlm/PPqkV9E5cBGW0=
</data>
<key>hash2</key>
<data>
3anKz8DaNOJRnDNgPEW2oyacBhq9160MiwLe8VQ5r9Q=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/SDKDef.h</key>
<dict>
<key>hash</key>
<data>
pNuALDKV3dBaHRTHj87Ha0FRn2M=
</data>
<key>hash2</key>
<data>
GqM+994bCqOt7Y0BeiHKE53NauFkYQkGums/PGAPcyo=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/TencentOAuth.h</key>
<dict>
<key>hash</key>
<data>
qY4CtCUAIMH/VEBpkqo8h+uRhy8=
</data>
<key>hash2</key>
<data>
xT3XtPEo90J7djfYWyf/8z0YS2IzECDHUGqfpQUYM9g=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/Headers/TencentOpenApiUmbrellaHeader.h</key>
<dict>
<key>hash</key>
<data>
qGEWrIy0/CmpJkMMCxSd9xQoDh0=
</data>
<key>hash2</key>
<data>
/WKoVcUHfNNJlwWXqATrmrg8erC1ZXQ33PY6t7yp7o0=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
NQnJAwD5Cl2cdaDNq498CVy7QsU=
</data>
<key>hash2</key>
<data>
Q8KZWbmrIft5Xi6JXOchEUdN4mK7Ao545O0RGUHTTcI=
</data>
</dict>
<key>ios-arm64_i386_x86_64-simulator/TencentOpenAPI.framework/TencentOpenAPI</key>
<dict>
<key>hash</key>
<data>
YaSNr/4iXdMf0ABNzNjThh6Ovd4=
</data>
<key>hash2</key>
<data>
o2MeTXJecokZ0y01eqLpa7QLp9z3MN0L57D6PCAjiZI=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,4 @@
module TencentOpenApi{
umbrella header "TencentOpenApiUmbrellaHeader.h"
export *
}

View File

@@ -0,0 +1,220 @@
///
/// \file QQApiInterface.h
/// \brief QQApi接口简化封装
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import "QQApiInterfaceObject.h"
typedef void (^sendResultBlock)(NSDictionary *result);
// 发送消息回调是否发送成功
typedef void(^QQApiInterfaceSendMessageResultBlock)(QQApiSendResultCode sendResultCode, NSString *message);
/**
\brief 处理来至QQ的请求及响应的回调协议
*/
@protocol QQApiInterfaceDelegate <NSObject>
/**
处理来至QQ的请求
*/
- (void)onReq:(QQBaseReq *)req;
/**
处理来至QQ的响应
*/
- (void)onResp:(QQBaseResp *)resp;
/**
处理QQ在线状态的回调
*/
- (void)isOnlineResponse:(NSDictionary *)response;
@end
/**
\brief 对QQApi的简单封装类
*/
@interface QQApiInterface : NSObject
/**
处理由手Q唤起的普通跳转请求
\param url 待处理的url跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果YES表示成功处理NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
处理由手Q唤起的universallink跳转请求
\param universallink 待处理的universallink跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果YES表示成功处理NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenUniversallink:(NSURL*)universallink delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
向手Q发起分享请求
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendReq:(QQBaseReq *)req;
/**
向手Q QZone结合版发起分享请求
\note H5分享只支持单张网络图片的传递
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req;
/**
向手Q发起设置QQ头像
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToQQAvatarWithReq:(QQBaseReq*)req;
+ (QQApiSendResultCode)sendMessageToQQAuthWithReq:(QQBaseReq*)req;
/**
向手Q发起绑群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppBindGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起加群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppJoinGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起解绑群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppUnBindGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起创建QQ频道的请求
\param req 请求的内容
\param resultBlock 回调发送结果
\return void
*/
+ (void)sendMessageToCreateQQGroupProWithMessageRequest:(SendMessageToQQReq *)messageRequest sendResultBlock:(QQApiInterfaceSendMessageResultBlock)sendResultBlock;
/**
向手Q发起加入QQ频道的请求
\param req 请求的内容
\param resultBlock 回调发送结果
\return void
*/
+ (void)sendMessageToJoinQQGroupProWithMessageRequest:(SendMessageToQQReq *)messageRequest sendResultBlock:(QQApiInterfaceSendMessageResultBlock)sendResultBlock;
/**
向手Q发起查询QQ频道openID的请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendQueryQQGroupProInfo:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起组图分享到表情收藏
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToFaceCollectionWithReq:(QQBaseReq*)req;
/**
检测是否已安装QQ
\return 如果QQ已安装则返回YES否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isQQInstalled;
/**
检测是否已安装TIM
\return 如果TIM已安装则返回YES否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isTIMInstalled;
/**
检测QQ是否支持API调用
\return 如果当前安装QQ版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isQQSupportApi;
/**
检测TIM是否支持API调用
\return 如果当前安装TIM版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isTIMSupportApi __attribute__((deprecated("已过期, 建议删除调用调用地方用YES替代。")));
/**
检测是否支持分享
\return 如果当前已安装QQ且QQ版本支持API调用 或者 当前已安装TIM且TIM版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isSupportShareToQQ;
/**
检测是否支持分享到QQ结合版QZone
\return 如果当前已安装QQ且QQ版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isSupportPushToQZone;
/**
获取QQ下载地址
如果App通过<code>QQApiInterface#isQQInstalled</code>和<code>QQApiInterface#isQQSupportApi</code>检测发现QQ没安装或当前版本QQ不支持API调用可引导用户通过打开此链接下载最新版QQ。
\return iPhoneQQ下载地址
*/
+ (NSString *)getQQInstallUrl;
/**
获取TIM下载地址
如果App通过<code>QQApiInterface#isTIMInstalled</code>检测发现TIM没安装或当前版本TIM不支持API调用可引导用户通过打开此链接下载最新版TIM。
\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

@@ -0,0 +1,754 @@
///
/// \file QQApiInterfaceObject.h
/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#ifndef QQApiInterface_QQAPIOBJECT_h
#define QQApiInterface_QQAPIOBJECT_h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, QQApiSendResultCode) {
EQQAPISENDSUCESS = 0,
EQQAPIQQNOTINSTALLED = 1, // QQ未安装
EQQAPIQQNOTSUPPORTAPI = 2, // QQ api不支持
EQQAPIMESSAGETYPEINVALID = 3,
EQQAPIMESSAGECONTENTNULL = 4,
EQQAPIMESSAGECONTENTINVALID = 5,
EQQAPIAPPNOTREGISTED = 6,
EQQAPIAPPSHAREASYNC = 7,
EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, // QQ api不支持 && SDK显示error提示已废弃
EQQAPIMESSAGEARKCONTENTNULL = 9, // ark内容为空
EQQAPIMESSAGE_MINI_CONTENTNULL = 10, // 小程序参数为空
EQQAPISENDFAILD = -1, // 发送失败
EQQAPISHAREDESTUNKNOWN = -2, // 未指定分享到QQ或TIM
EQQAPITIMSENDFAILD = -3, // 发送失败
EQQAPITIMNOTINSTALLED = 11, // TIM未安装
EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持
EQQAPI_INCOMING_PARAM_ERROR = 13, // 外部传参错误
EQQAPI_THIRD_APP_GROUP_ERROR_APP_NOT_AUTHORIZIED = 14, // APP未获得授权
EQQAPI_THIRD_APP_GROUP_ERROR_CGI_FAILED = 15, // CGI请求失败
EQQAPI_THIRD_APP_GROUP_ERROR_HAS_BINDED = 16, // 该组织已经绑定群聊
EQQAPI_THIRD_APP_GROUP_ERROR_NOT_BINDED = 17, // 该组织尚未绑定群聊
EQQAPI_THIRD_APP_GROUP_ERROR_HAS_UNBINDED = 18, // 该组织已经解绑群聊
EQQAPI_IMAGE_SIZE_OUT_OF_BOUNND = 19, // 图片大小超过限制图片不能超过5M缩略图不能超过1M
EQQAPI_TITLE_LENGTH_OUT_OF_BOUNND = 20, // 标题长度超过限制不能超过128
EQQAPI_TITLE_NIL_ERROR = 21, // 标题不能为空
EQQAPI_DESC_LENGTH_OUT_OF_BOUNND = 22, // 描述信息长度超过限制不能超过512
EQQAPI_URL_LENGTH_OUT_OF_BOUNND = 23, // URL参数长度超过限制不能超过1024
EQQAPI_URL_NIL_ERROR = 24, // URL参数不能为空
EQQAPIQZONENOTSUPPORTTEXT = 10000, // qzone分享不支持text类型分享
EQQAPIQZONENOTSUPPORTIMAGE = 10001, // qzone分享不支持image类型分享
EQQAPIVERSIONNEEDUPDATE = 10002, // 当前QQ版本太低需要更新至新版本才可以支持
ETIMAPIVERSIONNEEDUPDATE = 10004, // 当前TIM版本太低需要更新至新版本才可以支持
EAPPURLTYPESILLEGALITY = 20000, // (>=3.3.8)第三方APP的info.plist中UrlTypes字段存在QQ的UrlScheme
EQQAPI_ERROR_USER_NOT_AGREED_AUTHORIZATION = 30001, // 用户未同意隐私协议,用户同意隐私协议后,需要设置[TencentOAuth setIsUserAgreedAuthorization:YES];
};
#pragma mark - QQApiObject(分享对象类型)
// QQApiObject control flags
typedef NS_ENUM(NSUInteger,kQQAPICtrlFlag) {
kQQAPICtrlFlagQZoneShareOnStart = 0x01,
kQQAPICtrlFlagQZoneShareForbid = 0x02, //屏蔽好友选择器上的空间入口
kQQAPICtrlFlagQQShare = 0x04,
kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏
kQQAPICtrlFlagQQShareDataline = 0x10, //数据线
kQQAPICtrlFlagQQShareEnableArk = 0x20, //支持ARK
kQQAPICtrlFlagQQShareEnableMiniProgram = 0x40, //支持小程序
};
// 分享到QQ或TIM
typedef NS_ENUM(NSUInteger, ShareDestType) {
ShareDestTypeQQ = 0,
ShareDestTypeTIM,
};
//小程序的类型
typedef NS_ENUM(NSUInteger, MiniProgramType) {
MiniProgramType_Develop = 0, // 开发版
MiniProgramType_Test = 1, // 测试版
MiniProgramType_Online = 3, // 正式版,默认
MiniProgramType_Preview = 4, // 预览版
};
/// 打印回调的block
typedef void(^QQApiLogBolock)(NSString *logStr);
// QQApiObject
/** \brief 所有在QQ及插件间发送的数据对象的根类。
*/
__attribute__((visibility("default"))) @interface QQApiObject : NSObject
@property (nonatomic, copy) NSString *title; ///< 标题最长128个字符
@property (nonatomic, copy) NSString *description; ///<简要描述最长512个字符
@property (nonatomic, copy) NSString *universalLink; ///(>=3.3.7)支持第三方传入在互联开放平台注册的universallink
@property (nonatomic, assign) uint64_t cflag;
//353新增两个字断给游戏侧使用对齐微信sdk
@property (nonatomic, copy) NSString *tagName;
@property (nonatomic, copy) NSString *messageExt;
/*
* 分享到QQ/TIM
* SDK根据是否安装对应客户端进行判断判断顺序QQ > TIM
* 默认分享到QQ如果QQ未安装检测TIM是否安装
*/
@property (nonatomic, assign) ShareDestType shareDestType;
/**
* 检查参数是否完整有效
* @return 检查参数结果
*/
- (QQApiSendResultCode)checkParamValid;
@end
// ArkObject
/** \brief 支持Ark的根类。
*/
__attribute__((visibility("default"))) @interface ArkObject : NSObject
@property (nonatomic, copy) NSString *arkData; ///< 显示Ark所需的数据json串长度暂不限制
@property (nonatomic, strong) QQApiObject* qqApiObject; ///<原有老版本的QQApiObject
- (id)initWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
+ (id)objectWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
@end
#pragma mark QQ小程序
//分享小程序消息 - QQ 8.0.8
__attribute__((visibility("default"))) @interface QQApiMiniProgramObject : NSObject
@property (nonatomic, strong) QQApiObject* qqApiObject; //原有老版本的QQApiObject
@property (nonatomic, copy) NSString *miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定
@property (nonatomic, copy) NSString *miniPath; //必填,小程序的展示路径
@property (nonatomic, copy) NSString *webpageUrl; //必填,兼容低版本的网页链接
@property (nonatomic, assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、预览版(4)
@end
//唤起小程序 - QQ 8.1.8
__attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject
@property (nonatomic, copy) NSString *miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定
@property (nonatomic, copy) 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>
<TABLE>
<TR><TD>error</TD><TD>errorDescription</TD><TD>注释</TD></TR>
<TR><TD>0</TD><TD>nil</TD><TD>成功</TD></TR>
<TR><TD>-1</TD><TD>param error</TD><TD>参数错误</TD></TR>
<TR><TD>-2</TD><TD>group code is invalid</TD><TD>该群不在自己的群列表里面</TD></TR>
<TR><TD>-3</TD><TD>upload photo failed</TD><TD>上传图片失败</TD></TR>
<TR><TD>-4</TD><TD>user give up the current operation</TD><TD>用户放弃当前操作</TD></TR>
<TR><TD>-5</TD><TD>client internal error</TD><TD>客户端内部处理错误</TD></TR>
</TABLE>
*/
__attribute__((visibility("default"))) @interface QQApiResultObject : QQApiObject
@property (nonatomic, copy) NSString *error; ///<错误
@property (nonatomic, copy) NSString *errorDescription; ///<错误描述
@property (nonatomic, copy) NSString *extendInfo; ///<扩展信息
@property (nonatomic, copy) NSDictionary *otherInfo; ///<其他扩展信息
@end
// QQApiTextObject
/** \brief 文本对象
*/
@interface QQApiTextObject : QQApiObject
@property (nonatomic, copy)NSString *text; ///<文本内容必填最长1536个字符
- (id)initWithText:(NSString *)text; ///<初始化方法
+ (id)objectWithText:(NSString *)text;///<工厂方法获取一个QQApiTextObject对象.
@end
// QQApiURLObject
typedef NS_ENUM(NSUInteger, QQApiURLTargetType) {
QQApiURLTargetTypeNotSpecified = 0x00,
QQApiURLTargetTypeAudio = 0x01,
QQApiURLTargetTypeVideo = 0x02,
QQApiURLTargetTypeNews = 0x03
};
/** @brief URL对象类型。
包括URL地址URL地址所指向的目标类型及预览图像。
*/
__attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject
/**
URL地址所指向的目标类型.
@note 参见QQApi.h 中的 QQApiURLTargetType 定义.
*/
@property (nonatomic)QQApiURLTargetType targetContentType;
@property (nonatomic, strong) NSURL *url; ///<URL地址,必填最长512个字符
@property (nonatomic, copy) NSData *previewImageData;///<预览图像数据最大1M字节
@property (nonatomic, strong) NSURL *previewImageURL; ///<预览图像URL **预览图像数据与预览图像URL可二选一
/**
初始化方法
*/
- (id)initWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data targetContentType:(QQApiURLTargetType)targetContentType;
- (id)initWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
/**
工厂方法,获取一个QQApiURLObject对象
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data targetContentType:(QQApiURLTargetType)targetContentType;
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
@end
// QQApiExtendObject
/** @brief 扩展数据类型
*/
@interface QQApiExtendObject : QQApiObject
@property (nonatomic, copy) NSData *data;///<具体数据内容必填最大5M字节
@property (nonatomic, copy) NSData *previewImageData;///<预览图像最大1M字节
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组(多图暂只支持分享到手机QQ收藏功能)
/**
初始化方法
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description;
/**
初始化方法
@param data 数据内容
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
*/
- (id)initWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
@end
// QQApiImageObject
/** @brief 图片对象
用于分享图片内容的对象,是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageObject : QQApiExtendObject
@end
// QQApiImageForQQAvatarObject
/** @brief 图片对象
用于设置QQ头像内容的对象是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageForQQAvatarObject : QQApiExtendObject
@end
/**
* @brief 视频对象
* 用于设置动态头像
* assetURL可传ALAsset的ALAssetPropertyAssetURL或者PHAsset的localIdentifier
从手Q返回的错误码
//第三方设置动态头像结果
@"ret=0"//设置成功
@"ret=-10&error_des=user cancel"//用户取消设置
@"ret=-11&error_des=pasteboard have no video data"//剪切板没有数据
@"ret=-12&error_des=export data failed"//从剪切板导出数据到本地失败
@"ret=-13&error_des=url param invalid"//sdk传递过来的数据有误
@"ret=-14&error_des=video param invalid"//视频的参数不符合要求检测第三方视频源方案1、分辨率跟480*480保持一致2、视频长度0.5s8s
@"ret=-15&error_des=app authorised failed"//应用鉴权失败
@"ret=-16&error_des=upload video failed"//设置头像,上传到后台失败
@"ret=-17&error_des=account diff"//账号不一致
*/
@interface QQApiVideoForQQAvatarObject : QQApiExtendObject
@property (nonatomic, copy) NSString *assetURL;
@end
//QQApiAuthObject 用于拉起手Q的授权详情页
@interface QQApiAuthObject : QQApiObject
@end
// QQApiImageArrayForFaceCollectionObject
/** @brief 图片数组对象
用于分享图片组到表情收藏,是一个指定为图片类型的<code>QQApiObject</code>
*/
@interface QQApiImageArrayForFaceCollectionObject : QQApiObject
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组
/**
初始化方法
@param imageDataArray 图片数组
*/
- (id)initWithImageArrayData:(NSArray *)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiObject</code>对象
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray *)imageDataArray;
@end
// QQApiImageArrayForQZoneObject
/** @brief 图片对象
用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说<code>QQApiObject</code>
*/
@interface QQApiImageArrayForQZoneObject : QQApiObject
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组
@property (nonatomic, copy) NSDictionary *extMap; // 扩展字段
/**
初始化方法
@param imageDataArray 图片数组
@param title 写说说的内容,可以为空
@param extMap 扩展字段
*/
- (id)initWithImageArrayData:(NSArray *)imageDataArray title:(NSString *)title extMap:(NSDictionary *)extMap;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param title 写说说的内容,可以为空
@param imageDataArray 发送的多张图片队列
@param extMap 扩展字段
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray *)imageDataArray title:(NSString *)title extMap:(NSDictionary *)extMap;
@end
// QQApiVideoForQZoneObject
/** @brief 视频对象
用于分享视频到空间,走写说说路径<code>QQApiObject</code>,assetURL和videoData两个参数必须设置至少一个参数如果assetURL设置了忽略videoData参数
@param assetURL可传ALAsset的ALAssetPropertyAssetURL或者PHAsset的localIdentifier
@param extMap 扩展字段
@param videoData 视频数据大小不超过50M
*/
@interface QQApiVideoForQZoneObject : QQApiObject
@property (nonatomic, copy) NSString *assetURL;
@property (nonatomic, copy) NSDictionary *extMap; // 扩展字段
@property (nonatomic, copy) NSData *videoData;
- (id)initWithAssetURL:(NSString *)assetURL title:(NSString *)title extMap:(NSDictionary *)extMap;
+ (id)objectWithAssetURL:(NSString *)assetURL title:(NSString *)title extMap:(NSDictionary *)extMap;
- (id)initWithVideoData:(NSData *)videoData title:(NSString *)title extMap:(NSDictionary *)extMap;
+ (id)objectWithVideoData:(NSData *)videoData title:(NSString *)title extMap:(NSDictionary *)extMap;
@end
// QQApiWebImageObject
/** @brief 图片对象
用于分享网络图片内容的对象是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持
原有的手q分享是不支持该类型的。
*/
@interface QQApiWebImageObject : QQApiObject
@property (nonatomic, strong) NSURL *previewImageURL; ///<预览图像URL
/**
初始化方法
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithPreviewImageURL:(NSURL *)previewImageURL title:(NSString *)title description:(NSString *)description;
/**
helper方法获取一个autorelease的<code>QQApiWebImageObject</code>对象
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
+ (id)objectWithPreviewImageURL:(NSURL *)previewImageURL title:(NSString *)title description:(NSString *)description;
@end
//QQApiFileObject
/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能)
用于分享文件内容的对象,是一个指定为文件类型的<code>QQApiExtendObject</code>
*/
@interface QQApiFileObject : QQApiExtendObject {
NSString *_fileName;
}
@property (nonatomic, copy)NSString *fileName;
@end
// QQApiAudioObject
/** @brief 音频URL对象
用于分享目标内容为音频的URL的对象
*/
@interface QQApiAudioObject : QQApiURLObject
@property (nonatomic, strong) NSURL *flashURL; ///<音频URL地址最长512个字符
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiVideoObject
/** @brief 视频URL对象
用于分享目标内容为视频的URL的对象
QQApiVideoObject类型的分享目前在Android和PC QQ上接收消息时展现有待完善待手机QQ版本以后更新支持
目前如果要分享视频,推荐使用 QQApiNewsObject 类型
*/
@interface QQApiVideoObject : QQApiURLObject
@property (nonatomic, strong) NSURL *flashURL; ///<视频URL地址最长512个字符
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiNewsObject
/** @brief 新闻URL对象
用于分享目标内容为新闻的URL的对象
*/
@interface QQApiNewsObject : QQApiURLObject
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiCommonContentObject;
/** @brief 通用模板类型对象
用于分享一个固定显示模板的图文混排对象
@note 图片列表和文本列表不能同时为空
*/
@interface QQApiCommonContentObject : QQApiObject
/**
预定义的界面布局类型
*/
@property (nonatomic,assign) unsigned int layoutType;
@property (nonatomic, copy) NSData *previewImageData;///<预览图
@property (nonatomic, copy) NSArray *textArray;///<文本列表
@property (nonatomic, copy) NSArray *pictureDataArray;///<图片列表
+ (id)objectWithLayoutType:(int)layoutType textArray:(NSArray *)textArray pictureArray:(NSArray *)pictureArray previewImageData:(NSData *)data;
/**
将一个NSDictionary对象转化为QQApiCommomContentObject如果无法转换则返回空
*/
+ (id)objectWithDictionary:(NSDictionary *)dic;
- (NSDictionary *)toDictionary;
@end
// QQApiExtraServiceObject; 通用业务消息处理类旧版后续使用QQApiCommonServiceObject
/**
@brief OpenSDK扩展支持的服务通用接口后续会扩充能力
@param serviceID [必选] 扩展支持的服务类型ID参考官方文档说明
@param openID [必选] 授权登录后对该用户的唯一标识
@param toUin [可选] 对方的QQ号码
@param extraInfo [可选] 扩展字段
@note 该接口的使用须先登录
*/
@interface QQApiExtraServiceObject : QQApiObject
@property (nonatomic, copy) NSString *serviceID;
@property (nonatomic, copy) NSString *openID;
@property (nonatomic, copy) NSString *toUin;
@property (nonatomic, copy) NSDictionary *extraInfo;
- (id)initWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
+ (id)objecWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
@end
/**
* QQApiCommonServiceObject; 通用业务消息处理类可以适用所有的需要通过互联SDK发消息给手Q的业务去处理。
* 使用前需要申请serviceID每个业务功能有个对应的serviceID
*/
@interface QQApiCommonServiceObject : QQApiObject
// [必选] 授权登录后对该用户的唯一标识
@property (nonatomic, copy) NSString *openID;
// [必选] 扩展支持的服务类型ID参考官方文档说明
@property (nonatomic, copy) NSString *serviceID;
// [可选] 扩展字段,由调用方跟具体的业务方协定具体的字段
@property (nonatomic, copy) NSDictionary *extendInfo;
- (instancetype)initWithOpenID:(NSString *)openID
serviceID:(NSString *)serviceID
extendInfo:(NSDictionary *)extendInfo;
+ (instancetype)objecWithOpenID:(NSString *)openID
serviceID:(NSString *)serviceID
extendInfo:(NSDictionary *)extendInfo;
@end
#pragma mark - QQApi请求消息类型
/**
QQApi请求消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceReqType) {
EGETMESSAGEFROMQQREQTYPE = 0, /// < 手Q -> 第三方应用请求第三方应用向手Q发送消息
ESENDMESSAGETOQQREQTYPE = 1, /// < 第三方应用 -> 手Q第三方应用向手Q分享消息
ESHOWMESSAGEFROMQQREQTYPE = 2, /// < 手Q -> 第三方应用,请求第三方应用展现消息中的数据
ESENDMESSAGEARKTOQQREQTYPE = 3, /// < 第三方应用 -> 手Q第三方应用向手Q分享Ark消息
ESENDMESSAGE_MINI_TOQQREQTYPE = 4 /// < 第三方应用 -> 手Q第三方应用向手Q分享小程序消息
};
/**
QQApi应答消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceRespType) {
ESHOWMESSAGEFROMQQRESPTYPE = 0, /// < 第三方应用 -> 手Q第三方应用应答消息展现结果
EGETMESSAGEFROMQQRESPTYPE = 1, /// < 第三方应用 -> 手Q第三方应用回应发往手Q的消息
ESENDMESSAGETOQQRESPTYPE = 2 /// < 手Q -> 第三方应用手Q应答处理分享消息的结果
};
/**
QQApi请求消息基类
*/
@interface QQBaseReq : NSObject
/** 请求消息类型,参见\ref QQApiInterfaceReqType */
@property (nonatomic, assign) int type;
@end
/**
QQApi应答消息基类
*/
@interface QQBaseResp : NSObject
/** 请求处理结果 */
@property (nonatomic, copy) NSString *result;
/** 具体错误描述信息 */
@property (nonatomic, copy) NSString *errorDescription;
/** 应答消息类型,参见\ref QQApiInterfaceRespType */
@property (nonatomic, assign) int type;
/** 扩展信息 */
@property (nonatomic, copy) NSString *extendInfo;
@end
/**
GetMessageFromQQReq请求帮助类
*/
@interface GetMessageFromQQReq : QQBaseReq
/**
创建一个GetMessageFromQQReq请求实例
*/
+ (GetMessageFromQQReq *)req;
@end
@interface SendMessageToQQReq : QQBaseReq
/**
创建一个SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message;
/**
创建一个支持Ark的SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithArkContent:(ArkObject *)message;
/**
* 创建一个支持小程序的消息请求实例
* @param miniMessage 小程序实例对象
* @return 消息请求实例
*/
+ (SendMessageToQQReq *)reqWithMiniContent:(QQApiMiniProgramObject *)miniMessage;
/** 具体分享消息 */
@property (nonatomic, strong) QQApiObject *apiObject;
/** 支持Ark的具体分享消息 */
@property (nonatomic, strong) ArkObject *arkObject;
/** 支持小程序的具体分享消息 */
@property (nonatomic, strong) QQApiMiniProgramObject *miniProgramObject;
@end
/**
SendMessageToQQResp应答帮助类
*/
@interface SendMessageToQQResp : QQBaseResp
/** 其他扩展信息 */
@property (nonatomic, copy) NSDictionary *otherInfo;
/**
创建一个SendMessageToQQResp应答实例
\param result 请求处理结果
\param errDesp 具体错误描述信息
\param extendInfo 扩展信息
\return 新创建的SendMessageToQQResp应答实例
*/
+ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString *)extendInfo;
+ (SendMessageToQQResp *) respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString *)extendInfo otherInfo:(NSDictionary *)otherInfo;
@end
/**
ShowMessageFromQQReq请求帮助类
*/
@interface ShowMessageFromQQReq : QQBaseReq
/**
创建一个ShowMessageFromQQReq请求实例
\param message 具体待展现消息实例
\return 新创建的ShowMessageFromQQReq请求实例
*/
+ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message;
/** 具体待展现消息 */
@property (nonatomic, strong) QQApiObject *message;
@end
#pragma mark --一键加群&建群&解绑群
// QQApiThirdAppBindGroupObject
/** \brief 第三方app绑定群
*/
@interface QQApiThirdAppBindGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
@property (nonatomic, copy) NSString *appDisplayName;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID appDisplayName:(NSString *)appDisplayName; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID appDisplayName:(NSString *)appDisplayName; ///<工厂方法获取一个QQApiThirdAppBindGroupObject对象.
@end
// QQApiThirdAppJoinGroupObject
/** \brief 第三方app加入群
*/
@interface QQApiThirdAppJoinGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID; ///<工厂方法获取一个QQApiThirdAppJoinGroupObject对象.
@end
// QQApiThirdAppUnBindGroupObject
/** \brief 第三方app解绑群
*/
@interface QQApiThirdAppUnBindGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *openId;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID openId:(NSString *)openId appId:(NSString *)appId; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID openId:(NSString *)openId appId:(NSString *)appId; ///<工厂方法获取一个QQApiThirdAppBindGroupObject对象.
@end
#endif

View File

@@ -0,0 +1,420 @@
///
/// \file sdkdef.h
/// \brief SDK中相关常量定义
///
/// Created by Tencent on 12-12-25.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* \brief 设置sdk的log等级
*/
typedef enum {
TCOLogLevel_Disabled = -1, // 关闭所有log
TCOLogLevel_Error = 0,
TCOLogLevel_Warning,
TCOLogLevel_Info,
TCOLogLevel_Debug,
} TCOLogLevel;
/**
* \breif 授权/分享 方式
*/
typedef enum TencentAuthShareType {
AuthShareType_QQ,
AuthShareType_TIM,
}TencentAuthShareType;
/**
* \brief APIResponse.retCode可能的枚举常量
*/
typedef enum
{
URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确
* \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致
*/
URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */
} REPONSE_RESULT;
/**
* \brief 增量授权失败原因
*
* \note 增量授权失败不影响原token的有效性原token已失效的情况除外
*/
typedef enum
{
kUpdateFailUnknown = 1, ///< 未知原因
kUpdateFailUserCancel, ///< 用户取消
kUpdateFailNetwork, ///< 网络问题
} UpdateFailType;
/**
* \brief 封装服务器返回的结果
*
* APIResponse用于封装所有请求的返回结果包括错误码、错误信息、原始返回数据以及返回数据的json格式字典
*/
@interface APIResponse : NSObject<NSSecureCoding> {
int _detailRetCode;
int _retCode;
int _seq;
NSString *_errorMsg;
NSDictionary *_jsonResponse;
NSString *_message;
id _userData;
}
/**
* 新增的详细错误码\n
* detailRetCode主要用于区分不同的错误情况参见\ref OpenSDKError
*/
@property (nonatomic, assign) int detailRetCode;
/**
* 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n
* retCode具体取值可参考\ref REPONSE_RESULT
*/
@property (nonatomic, assign) int retCode;
/**
* 网络请求对应的递增序列号,方便内部管理
*/
@property (nonatomic, assign) int seq;
/**
* 错误提示语
*/
@property (nonatomic, copy) NSString *errorMsg;
/**
* 服务器返回数据的json格式字典\n
* 字典内具体参数的命名和含义请参考\ref api_spec
*/
@property (nonatomic, copy) NSDictionary *jsonResponse;
/**
* 服务器返回的原始数据字符串
*/
@property (nonatomic, copy) NSString *message;
/**
* 用户保留数据
*/
@property (nonatomic, strong) id userData;
@end
/**
* 用户自定义的保留字段
*/
FOUNDATION_EXTERN NSString * const PARAM_USER_DATA;
/**
* \name 应用邀请参数字段定义
*/
///@{
/** 应用邀请展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_ICON;
/** 应用邀请描述文本的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_DESC;
/** 应用邀请好友列表的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS;
///@}
/**
* \name sendStory新分享参数字段定义
*/
///@{
/** 预填入接受人列表的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER;
/** 分享feeds标题的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE;
/** 分享feeds评论内容的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT;
/** 分享feeds摘要的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY;
/** 分享feeds展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE;
/** 分享feeds跳转链接url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL;
/** 分享feeds点击操作默认行为的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT;
///@}
/**
* \name 设置头像参数字段定义
*/
///@{
/** 头像图片数据的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC;
/** 头像图片文件名的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME;
///@}
/**
* \name 服务器返回数据的参数字段定义
*/
///@{
/** 服务器返回码的key */
FOUNDATION_EXTERN NSString * const PARAM_RETCODE;
/** 服务器返回错误信息的key */
FOUNDATION_EXTERN NSString * const PARAM_MESSAGE;
/** 服务器返回额外数据的key */
FOUNDATION_EXTERN NSString * const PARAM_DATA;
///@}
/**
* \name 错误信息相关常量定义
*/
///@{
/** 详细错误信息字典中额外信息的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo;
/** 详细错误信息字典中返回码的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode;
/** 详细错误信息字典中错误语句的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg;
/** 不支持的接口 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI;
/** 操作成功 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess;
/** 未知错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown;
/** 用户取消 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel;
/** 请重新登录 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin;
/** 应用没有操作权限 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny;
/** 网络异常或没有网络 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork;
/** URL格式或协议错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL;
/** 解析数据出错 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse;
/** 传入参数有误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam;
/** 连接超时 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout;
/** 安全问题 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity;
/** 文件读写错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO;
/** 服务器端错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer;
/** 页面错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage;
/** 设置头像图片过大 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge;
/** 用户未同意授权隐私协议 */
FOUNDATION_EXPORT NSString * const TCOpenSDKErrorMsgUserNotAgreedAuthorization;
///@}
/**
* \brief SDK新增详细错误常量
*/
typedef enum
{
kOpenSDKInvalid = -1, ///< 无效的错误码
kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口
/**
* \name CommonErrorCode
* 公共错误码
*/
///@{
kOpenSDKErrorSuccess = 0, ///< 成功
kOpenSDKErrorUnknown, ///< 未知错误
kOpenSDKErrorUserCancel, ///< 用户取消
kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录
kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限
///@}
/**
* \name NetworkRelatedErrorCode
* 网络相关错误码
*/
///@{
kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器
kOpenSDKErrorURL, ///< URL格式或协议错误
kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错
kOpenSDKErrorParam, ///< 传入参数错误
kOpenSDKErrorConnTimeout, ///< http连接超时
kOpenSDKErrorSecurity, ///< 安全问题
kOpenSDKErrorIO, ///< 下载和文件IO错误
kOpenSDKErrorServer, ///< 服务器端错误
///@}
/**
* \name WebViewRelatedError
* webview特有错误
*/
///@{
kOpenSDKErrorWebPage, ///< 页面错误
///@}
/**
* \name SetUserHeadRelatedErrorCode
* 设置头像自定义错误码段
*/
///@{
kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码
///@}
} OpenSDKError;
/**
* \name SDK版本(v1.3)支持的授权列表常量
*/
///@{
/** 发表一条说说到QQ空间(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;
/** 创建一个QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;
/** 上传一张照片到QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;
/** 获取用户QQ空间相册列表(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;
/** 验证是否认证空间粉丝 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;
/** 获取登录用户自己的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;
/** 获取其他用户的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;
/** 获取会员用户基本信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;
/** 获取会员用户详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;
/** 获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;
/** 移动端获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;
/** 移动端获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ALL;
///@}
/**
* \name CGI接口相关参数类型定义
*/
/** 必填的字符串类型参数 */
typedef NSString *TCRequiredStr;
/** 必填的UIImage类型参数 */
typedef UIImage *TCRequiredImage;
/** 必填的整型参数 */
typedef NSInteger TCRequiredInt;
/** 必填的数字类型 */
typedef NSNumber *TCRequiredNumber;
/** 必填的NSData参数 */
typedef NSData *TCRequiredData;
/** 可选的字符串类型参数 */
typedef NSString *TCOptionalStr;
/** 可选的UIImage类型参数 */
typedef UIImage *TCOptionalImage;
/** 可选的整型参数 */
typedef NSInteger TCOptionalInt;
/** 可选的数字类型 */
typedef NSNumber *TCOptionalNumber;
/** 可选的不定类型参数 */
typedef id TCRequiredId;
///@}
/**
* \brief CGI请求的参数字典封装辅助基类
*
* 将相应属性的值以key-value的形式保存到参数字典中
*/
@interface TCAPIRequest : NSMutableDictionary
/** CGI请求的URL地址 */
@property (nonatomic, readonly) NSURL *apiURL;
/** CGI请求方式"GET""POST" */
@property (nonatomic, readonly) NSString *method;
/**
* API参数中的保留字段可以塞入任意字典支持的类型再调用完成后会带回给调用方
*/
@property (nonatomic, strong) TCRequiredId paramUserData;
/**
* APIResponse,API的返回结果
*/
@property (nonatomic, readonly) APIResponse *response;
/** 取消相应的CGI请求任务 */
- (void)cancel;
@end
@protocol TCAPIRequestDelegate <NSObject>
@optional
- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response;
@end

View File

@@ -0,0 +1,555 @@
///
/// \file TencentOAuth.h
/// \brief QQ互联开放平台授权登录及相关开放接口实现类
///
/// Created by Tencent on 12-12-21.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <UIKit/UIKit.h>
#import "SDKDef.h"
@protocol TencentSessionDelegate;
@protocol TencentLoginDelegate;
@protocol TencentApiInterfaceDelegate;
@protocol TencentWebViewDelegate;
@class TencentApiReq;
@class TencentApiResp;
typedef NS_ENUM(NSUInteger, TencentAuthorizeState) {
kTencentNotAuthorizeState,
kTencentSSOAuthorizeState,
kTencentWebviewAuthorzieState,
};
typedef NS_ENUM(NSUInteger, TencentAuthMode) {
kAuthModeClientSideToken,
kAuthModeServerSideCode,
};
#pragma mark - TencentOAuth(授权登录及相关开放接口调用)
/**
* \brief TencentOpenAPI授权登录及相关开放接口调用
*
* TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用
*/
@interface TencentOAuth : NSObject {
NSMutableDictionary *_apiRequests;
}
/** Access Token凭证用于后续访问各开放接口 */
@property(nonatomic, copy) NSString *accessToken;
/** Access Token的失效期 */
@property(nonatomic, strong) NSDate *expirationDate;
/** 已实现的开放接口的回调委托对象 */
@property(nonatomic, weak) id<TencentSessionDelegate> sessionDelegate;
/** 第三方应用在开发过程中设置的URLSchema用于浏览器登录后后跳到第三方应用 */
@property(nonatomic, copy) NSString *localAppId;
/** 用户授权登录后对该用户的唯一标识 */
@property(nonatomic, copy) NSString *openId;
/** 用户登录成功过后的跳转页面地址 */
@property(nonatomic, copy) NSString *redirectURI;
/** 第三方应用在互联开放平台申请的appID */
@property(nonatomic, copy) NSString *appId;
/** 第三方应用在互联开放平台注册的UniversalLink */
@property(nonatomic, copy) NSString *universalLink;
/** 主要是互娱的游戏设置uin */
@property(nonatomic, copy) NSString *uin;
/** 主要是互娱的游戏设置鉴定票据 */
@property(nonatomic, copy) NSString *skey;
/** 登陆透传的数据 */
@property(nonatomic, copy) NSDictionary *passData;
/** 授权方式(Client Side Token或者Server Side Code) */
@property(nonatomic, assign) TencentAuthMode authMode;
/** union id */
@property(nonatomic, copy) NSString *unionid;
/** 第三方在授权登录/分享 时选择 QQ还是TIM 。在授权前一定要指定其中一个类型*/
@property(nonatomic, assign) TencentAuthShareType authShareType;
/** SDK打开web登录页支持自动填充账号 */
@property (nonatomic, copy) NSString *defaultUin;
/**
* 获取上次登录得到的token
*
**/
- (NSString *)getCachedToken;
/**
* 获取上次登录得到的openid
*
**/
- (NSString *)getCachedOpenID;
/**
* 获取上次登录的token过期日期
*
**/
- (NSDate *)getCachedExpirationDate;
/**
* 上次登录的token是否过期(本地判断)
**/
- (BOOL)isCachedTokenValid;
/**
* 删除上次登录登录的token信息
*
**/
- (BOOL)deleteCachedToken;
/**
* 删除openid
*
**/
- (void)deleteOpenId;
/**
* 用来获得当前sdk的版本号
* \return 返回sdk版本号
**/
+ (NSString *)sdkVersion;
/**
* 用来获得当前sdk的小版本号
* \return 返回sdk小版本号
**/
+ (NSString *)sdkSubVersion;
/**
* 用来获得当前sdk的是否精简版
* @return 返回YES表示精简版
**/
+ (BOOL)isLiteSDK;
/**
* 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果
* \return
* kTencentNotAuthorizeState:无授权
* kTencentSSOAuthorizeState:有人发起了sso授权但无返回
* kTencentWebviewAuthorzieState:有人发起了webview授权还未返回
**/
+ (TencentAuthorizeState *)authorizeState;
/**
* 获取TencentOAuth单例
*/
+ (instancetype)sharedInstance;
/**
* 设置SDK参数
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param enableUniveralLink 默认为NO第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式启用后则在iOS9及以上的系统都会生效UniversalLink方式否则默认仅在iOS13及以上的系统生效UniversalLink方式。
* @param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成UniversalLink详见官网说明
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
*
* @note
* 使用说明】
* 1、支持sdk与手Q的交互切换为UniversalLink模式主要目的"是为了避免手Q的UrlScheme被其他应用抢注后导致sdk接口功能受到影响"。
* 2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink所以一旦开启了enabled开关“务必做到”及时知会用户升级手Q版本。
*
*/
- (void)setupAppId:(NSString *)appId
enableUniveralLink:(BOOL)enableUniveralLink
universalLink:(NSString *)universalLink
delegate:(id<TencentSessionDelegate>)delegate;
/**
* 初始化TencentOAuth对象
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* @return 初始化后的授权登录对象
*
* 推荐使用初始化方法并且适配UniversalLink
* - (instancetype)initWithAppId:(NSString *)appId
* enableUniveralLink:(BOOL)enabled
* universalLink:(NSString *)universalLink
* delegate:(id<TencentSessionDelegate>)delegate;
*/
- (instancetype)initWithAppId:(NSString *)appId
andDelegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 初始化TencentOAuth对象>=3.3.7
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @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版本。
*
* 推荐使用初始化方法并且适配UniversalLink
* - (instancetype)initWithAppId:(NSString *)appId
* enableUniveralLink:(BOOL)enabled
* universalLink:(NSString *)universalLink
* delegate:(id<TencentSessionDelegate>)delegate;
*
*/
- (instancetype)initWithAppId:(NSString *)appId
andUniversalLink:(NSString *)universalLink
andDelegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 初始化TencentOAuth对象>=3.3.8
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param enabled 默认为NO第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式启用后则在iOS9及以上的系统都会生效UniversalLink方式否则默认仅在iOS13及以上的系统生效UniversalLink方式。
* @param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成UniversalLink详见官网说明
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* @return 初始化后的授权登录对象
*
* @note
* 使用说明】
* 1、支持sdk与手Q的交互切换为UniversalLink模式主要目的"是为了避免手Q的UrlScheme被其他应用抢注后导致sdk接口功能受到影响"。
* 2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink所以一旦开启了enabled开关“务必做到”及时知会用户升级手Q版本。
*
*/
- (instancetype)initWithAppId:(NSString *)appId
enableUniveralLink:(BOOL)enabled
universalLink:(NSString *)universalLink
delegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 设置用户是否已经授权同意授权隐私协议在主体应用中用户同意授权隐私协议后再初始化互联SDK默认未同意授权
* 注意如未同意授权隐私协议则互联SDK的所有功能都无法使用包括初始化
* 从3.5.7版本开始支持该方法
*
* @param isAgreedAuthorization 是否已经授权isAgreedAuthorization=YES, 表示已经同意授权isAgreedAuthorization=NO表示未同意授权互联SDK的所有功能都无法使用
*/
+ (void)setIsUserAgreedAuthorization:(BOOL)isUserAgreedAuthorization;
/**
* 获取当前用户是否已经同意授权隐私协议
* 从3.5.7版本开始支持该方法
*/
+ (BOOL)isUserAgreedAuthorization;
/**
* 判断用户手机上是否安装手机QQ
* @return YES:安装 NO:没安装
*
* @note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneQQInstalled;
/**
* 判断用户手机上是否安装手机TIM
* @return YES:安装 NO:没安装
*
* @note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneTIMInstalled;
/**
* 发起授权登录如果安装了QQ APP则拉起QQ发起授权登录如果为安装QQ APP则在第三方应用进入H5页面输入账密授权登录。
*
* @param permissions 授权信息列
* @return 发起调用是否成功
*/
- (BOOL)authorize:(NSArray *)permissions;
/**
* 发起授权登录, 在第三方应用进入H5页面显示二维码通过扫码完成授权登录
*
* @param permissions 授权信息列
* @return 发起调用结果
*/
- (BOOL)authorizeWithQRlogin:(NSArray *)permissions;
/**
* 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权
* @param permissions 需增量授权的信息列表
* @return 发起增量授权调用是否成功
*/
- (BOOL)incrAuthWithPermissions:(NSArray *)permissions;
/**
* 重新授权因token废除或失效导致接口调用失败需用户重新授权
* @param permissions 授权信息列表,同登录授权
* @return 重新授权调用是否成功
*/
- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions;
/**
* 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户
* 通过代理方法:- (void)didGetUnionID;返回请求结果。
*
* @return NO未登录信息不足YES条件满足发送请求成功请等待回调
*/
- (BOOL)RequestUnionId;
/**
* (静态方法)处理应用拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示成功NO表示失败
*/
+ (BOOL)HandleOpenURL:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示可以 NO表示不行
*/
+ (BOOL)CanHandleOpenURL:(NSURL *)url;
/**
* (静态方法)处理应用的UniversalLink拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示成功NO表示失败
*/
+ (BOOL)HandleUniversalLink:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用的Universallink拉起协议
* @param url 处理被其他应用呼起时的逻辑(应用的Universallink链接须满足官网注册时的格式要求)
* @return 处理结果YES表示可以 NO表示不行
* 注在调用其他Universallink相关处理接口之前均需进行此项判断
*/
+ (BOOL)CanHandleUniversalLink:(NSURL *)url;
/**
* (静态方法)获取TencentOAuth调用的上一次错误信息
*/
+ (NSString *)getLastErrorMsg;
/**
* 以Server Side Code模式授权登录时通过此接口获取返回的code值;
* 以Client Side Token模式授权登录时忽略此接口。
*/
- (NSString *)getServerSideCode;
/**
* 退出登录(退出登录后TecentOAuth失效需要重新初始化)
* @param delegate 第三方应用用于接收请求返回结果的委托对象
*/
- (void)logout:(id<TencentSessionDelegate>)delegate;
/**
* 判断登录态是否有效
* @return 处理结果YES表示有效NO表示无效请用户重新登录授权
*/
- (BOOL)isSessionValid;
/**
* 获取用户个人信息
* @return 处理结果YES表示API调用成功NO表示API调用失败登录态失败重新登录
*/
- (BOOL)getUserInfo;
/**
* 退出指定API调用
* @param userData 用户调用某条API的时候传入的保留参数
* @return 处理结果YES表示成功 NO表示失败
*/
- (BOOL)cancel:(id)userData;
/**
* CGI类任务创建接口
* @param apiURL CGI请求的URL地址
* @param method CGI请求方式"GET""POST"
* @param params CGI请求参数字典
* @param callback CGI请求结果的回调接口对象
* @return CGI请求任务实例用于取消任务返回nil代表任务创建失败
*/
- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id<TCAPIRequestDelegate>)callback;
/**
* TencentOpenApi发送任务统一接口
* @param request 请求发送的任务
* @param callback 任务发送后的回调地址
*/
- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id<TCAPIRequestDelegate>)callback;
/**
* 获得用户的openId,仅有内存缓存
* @return 返回openId
*/
- (NSString *)getUserOpenID;
/**
* 获取appSignToken
* @return 返回appSignToken
*/
+ (NSString *)getAppSignToken;
/**
* 设置appSignToken跨进程的应用可以通过该方法手动设置appSignToken
*/
+ (void)setupAppSignToken:(NSString *)appSignToken;
@end
#pragma mark - TencentLoginDelegate(授权登录回调协议)
/**
* \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用实现登录的回调协议
*/
@protocol TencentLoginDelegate <NSObject>
@required
/**
* 登录成功后的回调
*/
- (void)tencentDidLogin;
/**
* 登录失败后的回调
* \param cancelled 代表用户是否主动退出登录
*/
- (void)tencentDidNotLogin:(BOOL)cancelled;
/**
* 登录时网络有问题的回调
*/
- (void)tencentDidNotNetWork;
@optional
/**
* 登录时权限信息的获得
*/
- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams __attribute__((deprecated("该接口已过期, 建议删除调用")));
/**
* unionID获得
*/
- (void)didGetUnionID;
/**
* 强制网页登录,包括账号密码登录和二维码登录
* return YES时就算本地有手Q也会打开web界面
*/
- (BOOL)forceWebLogin;
/* 获得appSignToken回调 */
- (void)tencentDidGetAppSignToken:(NSString *)appSignToken;
@end
#pragma mark - TencentSessionDelegate(开放接口回调协议)
/**
* \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用需要实现每条需要调用的API的回调协议
*/
@protocol TencentSessionDelegate <NSObject, TencentLoginDelegate, TencentWebViewDelegate>
@optional
/**
* 退出登录的回调
*/
- (void)tencentDidLogout;
/**
* 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时如果服务器返回操作未被授权则触发该回调协议接口由第三方决定是否跳转到增量授权页面让用户重新授权。
* @param tencentOAuth 登录授权对象。
* @param permissions 需增量授权的权限列表。
* @return 是否仍然回调返回原始的api请求结果。
* @note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意增量授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions;
/**
* [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时如果服务器返回token失效则触发该回调协议接口由第三方决定是否跳转到登录授权页面让用户重新授权。
* @param tencentOAuth 登录授权对象。
* @return 是否仍然回调返回原始的api请求结果。
* @note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意重新登录授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth;
/**
* 用户通过增量授权流程重新授权登录token及有效期限等信息已被更新。
* @param tencentOAuth token及有效期限等信息更新后的授权实例对象
* @note 第三方应用需更新已保存的token及有效期限等信息。
*/
- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth;
/**
* 用户增量授权过程中因取消或网络问题导致授权失败
* @param reason 授权失败原因具体失败原因参见sdkdef.h文件中\ref UpdateFailType
*/
- (void)tencentFailedUpdate:(UpdateFailType)reason;
/**
* 获取用户个人信息回调
* @param response API返回结果具体定义参见sdkdef.h文件中\ref APIResponse
* @remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success
* 错误返回示例: \snippet example/getUserInfoResponse.exp fail
*/
- (void)getUserInfoResponse:(APIResponse*) response;
/**
* 社交API统一回调接口
* @param response API返回结果具体定义参见sdkdef.h文件中\ref APIResponse
* @param message 响应的消息目前支持SendStory,AppInvitationAppChallengeAppGiftRequest
*/
- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message;
/**
* post请求的上传进度
* @param tencentOAuth 返回回调的tencentOAuth对象
* @param bytesWritten 本次回调上传的数据字节数
* @param totalBytesWritten 总共已经上传的字节数
* @param totalBytesExpectedToWrite 总共需要上传的字节数
* @param userData 用户自定义数据
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData;
/**
* 通知第三方界面需要被关闭
* @param tencentOAuth 返回回调的tencentOAuth对象
* @param viewController 需要关闭的viewController
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController;
@end
#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调)
/**
* @brief TencentWebViewDelegate: H5登录webview旋转方向回调协议
*
* 第三方应用可以根据自己APP的旋转方向限制通过此协议设置
*/
@protocol TencentWebViewDelegate <NSObject>
@optional
- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit;
- (BOOL) tencentWebViewShouldAutorotateWithWebkit;
@end

View File

@@ -0,0 +1,24 @@
//
// TencentOpenApiUmbrellaHeader.h
// TencentOpenApi_IOS
//
// Created by jyukeizhang(张储祺) on 2020/7/27.
// Copyright © 2020 Tencent. All rights reserved.
//
#ifndef TencentOpenApiUmbrellaHeader_h
#define TencentOpenApiUmbrellaHeader_h
#import <Foundation/Foundation.h>
FOUNDATION_EXPORT double StaticLibraryModuleVersionNumber;
FOUNDATION_EXPORT const unsigned char StaticLibraryModuleVersionString[];
#import "QQApiInterface.h"
#import "QQApiInterfaceObject.h"
#import "SDKDef.h"
#import "TencentOAuth.h"
#endif /* TencentOpenApiUmbrellaHeader_h */

View File

@@ -0,0 +1,36 @@
<?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>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>用户同意授权后仅用于UserID授权第三方应用登录。</string>
</array>
</dict>
</array>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>用于存储第三方授权登录结果数据,便于应用能快速访问授权登录结果数据</string>
</array>
</dict>
</array>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

View File

@@ -0,0 +1,4 @@
module TencentOpenApi{
umbrella header "TencentOpenApiUmbrellaHeader.h"
export *
}

View File

@@ -0,0 +1,220 @@
///
/// \file QQApiInterface.h
/// \brief QQApi接口简化封装
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import "QQApiInterfaceObject.h"
typedef void (^sendResultBlock)(NSDictionary *result);
// 发送消息回调是否发送成功
typedef void(^QQApiInterfaceSendMessageResultBlock)(QQApiSendResultCode sendResultCode, NSString *message);
/**
\brief 处理来至QQ的请求及响应的回调协议
*/
@protocol QQApiInterfaceDelegate <NSObject>
/**
处理来至QQ的请求
*/
- (void)onReq:(QQBaseReq *)req;
/**
处理来至QQ的响应
*/
- (void)onResp:(QQBaseResp *)resp;
/**
处理QQ在线状态的回调
*/
- (void)isOnlineResponse:(NSDictionary *)response;
@end
/**
\brief 对QQApi的简单封装类
*/
@interface QQApiInterface : NSObject
/**
处理由手Q唤起的普通跳转请求
\param url 待处理的url跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果YES表示成功处理NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
处理由手Q唤起的universallink跳转请求
\param universallink 待处理的universallink跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果YES表示成功处理NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenUniversallink:(NSURL*)universallink delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
向手Q发起分享请求
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendReq:(QQBaseReq *)req;
/**
向手Q QZone结合版发起分享请求
\note H5分享只支持单张网络图片的传递
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req;
/**
向手Q发起设置QQ头像
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToQQAvatarWithReq:(QQBaseReq*)req;
+ (QQApiSendResultCode)sendMessageToQQAuthWithReq:(QQBaseReq*)req;
/**
向手Q发起绑群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppBindGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起加群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppJoinGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起解绑群请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendThirdAppUnBindGroupReq:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起创建QQ频道的请求
\param req 请求的内容
\param resultBlock 回调发送结果
\return void
*/
+ (void)sendMessageToCreateQQGroupProWithMessageRequest:(SendMessageToQQReq *)messageRequest sendResultBlock:(QQApiInterfaceSendMessageResultBlock)sendResultBlock;
/**
向手Q发起加入QQ频道的请求
\param req 请求的内容
\param resultBlock 回调发送结果
\return void
*/
+ (void)sendMessageToJoinQQGroupProWithMessageRequest:(SendMessageToQQReq *)messageRequest sendResultBlock:(QQApiInterfaceSendMessageResultBlock)sendResultBlock;
/**
向手Q发起查询QQ频道openID的请求
\param req 请求的内容
\param resultBlock 请求回调
*/
+ (void)sendQueryQQGroupProInfo:(QQBaseReq *)req resultBlock:(sendResultBlock)resultBlock;
/**
向手Q发起组图分享到表情收藏
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToFaceCollectionWithReq:(QQBaseReq*)req;
/**
检测是否已安装QQ
\return 如果QQ已安装则返回YES否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isQQInstalled;
/**
检测是否已安装TIM
\return 如果TIM已安装则返回YES否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isTIMInstalled;
/**
检测QQ是否支持API调用
\return 如果当前安装QQ版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isQQSupportApi;
/**
检测TIM是否支持API调用
\return 如果当前安装TIM版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isTIMSupportApi __attribute__((deprecated("已过期, 建议删除调用调用地方用YES替代。")));
/**
检测是否支持分享
\return 如果当前已安装QQ且QQ版本支持API调用 或者 当前已安装TIM且TIM版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isSupportShareToQQ;
/**
检测是否支持分享到QQ结合版QZone
\return 如果当前已安装QQ且QQ版本支持API调用则返回YES否则返回NO
*/
+ (BOOL)isSupportPushToQZone;
/**
获取QQ下载地址
如果App通过<code>QQApiInterface#isQQInstalled</code>和<code>QQApiInterface#isQQSupportApi</code>检测发现QQ没安装或当前版本QQ不支持API调用可引导用户通过打开此链接下载最新版QQ。
\return iPhoneQQ下载地址
*/
+ (NSString *)getQQInstallUrl;
/**
获取TIM下载地址
如果App通过<code>QQApiInterface#isTIMInstalled</code>检测发现TIM没安装或当前版本TIM不支持API调用可引导用户通过打开此链接下载最新版TIM。
\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

@@ -0,0 +1,754 @@
///
/// \file QQApiInterfaceObject.h
/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#ifndef QQApiInterface_QQAPIOBJECT_h
#define QQApiInterface_QQAPIOBJECT_h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, QQApiSendResultCode) {
EQQAPISENDSUCESS = 0,
EQQAPIQQNOTINSTALLED = 1, // QQ未安装
EQQAPIQQNOTSUPPORTAPI = 2, // QQ api不支持
EQQAPIMESSAGETYPEINVALID = 3,
EQQAPIMESSAGECONTENTNULL = 4,
EQQAPIMESSAGECONTENTINVALID = 5,
EQQAPIAPPNOTREGISTED = 6,
EQQAPIAPPSHAREASYNC = 7,
EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, // QQ api不支持 && SDK显示error提示已废弃
EQQAPIMESSAGEARKCONTENTNULL = 9, // ark内容为空
EQQAPIMESSAGE_MINI_CONTENTNULL = 10, // 小程序参数为空
EQQAPISENDFAILD = -1, // 发送失败
EQQAPISHAREDESTUNKNOWN = -2, // 未指定分享到QQ或TIM
EQQAPITIMSENDFAILD = -3, // 发送失败
EQQAPITIMNOTINSTALLED = 11, // TIM未安装
EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持
EQQAPI_INCOMING_PARAM_ERROR = 13, // 外部传参错误
EQQAPI_THIRD_APP_GROUP_ERROR_APP_NOT_AUTHORIZIED = 14, // APP未获得授权
EQQAPI_THIRD_APP_GROUP_ERROR_CGI_FAILED = 15, // CGI请求失败
EQQAPI_THIRD_APP_GROUP_ERROR_HAS_BINDED = 16, // 该组织已经绑定群聊
EQQAPI_THIRD_APP_GROUP_ERROR_NOT_BINDED = 17, // 该组织尚未绑定群聊
EQQAPI_THIRD_APP_GROUP_ERROR_HAS_UNBINDED = 18, // 该组织已经解绑群聊
EQQAPI_IMAGE_SIZE_OUT_OF_BOUNND = 19, // 图片大小超过限制图片不能超过5M缩略图不能超过1M
EQQAPI_TITLE_LENGTH_OUT_OF_BOUNND = 20, // 标题长度超过限制不能超过128
EQQAPI_TITLE_NIL_ERROR = 21, // 标题不能为空
EQQAPI_DESC_LENGTH_OUT_OF_BOUNND = 22, // 描述信息长度超过限制不能超过512
EQQAPI_URL_LENGTH_OUT_OF_BOUNND = 23, // URL参数长度超过限制不能超过1024
EQQAPI_URL_NIL_ERROR = 24, // URL参数不能为空
EQQAPIQZONENOTSUPPORTTEXT = 10000, // qzone分享不支持text类型分享
EQQAPIQZONENOTSUPPORTIMAGE = 10001, // qzone分享不支持image类型分享
EQQAPIVERSIONNEEDUPDATE = 10002, // 当前QQ版本太低需要更新至新版本才可以支持
ETIMAPIVERSIONNEEDUPDATE = 10004, // 当前TIM版本太低需要更新至新版本才可以支持
EAPPURLTYPESILLEGALITY = 20000, // (>=3.3.8)第三方APP的info.plist中UrlTypes字段存在QQ的UrlScheme
EQQAPI_ERROR_USER_NOT_AGREED_AUTHORIZATION = 30001, // 用户未同意隐私协议,用户同意隐私协议后,需要设置[TencentOAuth setIsUserAgreedAuthorization:YES];
};
#pragma mark - QQApiObject(分享对象类型)
// QQApiObject control flags
typedef NS_ENUM(NSUInteger,kQQAPICtrlFlag) {
kQQAPICtrlFlagQZoneShareOnStart = 0x01,
kQQAPICtrlFlagQZoneShareForbid = 0x02, //屏蔽好友选择器上的空间入口
kQQAPICtrlFlagQQShare = 0x04,
kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏
kQQAPICtrlFlagQQShareDataline = 0x10, //数据线
kQQAPICtrlFlagQQShareEnableArk = 0x20, //支持ARK
kQQAPICtrlFlagQQShareEnableMiniProgram = 0x40, //支持小程序
};
// 分享到QQ或TIM
typedef NS_ENUM(NSUInteger, ShareDestType) {
ShareDestTypeQQ = 0,
ShareDestTypeTIM,
};
//小程序的类型
typedef NS_ENUM(NSUInteger, MiniProgramType) {
MiniProgramType_Develop = 0, // 开发版
MiniProgramType_Test = 1, // 测试版
MiniProgramType_Online = 3, // 正式版,默认
MiniProgramType_Preview = 4, // 预览版
};
/// 打印回调的block
typedef void(^QQApiLogBolock)(NSString *logStr);
// QQApiObject
/** \brief 所有在QQ及插件间发送的数据对象的根类。
*/
__attribute__((visibility("default"))) @interface QQApiObject : NSObject
@property (nonatomic, copy) NSString *title; ///< 标题最长128个字符
@property (nonatomic, copy) NSString *description; ///<简要描述最长512个字符
@property (nonatomic, copy) NSString *universalLink; ///(>=3.3.7)支持第三方传入在互联开放平台注册的universallink
@property (nonatomic, assign) uint64_t cflag;
//353新增两个字断给游戏侧使用对齐微信sdk
@property (nonatomic, copy) NSString *tagName;
@property (nonatomic, copy) NSString *messageExt;
/*
* 分享到QQ/TIM
* SDK根据是否安装对应客户端进行判断判断顺序QQ > TIM
* 默认分享到QQ如果QQ未安装检测TIM是否安装
*/
@property (nonatomic, assign) ShareDestType shareDestType;
/**
* 检查参数是否完整有效
* @return 检查参数结果
*/
- (QQApiSendResultCode)checkParamValid;
@end
// ArkObject
/** \brief 支持Ark的根类。
*/
__attribute__((visibility("default"))) @interface ArkObject : NSObject
@property (nonatomic, copy) NSString *arkData; ///< 显示Ark所需的数据json串长度暂不限制
@property (nonatomic, strong) QQApiObject* qqApiObject; ///<原有老版本的QQApiObject
- (id)initWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
+ (id)objectWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
@end
#pragma mark QQ小程序
//分享小程序消息 - QQ 8.0.8
__attribute__((visibility("default"))) @interface QQApiMiniProgramObject : NSObject
@property (nonatomic, strong) QQApiObject* qqApiObject; //原有老版本的QQApiObject
@property (nonatomic, copy) NSString *miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定
@property (nonatomic, copy) NSString *miniPath; //必填,小程序的展示路径
@property (nonatomic, copy) NSString *webpageUrl; //必填,兼容低版本的网页链接
@property (nonatomic, assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、预览版(4)
@end
//唤起小程序 - QQ 8.1.8
__attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject
@property (nonatomic, copy) NSString *miniAppID; //必填小程序的AppId必须在QQ互联平台中将该小程序与分享的App绑定
@property (nonatomic, copy) 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>
<TABLE>
<TR><TD>error</TD><TD>errorDescription</TD><TD>注释</TD></TR>
<TR><TD>0</TD><TD>nil</TD><TD>成功</TD></TR>
<TR><TD>-1</TD><TD>param error</TD><TD>参数错误</TD></TR>
<TR><TD>-2</TD><TD>group code is invalid</TD><TD>该群不在自己的群列表里面</TD></TR>
<TR><TD>-3</TD><TD>upload photo failed</TD><TD>上传图片失败</TD></TR>
<TR><TD>-4</TD><TD>user give up the current operation</TD><TD>用户放弃当前操作</TD></TR>
<TR><TD>-5</TD><TD>client internal error</TD><TD>客户端内部处理错误</TD></TR>
</TABLE>
*/
__attribute__((visibility("default"))) @interface QQApiResultObject : QQApiObject
@property (nonatomic, copy) NSString *error; ///<错误
@property (nonatomic, copy) NSString *errorDescription; ///<错误描述
@property (nonatomic, copy) NSString *extendInfo; ///<扩展信息
@property (nonatomic, copy) NSDictionary *otherInfo; ///<其他扩展信息
@end
// QQApiTextObject
/** \brief 文本对象
*/
@interface QQApiTextObject : QQApiObject
@property (nonatomic, copy)NSString *text; ///<文本内容必填最长1536个字符
- (id)initWithText:(NSString *)text; ///<初始化方法
+ (id)objectWithText:(NSString *)text;///<工厂方法获取一个QQApiTextObject对象.
@end
// QQApiURLObject
typedef NS_ENUM(NSUInteger, QQApiURLTargetType) {
QQApiURLTargetTypeNotSpecified = 0x00,
QQApiURLTargetTypeAudio = 0x01,
QQApiURLTargetTypeVideo = 0x02,
QQApiURLTargetTypeNews = 0x03
};
/** @brief URL对象类型。
包括URL地址URL地址所指向的目标类型及预览图像。
*/
__attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject
/**
URL地址所指向的目标类型.
@note 参见QQApi.h 中的 QQApiURLTargetType 定义.
*/
@property (nonatomic)QQApiURLTargetType targetContentType;
@property (nonatomic, strong) NSURL *url; ///<URL地址,必填最长512个字符
@property (nonatomic, copy) NSData *previewImageData;///<预览图像数据最大1M字节
@property (nonatomic, strong) NSURL *previewImageURL; ///<预览图像URL **预览图像数据与预览图像URL可二选一
/**
初始化方法
*/
- (id)initWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data targetContentType:(QQApiURLTargetType)targetContentType;
- (id)initWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
/**
工厂方法,获取一个QQApiURLObject对象
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data targetContentType:(QQApiURLTargetType)targetContentType;
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
@end
// QQApiExtendObject
/** @brief 扩展数据类型
*/
@interface QQApiExtendObject : QQApiObject
@property (nonatomic, copy) NSData *data;///<具体数据内容必填最大5M字节
@property (nonatomic, copy) NSData *previewImageData;///<预览图像最大1M字节
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组(多图暂只支持分享到手机QQ收藏功能)
/**
初始化方法
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description;
/**
初始化方法
@param data 数据内容
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
*/
- (id)initWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData *)data previewImageData:(NSData *)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
@end
// QQApiImageObject
/** @brief 图片对象
用于分享图片内容的对象,是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageObject : QQApiExtendObject
@end
// QQApiImageForQQAvatarObject
/** @brief 图片对象
用于设置QQ头像内容的对象是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageForQQAvatarObject : QQApiExtendObject
@end
/**
* @brief 视频对象
* 用于设置动态头像
* assetURL可传ALAsset的ALAssetPropertyAssetURL或者PHAsset的localIdentifier
从手Q返回的错误码
//第三方设置动态头像结果
@"ret=0"//设置成功
@"ret=-10&error_des=user cancel"//用户取消设置
@"ret=-11&error_des=pasteboard have no video data"//剪切板没有数据
@"ret=-12&error_des=export data failed"//从剪切板导出数据到本地失败
@"ret=-13&error_des=url param invalid"//sdk传递过来的数据有误
@"ret=-14&error_des=video param invalid"//视频的参数不符合要求检测第三方视频源方案1、分辨率跟480*480保持一致2、视频长度0.5s8s
@"ret=-15&error_des=app authorised failed"//应用鉴权失败
@"ret=-16&error_des=upload video failed"//设置头像,上传到后台失败
@"ret=-17&error_des=account diff"//账号不一致
*/
@interface QQApiVideoForQQAvatarObject : QQApiExtendObject
@property (nonatomic, copy) NSString *assetURL;
@end
//QQApiAuthObject 用于拉起手Q的授权详情页
@interface QQApiAuthObject : QQApiObject
@end
// QQApiImageArrayForFaceCollectionObject
/** @brief 图片数组对象
用于分享图片组到表情收藏,是一个指定为图片类型的<code>QQApiObject</code>
*/
@interface QQApiImageArrayForFaceCollectionObject : QQApiObject
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组
/**
初始化方法
@param imageDataArray 图片数组
*/
- (id)initWithImageArrayData:(NSArray *)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiObject</code>对象
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray *)imageDataArray;
@end
// QQApiImageArrayForQZoneObject
/** @brief 图片对象
用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说<code>QQApiObject</code>
*/
@interface QQApiImageArrayForQZoneObject : QQApiObject
@property (nonatomic, copy) NSArray *imageDataArray;///图片数组
@property (nonatomic, copy) NSDictionary *extMap; // 扩展字段
/**
初始化方法
@param imageDataArray 图片数组
@param title 写说说的内容,可以为空
@param extMap 扩展字段
*/
- (id)initWithImageArrayData:(NSArray *)imageDataArray title:(NSString *)title extMap:(NSDictionary *)extMap;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param title 写说说的内容,可以为空
@param imageDataArray 发送的多张图片队列
@param extMap 扩展字段
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray *)imageDataArray title:(NSString *)title extMap:(NSDictionary *)extMap;
@end
// QQApiVideoForQZoneObject
/** @brief 视频对象
用于分享视频到空间,走写说说路径<code>QQApiObject</code>,assetURL和videoData两个参数必须设置至少一个参数如果assetURL设置了忽略videoData参数
@param assetURL可传ALAsset的ALAssetPropertyAssetURL或者PHAsset的localIdentifier
@param extMap 扩展字段
@param videoData 视频数据大小不超过50M
*/
@interface QQApiVideoForQZoneObject : QQApiObject
@property (nonatomic, copy) NSString *assetURL;
@property (nonatomic, copy) NSDictionary *extMap; // 扩展字段
@property (nonatomic, copy) NSData *videoData;
- (id)initWithAssetURL:(NSString *)assetURL title:(NSString *)title extMap:(NSDictionary *)extMap;
+ (id)objectWithAssetURL:(NSString *)assetURL title:(NSString *)title extMap:(NSDictionary *)extMap;
- (id)initWithVideoData:(NSData *)videoData title:(NSString *)title extMap:(NSDictionary *)extMap;
+ (id)objectWithVideoData:(NSData *)videoData title:(NSString *)title extMap:(NSDictionary *)extMap;
@end
// QQApiWebImageObject
/** @brief 图片对象
用于分享网络图片内容的对象是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持
原有的手q分享是不支持该类型的。
*/
@interface QQApiWebImageObject : QQApiObject
@property (nonatomic, strong) NSURL *previewImageURL; ///<预览图像URL
/**
初始化方法
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithPreviewImageURL:(NSURL *)previewImageURL title:(NSString *)title description:(NSString *)description;
/**
helper方法获取一个autorelease的<code>QQApiWebImageObject</code>对象
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
+ (id)objectWithPreviewImageURL:(NSURL *)previewImageURL title:(NSString *)title description:(NSString *)description;
@end
//QQApiFileObject
/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能)
用于分享文件内容的对象,是一个指定为文件类型的<code>QQApiExtendObject</code>
*/
@interface QQApiFileObject : QQApiExtendObject {
NSString *_fileName;
}
@property (nonatomic, copy)NSString *fileName;
@end
// QQApiAudioObject
/** @brief 音频URL对象
用于分享目标内容为音频的URL的对象
*/
@interface QQApiAudioObject : QQApiURLObject
@property (nonatomic, strong) NSURL *flashURL; ///<音频URL地址最长512个字符
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiVideoObject
/** @brief 视频URL对象
用于分享目标内容为视频的URL的对象
QQApiVideoObject类型的分享目前在Android和PC QQ上接收消息时展现有待完善待手机QQ版本以后更新支持
目前如果要分享视频,推荐使用 QQApiNewsObject 类型
*/
@interface QQApiVideoObject : QQApiURLObject
@property (nonatomic, strong) NSURL *flashURL; ///<视频URL地址最长512个字符
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiNewsObject
/** @brief 新闻URL对象
用于分享目标内容为新闻的URL的对象
*/
@interface QQApiNewsObject : QQApiURLObject
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageData:(NSData *)data;
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+ (id)objectWithURL:(NSURL *)url title:(NSString *)title description:(NSString *)description previewImageURL:(NSURL *)previewURL;
@end
// QQApiCommonContentObject;
/** @brief 通用模板类型对象
用于分享一个固定显示模板的图文混排对象
@note 图片列表和文本列表不能同时为空
*/
@interface QQApiCommonContentObject : QQApiObject
/**
预定义的界面布局类型
*/
@property (nonatomic,assign) unsigned int layoutType;
@property (nonatomic, copy) NSData *previewImageData;///<预览图
@property (nonatomic, copy) NSArray *textArray;///<文本列表
@property (nonatomic, copy) NSArray *pictureDataArray;///<图片列表
+ (id)objectWithLayoutType:(int)layoutType textArray:(NSArray *)textArray pictureArray:(NSArray *)pictureArray previewImageData:(NSData *)data;
/**
将一个NSDictionary对象转化为QQApiCommomContentObject如果无法转换则返回空
*/
+ (id)objectWithDictionary:(NSDictionary *)dic;
- (NSDictionary *)toDictionary;
@end
// QQApiExtraServiceObject; 通用业务消息处理类旧版后续使用QQApiCommonServiceObject
/**
@brief OpenSDK扩展支持的服务通用接口后续会扩充能力
@param serviceID [必选] 扩展支持的服务类型ID参考官方文档说明
@param openID [必选] 授权登录后对该用户的唯一标识
@param toUin [可选] 对方的QQ号码
@param extraInfo [可选] 扩展字段
@note 该接口的使用须先登录
*/
@interface QQApiExtraServiceObject : QQApiObject
@property (nonatomic, copy) NSString *serviceID;
@property (nonatomic, copy) NSString *openID;
@property (nonatomic, copy) NSString *toUin;
@property (nonatomic, copy) NSDictionary *extraInfo;
- (id)initWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
+ (id)objecWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
@end
/**
* QQApiCommonServiceObject; 通用业务消息处理类可以适用所有的需要通过互联SDK发消息给手Q的业务去处理。
* 使用前需要申请serviceID每个业务功能有个对应的serviceID
*/
@interface QQApiCommonServiceObject : QQApiObject
// [必选] 授权登录后对该用户的唯一标识
@property (nonatomic, copy) NSString *openID;
// [必选] 扩展支持的服务类型ID参考官方文档说明
@property (nonatomic, copy) NSString *serviceID;
// [可选] 扩展字段,由调用方跟具体的业务方协定具体的字段
@property (nonatomic, copy) NSDictionary *extendInfo;
- (instancetype)initWithOpenID:(NSString *)openID
serviceID:(NSString *)serviceID
extendInfo:(NSDictionary *)extendInfo;
+ (instancetype)objecWithOpenID:(NSString *)openID
serviceID:(NSString *)serviceID
extendInfo:(NSDictionary *)extendInfo;
@end
#pragma mark - QQApi请求消息类型
/**
QQApi请求消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceReqType) {
EGETMESSAGEFROMQQREQTYPE = 0, /// < 手Q -> 第三方应用请求第三方应用向手Q发送消息
ESENDMESSAGETOQQREQTYPE = 1, /// < 第三方应用 -> 手Q第三方应用向手Q分享消息
ESHOWMESSAGEFROMQQREQTYPE = 2, /// < 手Q -> 第三方应用,请求第三方应用展现消息中的数据
ESENDMESSAGEARKTOQQREQTYPE = 3, /// < 第三方应用 -> 手Q第三方应用向手Q分享Ark消息
ESENDMESSAGE_MINI_TOQQREQTYPE = 4 /// < 第三方应用 -> 手Q第三方应用向手Q分享小程序消息
};
/**
QQApi应答消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceRespType) {
ESHOWMESSAGEFROMQQRESPTYPE = 0, /// < 第三方应用 -> 手Q第三方应用应答消息展现结果
EGETMESSAGEFROMQQRESPTYPE = 1, /// < 第三方应用 -> 手Q第三方应用回应发往手Q的消息
ESENDMESSAGETOQQRESPTYPE = 2 /// < 手Q -> 第三方应用手Q应答处理分享消息的结果
};
/**
QQApi请求消息基类
*/
@interface QQBaseReq : NSObject
/** 请求消息类型,参见\ref QQApiInterfaceReqType */
@property (nonatomic, assign) int type;
@end
/**
QQApi应答消息基类
*/
@interface QQBaseResp : NSObject
/** 请求处理结果 */
@property (nonatomic, copy) NSString *result;
/** 具体错误描述信息 */
@property (nonatomic, copy) NSString *errorDescription;
/** 应答消息类型,参见\ref QQApiInterfaceRespType */
@property (nonatomic, assign) int type;
/** 扩展信息 */
@property (nonatomic, copy) NSString *extendInfo;
@end
/**
GetMessageFromQQReq请求帮助类
*/
@interface GetMessageFromQQReq : QQBaseReq
/**
创建一个GetMessageFromQQReq请求实例
*/
+ (GetMessageFromQQReq *)req;
@end
@interface SendMessageToQQReq : QQBaseReq
/**
创建一个SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message;
/**
创建一个支持Ark的SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithArkContent:(ArkObject *)message;
/**
* 创建一个支持小程序的消息请求实例
* @param miniMessage 小程序实例对象
* @return 消息请求实例
*/
+ (SendMessageToQQReq *)reqWithMiniContent:(QQApiMiniProgramObject *)miniMessage;
/** 具体分享消息 */
@property (nonatomic, strong) QQApiObject *apiObject;
/** 支持Ark的具体分享消息 */
@property (nonatomic, strong) ArkObject *arkObject;
/** 支持小程序的具体分享消息 */
@property (nonatomic, strong) QQApiMiniProgramObject *miniProgramObject;
@end
/**
SendMessageToQQResp应答帮助类
*/
@interface SendMessageToQQResp : QQBaseResp
/** 其他扩展信息 */
@property (nonatomic, copy) NSDictionary *otherInfo;
/**
创建一个SendMessageToQQResp应答实例
\param result 请求处理结果
\param errDesp 具体错误描述信息
\param extendInfo 扩展信息
\return 新创建的SendMessageToQQResp应答实例
*/
+ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString *)extendInfo;
+ (SendMessageToQQResp *) respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString *)extendInfo otherInfo:(NSDictionary *)otherInfo;
@end
/**
ShowMessageFromQQReq请求帮助类
*/
@interface ShowMessageFromQQReq : QQBaseReq
/**
创建一个ShowMessageFromQQReq请求实例
\param message 具体待展现消息实例
\return 新创建的ShowMessageFromQQReq请求实例
*/
+ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message;
/** 具体待展现消息 */
@property (nonatomic, strong) QQApiObject *message;
@end
#pragma mark --一键加群&建群&解绑群
// QQApiThirdAppBindGroupObject
/** \brief 第三方app绑定群
*/
@interface QQApiThirdAppBindGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
@property (nonatomic, copy) NSString *appDisplayName;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID appDisplayName:(NSString *)appDisplayName; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID appDisplayName:(NSString *)appDisplayName; ///<工厂方法获取一个QQApiThirdAppBindGroupObject对象.
@end
// QQApiThirdAppJoinGroupObject
/** \brief 第三方app加入群
*/
@interface QQApiThirdAppJoinGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID; ///<工厂方法获取一个QQApiThirdAppJoinGroupObject对象.
@end
// QQApiThirdAppUnBindGroupObject
/** \brief 第三方app解绑群
*/
@interface QQApiThirdAppUnBindGroupObject : QQApiObject
@property (nonatomic, copy) NSString *accessToken;
@property (nonatomic, copy) NSString *openId;
@property (nonatomic, copy) NSString *payToken;
@property (nonatomic, copy) NSString *pfkey;
@property (nonatomic, copy) NSString *unionID;
- (id)initWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID openId:(NSString *)openId appId:(NSString *)appId; ///<初始化方法
+ (id)objectWithAccessToken:(NSString *)accessToken payToken:(NSString *)payToken pfkey:(NSString *)pfkey unionID:(NSString *)unionID openId:(NSString *)openId appId:(NSString *)appId; ///<工厂方法获取一个QQApiThirdAppBindGroupObject对象.
@end
#endif

View File

@@ -0,0 +1,420 @@
///
/// \file sdkdef.h
/// \brief SDK中相关常量定义
///
/// Created by Tencent on 12-12-25.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* \brief 设置sdk的log等级
*/
typedef enum {
TCOLogLevel_Disabled = -1, // 关闭所有log
TCOLogLevel_Error = 0,
TCOLogLevel_Warning,
TCOLogLevel_Info,
TCOLogLevel_Debug,
} TCOLogLevel;
/**
* \breif 授权/分享 方式
*/
typedef enum TencentAuthShareType {
AuthShareType_QQ,
AuthShareType_TIM,
}TencentAuthShareType;
/**
* \brief APIResponse.retCode可能的枚举常量
*/
typedef enum
{
URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确
* \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致
*/
URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */
} REPONSE_RESULT;
/**
* \brief 增量授权失败原因
*
* \note 增量授权失败不影响原token的有效性原token已失效的情况除外
*/
typedef enum
{
kUpdateFailUnknown = 1, ///< 未知原因
kUpdateFailUserCancel, ///< 用户取消
kUpdateFailNetwork, ///< 网络问题
} UpdateFailType;
/**
* \brief 封装服务器返回的结果
*
* APIResponse用于封装所有请求的返回结果包括错误码、错误信息、原始返回数据以及返回数据的json格式字典
*/
@interface APIResponse : NSObject<NSSecureCoding> {
int _detailRetCode;
int _retCode;
int _seq;
NSString *_errorMsg;
NSDictionary *_jsonResponse;
NSString *_message;
id _userData;
}
/**
* 新增的详细错误码\n
* detailRetCode主要用于区分不同的错误情况参见\ref OpenSDKError
*/
@property (nonatomic, assign) int detailRetCode;
/**
* 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n
* retCode具体取值可参考\ref REPONSE_RESULT
*/
@property (nonatomic, assign) int retCode;
/**
* 网络请求对应的递增序列号,方便内部管理
*/
@property (nonatomic, assign) int seq;
/**
* 错误提示语
*/
@property (nonatomic, copy) NSString *errorMsg;
/**
* 服务器返回数据的json格式字典\n
* 字典内具体参数的命名和含义请参考\ref api_spec
*/
@property (nonatomic, copy) NSDictionary *jsonResponse;
/**
* 服务器返回的原始数据字符串
*/
@property (nonatomic, copy) NSString *message;
/**
* 用户保留数据
*/
@property (nonatomic, strong) id userData;
@end
/**
* 用户自定义的保留字段
*/
FOUNDATION_EXTERN NSString * const PARAM_USER_DATA;
/**
* \name 应用邀请参数字段定义
*/
///@{
/** 应用邀请展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_ICON;
/** 应用邀请描述文本的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_DESC;
/** 应用邀请好友列表的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS;
///@}
/**
* \name sendStory新分享参数字段定义
*/
///@{
/** 预填入接受人列表的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER;
/** 分享feeds标题的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE;
/** 分享feeds评论内容的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT;
/** 分享feeds摘要的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY;
/** 分享feeds展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE;
/** 分享feeds跳转链接url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL;
/** 分享feeds点击操作默认行为的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT;
///@}
/**
* \name 设置头像参数字段定义
*/
///@{
/** 头像图片数据的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC;
/** 头像图片文件名的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME;
///@}
/**
* \name 服务器返回数据的参数字段定义
*/
///@{
/** 服务器返回码的key */
FOUNDATION_EXTERN NSString * const PARAM_RETCODE;
/** 服务器返回错误信息的key */
FOUNDATION_EXTERN NSString * const PARAM_MESSAGE;
/** 服务器返回额外数据的key */
FOUNDATION_EXTERN NSString * const PARAM_DATA;
///@}
/**
* \name 错误信息相关常量定义
*/
///@{
/** 详细错误信息字典中额外信息的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo;
/** 详细错误信息字典中返回码的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode;
/** 详细错误信息字典中错误语句的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg;
/** 不支持的接口 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI;
/** 操作成功 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess;
/** 未知错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown;
/** 用户取消 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel;
/** 请重新登录 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin;
/** 应用没有操作权限 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny;
/** 网络异常或没有网络 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork;
/** URL格式或协议错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL;
/** 解析数据出错 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse;
/** 传入参数有误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam;
/** 连接超时 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout;
/** 安全问题 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity;
/** 文件读写错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO;
/** 服务器端错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer;
/** 页面错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage;
/** 设置头像图片过大 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge;
/** 用户未同意授权隐私协议 */
FOUNDATION_EXPORT NSString * const TCOpenSDKErrorMsgUserNotAgreedAuthorization;
///@}
/**
* \brief SDK新增详细错误常量
*/
typedef enum
{
kOpenSDKInvalid = -1, ///< 无效的错误码
kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口
/**
* \name CommonErrorCode
* 公共错误码
*/
///@{
kOpenSDKErrorSuccess = 0, ///< 成功
kOpenSDKErrorUnknown, ///< 未知错误
kOpenSDKErrorUserCancel, ///< 用户取消
kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录
kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限
///@}
/**
* \name NetworkRelatedErrorCode
* 网络相关错误码
*/
///@{
kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器
kOpenSDKErrorURL, ///< URL格式或协议错误
kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错
kOpenSDKErrorParam, ///< 传入参数错误
kOpenSDKErrorConnTimeout, ///< http连接超时
kOpenSDKErrorSecurity, ///< 安全问题
kOpenSDKErrorIO, ///< 下载和文件IO错误
kOpenSDKErrorServer, ///< 服务器端错误
///@}
/**
* \name WebViewRelatedError
* webview特有错误
*/
///@{
kOpenSDKErrorWebPage, ///< 页面错误
///@}
/**
* \name SetUserHeadRelatedErrorCode
* 设置头像自定义错误码段
*/
///@{
kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码
///@}
} OpenSDKError;
/**
* \name SDK版本(v1.3)支持的授权列表常量
*/
///@{
/** 发表一条说说到QQ空间(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;
/** 创建一个QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;
/** 上传一张照片到QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;
/** 获取用户QQ空间相册列表(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;
/** 验证是否认证空间粉丝 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;
/** 获取登录用户自己的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;
/** 获取其他用户的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;
/** 获取会员用户基本信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;
/** 获取会员用户详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;
/** 获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;
/** 移动端获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;
/** 移动端获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ALL;
///@}
/**
* \name CGI接口相关参数类型定义
*/
/** 必填的字符串类型参数 */
typedef NSString *TCRequiredStr;
/** 必填的UIImage类型参数 */
typedef UIImage *TCRequiredImage;
/** 必填的整型参数 */
typedef NSInteger TCRequiredInt;
/** 必填的数字类型 */
typedef NSNumber *TCRequiredNumber;
/** 必填的NSData参数 */
typedef NSData *TCRequiredData;
/** 可选的字符串类型参数 */
typedef NSString *TCOptionalStr;
/** 可选的UIImage类型参数 */
typedef UIImage *TCOptionalImage;
/** 可选的整型参数 */
typedef NSInteger TCOptionalInt;
/** 可选的数字类型 */
typedef NSNumber *TCOptionalNumber;
/** 可选的不定类型参数 */
typedef id TCRequiredId;
///@}
/**
* \brief CGI请求的参数字典封装辅助基类
*
* 将相应属性的值以key-value的形式保存到参数字典中
*/
@interface TCAPIRequest : NSMutableDictionary
/** CGI请求的URL地址 */
@property (nonatomic, readonly) NSURL *apiURL;
/** CGI请求方式"GET""POST" */
@property (nonatomic, readonly) NSString *method;
/**
* API参数中的保留字段可以塞入任意字典支持的类型再调用完成后会带回给调用方
*/
@property (nonatomic, strong) TCRequiredId paramUserData;
/**
* APIResponse,API的返回结果
*/
@property (nonatomic, readonly) APIResponse *response;
/** 取消相应的CGI请求任务 */
- (void)cancel;
@end
@protocol TCAPIRequestDelegate <NSObject>
@optional
- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response;
@end

View File

@@ -0,0 +1,555 @@
///
/// \file TencentOAuth.h
/// \brief QQ互联开放平台授权登录及相关开放接口实现类
///
/// Created by Tencent on 12-12-21.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <UIKit/UIKit.h>
#import "SDKDef.h"
@protocol TencentSessionDelegate;
@protocol TencentLoginDelegate;
@protocol TencentApiInterfaceDelegate;
@protocol TencentWebViewDelegate;
@class TencentApiReq;
@class TencentApiResp;
typedef NS_ENUM(NSUInteger, TencentAuthorizeState) {
kTencentNotAuthorizeState,
kTencentSSOAuthorizeState,
kTencentWebviewAuthorzieState,
};
typedef NS_ENUM(NSUInteger, TencentAuthMode) {
kAuthModeClientSideToken,
kAuthModeServerSideCode,
};
#pragma mark - TencentOAuth(授权登录及相关开放接口调用)
/**
* \brief TencentOpenAPI授权登录及相关开放接口调用
*
* TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用
*/
@interface TencentOAuth : NSObject {
NSMutableDictionary *_apiRequests;
}
/** Access Token凭证用于后续访问各开放接口 */
@property(nonatomic, copy) NSString *accessToken;
/** Access Token的失效期 */
@property(nonatomic, strong) NSDate *expirationDate;
/** 已实现的开放接口的回调委托对象 */
@property(nonatomic, weak) id<TencentSessionDelegate> sessionDelegate;
/** 第三方应用在开发过程中设置的URLSchema用于浏览器登录后后跳到第三方应用 */
@property(nonatomic, copy) NSString *localAppId;
/** 用户授权登录后对该用户的唯一标识 */
@property(nonatomic, copy) NSString *openId;
/** 用户登录成功过后的跳转页面地址 */
@property(nonatomic, copy) NSString *redirectURI;
/** 第三方应用在互联开放平台申请的appID */
@property(nonatomic, copy) NSString *appId;
/** 第三方应用在互联开放平台注册的UniversalLink */
@property(nonatomic, copy) NSString *universalLink;
/** 主要是互娱的游戏设置uin */
@property(nonatomic, copy) NSString *uin;
/** 主要是互娱的游戏设置鉴定票据 */
@property(nonatomic, copy) NSString *skey;
/** 登陆透传的数据 */
@property(nonatomic, copy) NSDictionary *passData;
/** 授权方式(Client Side Token或者Server Side Code) */
@property(nonatomic, assign) TencentAuthMode authMode;
/** union id */
@property(nonatomic, copy) NSString *unionid;
/** 第三方在授权登录/分享 时选择 QQ还是TIM 。在授权前一定要指定其中一个类型*/
@property(nonatomic, assign) TencentAuthShareType authShareType;
/** SDK打开web登录页支持自动填充账号 */
@property (nonatomic, copy) NSString *defaultUin;
/**
* 获取上次登录得到的token
*
**/
- (NSString *)getCachedToken;
/**
* 获取上次登录得到的openid
*
**/
- (NSString *)getCachedOpenID;
/**
* 获取上次登录的token过期日期
*
**/
- (NSDate *)getCachedExpirationDate;
/**
* 上次登录的token是否过期(本地判断)
**/
- (BOOL)isCachedTokenValid;
/**
* 删除上次登录登录的token信息
*
**/
- (BOOL)deleteCachedToken;
/**
* 删除openid
*
**/
- (void)deleteOpenId;
/**
* 用来获得当前sdk的版本号
* \return 返回sdk版本号
**/
+ (NSString *)sdkVersion;
/**
* 用来获得当前sdk的小版本号
* \return 返回sdk小版本号
**/
+ (NSString *)sdkSubVersion;
/**
* 用来获得当前sdk的是否精简版
* @return 返回YES表示精简版
**/
+ (BOOL)isLiteSDK;
/**
* 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果
* \return
* kTencentNotAuthorizeState:无授权
* kTencentSSOAuthorizeState:有人发起了sso授权但无返回
* kTencentWebviewAuthorzieState:有人发起了webview授权还未返回
**/
+ (TencentAuthorizeState *)authorizeState;
/**
* 获取TencentOAuth单例
*/
+ (instancetype)sharedInstance;
/**
* 设置SDK参数
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param enableUniveralLink 默认为NO第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式启用后则在iOS9及以上的系统都会生效UniversalLink方式否则默认仅在iOS13及以上的系统生效UniversalLink方式。
* @param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成UniversalLink详见官网说明
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
*
* @note
* 使用说明】
* 1、支持sdk与手Q的交互切换为UniversalLink模式主要目的"是为了避免手Q的UrlScheme被其他应用抢注后导致sdk接口功能受到影响"。
* 2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink所以一旦开启了enabled开关“务必做到”及时知会用户升级手Q版本。
*
*/
- (void)setupAppId:(NSString *)appId
enableUniveralLink:(BOOL)enableUniveralLink
universalLink:(NSString *)universalLink
delegate:(id<TencentSessionDelegate>)delegate;
/**
* 初始化TencentOAuth对象
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* @return 初始化后的授权登录对象
*
* 推荐使用初始化方法并且适配UniversalLink
* - (instancetype)initWithAppId:(NSString *)appId
* enableUniveralLink:(BOOL)enabled
* universalLink:(NSString *)universalLink
* delegate:(id<TencentSessionDelegate>)delegate;
*/
- (instancetype)initWithAppId:(NSString *)appId
andDelegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 初始化TencentOAuth对象>=3.3.7
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @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版本。
*
* 推荐使用初始化方法并且适配UniversalLink
* - (instancetype)initWithAppId:(NSString *)appId
* enableUniveralLink:(BOOL)enabled
* universalLink:(NSString *)universalLink
* delegate:(id<TencentSessionDelegate>)delegate;
*
*/
- (instancetype)initWithAppId:(NSString *)appId
andUniversalLink:(NSString *)universalLink
andDelegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 初始化TencentOAuth对象>=3.3.8
* 注意3.5.17版本开始,内部单例实现,多次调用返回同一实例
*
* @param appId 不可为nil第三方应用在互联开放平台申请的唯一标识
* @param enabled 默认为NO第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式启用后则在iOS9及以上的系统都会生效UniversalLink方式否则默认仅在iOS13及以上的系统生效UniversalLink方式。
* @param universalLink 可以为nil第三方应用在互联开放平台注册的UniversalLink和bundleID一一对应当为nil时互联平台会按规则生成UniversalLink详见官网说明
* @param delegate 不可为nil第三方应用用于接收请求返回结果的委托对象
* @return 初始化后的授权登录对象
*
* @note
* 使用说明】
* 1、支持sdk与手Q的交互切换为UniversalLink模式主要目的"是为了避免手Q的UrlScheme被其他应用抢注后导致sdk接口功能受到影响"。
* 2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink所以一旦开启了enabled开关“务必做到”及时知会用户升级手Q版本。
*
*/
- (instancetype)initWithAppId:(NSString *)appId
enableUniveralLink:(BOOL)enabled
universalLink:(NSString *)universalLink
delegate:(id<TencentSessionDelegate>)delegate __attribute__((deprecated("此接口即将下线请使用setupAppId:enableUniveralLink:universalLink:delegate")));
/**
* 设置用户是否已经授权同意授权隐私协议在主体应用中用户同意授权隐私协议后再初始化互联SDK默认未同意授权
* 注意如未同意授权隐私协议则互联SDK的所有功能都无法使用包括初始化
* 从3.5.7版本开始支持该方法
*
* @param isAgreedAuthorization 是否已经授权isAgreedAuthorization=YES, 表示已经同意授权isAgreedAuthorization=NO表示未同意授权互联SDK的所有功能都无法使用
*/
+ (void)setIsUserAgreedAuthorization:(BOOL)isUserAgreedAuthorization;
/**
* 获取当前用户是否已经同意授权隐私协议
* 从3.5.7版本开始支持该方法
*/
+ (BOOL)isUserAgreedAuthorization;
/**
* 判断用户手机上是否安装手机QQ
* @return YES:安装 NO:没安装
*
* @note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneQQInstalled;
/**
* 判断用户手机上是否安装手机TIM
* @return YES:安装 NO:没安装
*
* @note SDK目前已经支持QQ、TIM授权登录及分享功能 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneTIMInstalled;
/**
* 发起授权登录如果安装了QQ APP则拉起QQ发起授权登录如果为安装QQ APP则在第三方应用进入H5页面输入账密授权登录。
*
* @param permissions 授权信息列
* @return 发起调用是否成功
*/
- (BOOL)authorize:(NSArray *)permissions;
/**
* 发起授权登录, 在第三方应用进入H5页面显示二维码通过扫码完成授权登录
*
* @param permissions 授权信息列
* @return 发起调用结果
*/
- (BOOL)authorizeWithQRlogin:(NSArray *)permissions;
/**
* 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权
* @param permissions 需增量授权的信息列表
* @return 发起增量授权调用是否成功
*/
- (BOOL)incrAuthWithPermissions:(NSArray *)permissions;
/**
* 重新授权因token废除或失效导致接口调用失败需用户重新授权
* @param permissions 授权信息列表,同登录授权
* @return 重新授权调用是否成功
*/
- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions;
/**
* 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户
* 通过代理方法:- (void)didGetUnionID;返回请求结果。
*
* @return NO未登录信息不足YES条件满足发送请求成功请等待回调
*/
- (BOOL)RequestUnionId;
/**
* (静态方法)处理应用拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示成功NO表示失败
*/
+ (BOOL)HandleOpenURL:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示可以 NO表示不行
*/
+ (BOOL)CanHandleOpenURL:(NSURL *)url;
/**
* (静态方法)处理应用的UniversalLink拉起协议
* @param url 处理被其他应用呼起时的逻辑
* @return 处理结果YES表示成功NO表示失败
*/
+ (BOOL)HandleUniversalLink:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用的Universallink拉起协议
* @param url 处理被其他应用呼起时的逻辑(应用的Universallink链接须满足官网注册时的格式要求)
* @return 处理结果YES表示可以 NO表示不行
* 注在调用其他Universallink相关处理接口之前均需进行此项判断
*/
+ (BOOL)CanHandleUniversalLink:(NSURL *)url;
/**
* (静态方法)获取TencentOAuth调用的上一次错误信息
*/
+ (NSString *)getLastErrorMsg;
/**
* 以Server Side Code模式授权登录时通过此接口获取返回的code值;
* 以Client Side Token模式授权登录时忽略此接口。
*/
- (NSString *)getServerSideCode;
/**
* 退出登录(退出登录后TecentOAuth失效需要重新初始化)
* @param delegate 第三方应用用于接收请求返回结果的委托对象
*/
- (void)logout:(id<TencentSessionDelegate>)delegate;
/**
* 判断登录态是否有效
* @return 处理结果YES表示有效NO表示无效请用户重新登录授权
*/
- (BOOL)isSessionValid;
/**
* 获取用户个人信息
* @return 处理结果YES表示API调用成功NO表示API调用失败登录态失败重新登录
*/
- (BOOL)getUserInfo;
/**
* 退出指定API调用
* @param userData 用户调用某条API的时候传入的保留参数
* @return 处理结果YES表示成功 NO表示失败
*/
- (BOOL)cancel:(id)userData;
/**
* CGI类任务创建接口
* @param apiURL CGI请求的URL地址
* @param method CGI请求方式"GET""POST"
* @param params CGI请求参数字典
* @param callback CGI请求结果的回调接口对象
* @return CGI请求任务实例用于取消任务返回nil代表任务创建失败
*/
- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id<TCAPIRequestDelegate>)callback;
/**
* TencentOpenApi发送任务统一接口
* @param request 请求发送的任务
* @param callback 任务发送后的回调地址
*/
- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id<TCAPIRequestDelegate>)callback;
/**
* 获得用户的openId,仅有内存缓存
* @return 返回openId
*/
- (NSString *)getUserOpenID;
/**
* 获取appSignToken
* @return 返回appSignToken
*/
+ (NSString *)getAppSignToken;
/**
* 设置appSignToken跨进程的应用可以通过该方法手动设置appSignToken
*/
+ (void)setupAppSignToken:(NSString *)appSignToken;
@end
#pragma mark - TencentLoginDelegate(授权登录回调协议)
/**
* \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用实现登录的回调协议
*/
@protocol TencentLoginDelegate <NSObject>
@required
/**
* 登录成功后的回调
*/
- (void)tencentDidLogin;
/**
* 登录失败后的回调
* \param cancelled 代表用户是否主动退出登录
*/
- (void)tencentDidNotLogin:(BOOL)cancelled;
/**
* 登录时网络有问题的回调
*/
- (void)tencentDidNotNetWork;
@optional
/**
* 登录时权限信息的获得
*/
- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams __attribute__((deprecated("该接口已过期, 建议删除调用")));
/**
* unionID获得
*/
- (void)didGetUnionID;
/**
* 强制网页登录,包括账号密码登录和二维码登录
* return YES时就算本地有手Q也会打开web界面
*/
- (BOOL)forceWebLogin;
/* 获得appSignToken回调 */
- (void)tencentDidGetAppSignToken:(NSString *)appSignToken;
@end
#pragma mark - TencentSessionDelegate(开放接口回调协议)
/**
* \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用需要实现每条需要调用的API的回调协议
*/
@protocol TencentSessionDelegate <NSObject, TencentLoginDelegate, TencentWebViewDelegate>
@optional
/**
* 退出登录的回调
*/
- (void)tencentDidLogout;
/**
* 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时如果服务器返回操作未被授权则触发该回调协议接口由第三方决定是否跳转到增量授权页面让用户重新授权。
* @param tencentOAuth 登录授权对象。
* @param permissions 需增量授权的权限列表。
* @return 是否仍然回调返回原始的api请求结果。
* @note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意增量授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions;
/**
* [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时如果服务器返回token失效则触发该回调协议接口由第三方决定是否跳转到登录授权页面让用户重新授权。
* @param tencentOAuth 登录授权对象。
* @return 是否仍然回调返回原始的api请求结果。
* @note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意重新登录授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth;
/**
* 用户通过增量授权流程重新授权登录token及有效期限等信息已被更新。
* @param tencentOAuth token及有效期限等信息更新后的授权实例对象
* @note 第三方应用需更新已保存的token及有效期限等信息。
*/
- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth;
/**
* 用户增量授权过程中因取消或网络问题导致授权失败
* @param reason 授权失败原因具体失败原因参见sdkdef.h文件中\ref UpdateFailType
*/
- (void)tencentFailedUpdate:(UpdateFailType)reason;
/**
* 获取用户个人信息回调
* @param response API返回结果具体定义参见sdkdef.h文件中\ref APIResponse
* @remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success
* 错误返回示例: \snippet example/getUserInfoResponse.exp fail
*/
- (void)getUserInfoResponse:(APIResponse*) response;
/**
* 社交API统一回调接口
* @param response API返回结果具体定义参见sdkdef.h文件中\ref APIResponse
* @param message 响应的消息目前支持SendStory,AppInvitationAppChallengeAppGiftRequest
*/
- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message;
/**
* post请求的上传进度
* @param tencentOAuth 返回回调的tencentOAuth对象
* @param bytesWritten 本次回调上传的数据字节数
* @param totalBytesWritten 总共已经上传的字节数
* @param totalBytesExpectedToWrite 总共需要上传的字节数
* @param userData 用户自定义数据
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData;
/**
* 通知第三方界面需要被关闭
* @param tencentOAuth 返回回调的tencentOAuth对象
* @param viewController 需要关闭的viewController
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController;
@end
#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调)
/**
* @brief TencentWebViewDelegate: H5登录webview旋转方向回调协议
*
* 第三方应用可以根据自己APP的旋转方向限制通过此协议设置
*/
@protocol TencentWebViewDelegate <NSObject>
@optional
- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit;
- (BOOL) tencentWebViewShouldAutorotateWithWebkit;
@end

View File

@@ -0,0 +1,24 @@
//
// TencentOpenApiUmbrellaHeader.h
// TencentOpenApi_IOS
//
// Created by jyukeizhang(张储祺) on 2020/7/27.
// Copyright © 2020 Tencent. All rights reserved.
//
#ifndef TencentOpenApiUmbrellaHeader_h
#define TencentOpenApiUmbrellaHeader_h
#import <Foundation/Foundation.h>
FOUNDATION_EXPORT double StaticLibraryModuleVersionNumber;
FOUNDATION_EXPORT const unsigned char StaticLibraryModuleVersionString[];
#import "QQApiInterface.h"
#import "QQApiInterfaceObject.h"
#import "SDKDef.h"
#import "TencentOAuth.h"
#endif /* TencentOpenApiUmbrellaHeader_h */

View File

@@ -0,0 +1,36 @@
<?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>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>用户同意授权后仅用于UserID授权第三方应用登录。</string>
</array>
</dict>
</array>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>用于存储第三方授权登录结果数据,便于应用能快速访问授权登录结果数据</string>
</array>
</dict>
</array>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>