lpw
2024-06-12 22eb75781b425b8c5b7db8f141fec661df2eeeb6
commit | author | age
eec5d6 1 ///
L 2 /// \file TencentOAuth.h
3 /// \brief QQ互联开放平台授权登录及相关开放接口实现类
4 ///
5 /// Created by Tencent on 12-12-21.
6 /// Copyright (c) 2012年 Tencent. All rights reserved.
7 ///
8
9 #import <UIKit/UIKit.h>
ed1e9e 10 #import "SDKDef.h"
eec5d6 11
L 12 @protocol TencentSessionDelegate;
13 @protocol TencentLoginDelegate;
14 @protocol TencentApiInterfaceDelegate;
15 @protocol TencentWebViewDelegate;
16
17 @class TencentApiReq;
18 @class TencentApiResp;
19
20 typedef NS_ENUM(NSUInteger, TencentAuthorizeState) {
21     kTencentNotAuthorizeState,
22     kTencentSSOAuthorizeState,
23     kTencentWebviewAuthorzieState,
24 };
25
26 typedef NS_ENUM(NSUInteger, TencentAuthMode) {
27     kAuthModeClientSideToken,
28     kAuthModeServerSideCode,
29 };
30
31 #pragma mark - TencentOAuth(授权登录及相关开放接口调用)
32
33 /**
34  * \brief TencentOpenAPI授权登录及相关开放接口调用
35  *
36  * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用
37  */
38 @interface TencentOAuth : NSObject
39 {
7acec9 40     NSMutableDictionary *_apiRequests;
L 41     NSString *_accessToken;
42     NSDate *_expirationDate;
eec5d6 43     id<TencentSessionDelegate> _sessionDelegate;
7acec9 44     NSString *_localAppId;
L 45     NSString *_openId;
46     NSString *_redirectURI;
47     NSArray *_permissions;
eec5d6 48 }
L 49
50 /** Access Token凭证,用于后续访问各开放接口 */
7acec9 51 @property(nonatomic, copy) NSString *accessToken;
eec5d6 52
L 53 /** Access Token的失效期 */
7acec9 54 @property(nonatomic, copy) NSDate *expirationDate;
eec5d6 55
L 56 /** 已实现的开放接口的回调委托对象 */
7acec9 57 @property(nonatomic, weak) id<TencentSessionDelegate> sessionDelegate;
eec5d6 58
L 59 /** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */
7acec9 60 @property(nonatomic, copy) NSString *localAppId;
eec5d6 61
L 62 /** 用户授权登录后对该用户的唯一标识 */
7acec9 63 @property(nonatomic, copy) NSString *openId;
eec5d6 64
L 65 /** 用户登录成功过后的跳转页面地址 */
7acec9 66 @property(nonatomic, copy) NSString *redirectURI;
eec5d6 67
L 68 /** 第三方应用在互联开放平台申请的appID */
7acec9 69 @property(nonatomic, retain) NSString *appId;
eec5d6 70
L 71 /** 第三方应用在互联开放平台注册的UniversalLink */
7acec9 72 @property(nonatomic, retain) NSString *universalLink;
eec5d6 73
L 74 /** 主要是互娱的游戏设置uin */
7acec9 75 @property(nonatomic, retain) NSString *uin;
eec5d6 76
L 77 /** 主要是互娱的游戏设置鉴定票据 */
7acec9 78 @property(nonatomic, retain) NSString *skey;
eec5d6 79
L 80 /** 登陆透传的数据 */
7acec9 81 @property(nonatomic, copy) NSDictionary *passData;
eec5d6 82
L 83 /** 授权方式(Client Side Token或者Server Side Code) */
84 @property(nonatomic, assign) TencentAuthMode authMode;
85
86 /** union id */
7acec9 87 @property(nonatomic, retain) NSString *unionid;
eec5d6 88
L 89 /** 第三方在授权登录/分享 时选择 QQ,还是TIM 。在授权前一定要指定其中一个类型*/
90 @property(nonatomic, assign) TencentAuthShareType authShareType;
7acec9 91
ed1e9e 92 /** SDK打开web登录页,支持自动填充账号  */
L 93 @property (nonatomic, copy) NSString *defaultUin;
94
eec5d6 95 /**
L 96  * 获取上次登录得到的token
97  *
98  **/
99 - (NSString *)getCachedToken;
100
101 /**
102  * 获取上次登录得到的openid
103  *
104  **/
105 - (NSString *)getCachedOpenID;
106
107 /**
108  * 获取上次登录的token过期日期
109  *
110  **/
111 - (NSDate *)getCachedExpirationDate;
112
113 /**
114  * 上次登录的token是否过期(本地判断)
115  **/
116 - (BOOL)isCachedTokenValid;
117
118 /**
119  * 删除上次登录登录的token信息
120  *
121  **/
122 - (BOOL)deleteCachedToken;
123
124 /**
22eb75 125  * 删除openid
L 126  *
127  **/
128 - (void)deleteOpenId;
129
130 /**
eec5d6 131  * 用来获得当前sdk的版本号
L 132  * \return 返回sdk版本号
133  **/
134
7acec9 135 + (NSString *)sdkVersion;
eec5d6 136
L 137 /**
138  * 用来获得当前sdk的小版本号
139  * \return 返回sdk小版本号
140  **/
141
7acec9 142 + (NSString *)sdkSubVersion;
eec5d6 143
L 144 /**
145  * 用来获得当前sdk的是否精简版
146  * \return 返回YES表示精简版
147  **/
148
149 + (BOOL)isLiteSDK;
150
151 /** 
152  * 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果 
153  * \return 
154  *          kTencentNotAuthorizeState:无授权 
155  *          kTencentSSOAuthorizeState:有人发起了sso授权但无返回
156  *          kTencentWebviewAuthorzieState:有人发起了webview授权还未返回
157  **/
158
159 + (TencentAuthorizeState *)authorizeState;
160
161 /**
162  * 初始化TencentOAuth对象
8822d6 163  * \param appId 不可为nil,第三方应用在互联开放平台申请的唯一标识
L 164  * \param delegate 不可为nil,第三方应用用于接收请求返回结果的委托对象
eec5d6 165  * \return 初始化后的授权登录对象
L 166  */
167 - (id)initWithAppId:(NSString *)appId
168         andDelegate:(id<TencentSessionDelegate>)delegate;
169
170 /**
171 * 初始化TencentOAuth对象(>=3.3.7)
8822d6 172 * \param appId 不可为nil,第三方应用在互联开放平台申请的唯一标识
L 173 * \param universalLink 可以为nil,第三方应用在互联开放平台注册的UniversalLink,和bundleID一一对应(当为nil时,互联平台会按规则生成universallink,详见官网说明)
174 * \param delegate 不可为nil,第三方应用用于接收请求返回结果的委托对象
eec5d6 175 * \return 初始化后的授权登录对象
8822d6 176 *
L 177 ****【使用说明】*****
178 * 1、支持BundleId与UniversalLink的一一对应,主要目的“是为了解决应用的iPhone版本和iPad HD版本共用同一个AppId,导致同时安装情况下的跳转问题"。
179 * 2 、由于手Q版本在 >=8.1.8 后才支持了这种对应方式,所以一旦使用,“务必做到”及时知会用户升级手Q版本。
180 ****
eec5d6 181 */
L 182 - (id)initWithAppId:(NSString *)appId
183    andUniversalLink:(NSString *)universalLink
184         andDelegate:(id<TencentSessionDelegate>)delegate;
8822d6 185
L 186 /**
187 * 初始化TencentOAuth对象(>=3.3.8)
188 * \param appId 不可为nil,第三方应用在互联开放平台申请的唯一标识
189 * \param enabled  默认为NO,第三方应用是否将sdk和手机QQ的交互方式切换为UniversalLink方式,启用后则在iOS9及以上的系统都会生效UniversalLink方式;否则,默认仅在iOS13及以上的系统生效UniversalLink方式。
190 * \param universalLink 可以为nil,第三方应用在互联开放平台注册的UniversalLink,和bundleID一一对应(当为nil时,互联平台会按规则生成UniversalLink,详见官网说明)
191 * \param delegate 不可为nil,第三方应用用于接收请求返回结果的委托对象
192 * \return 初始化后的授权登录对象
193 *
194 *****【使用说明】*****
195 *  1、支持sdk与手Q的交互切换为UniversalLink模式,主要目的"是为了避免手Q的UrlScheme被其他应用抢注后,导致sdk接口功能受到影响"。
196 *  2 、由于手Q版本在 >=8.1.3 后才适配了UniversalLink,所以一旦开启了enabled开关,“务必做到”及时知会用户升级手Q版本。
197 *****
198 */
199 - (id)initWithAppId:(NSString *)appId
200  enableUniveralLink:(BOOL)enabled
201       universalLink:(NSString *)universalLink
202            delegate:(id<TencentSessionDelegate>)delegate;
eec5d6 203
L 204 /**
7acec9 205  * 设置用户是否已经授权同意授权隐私协议,在主体应用中,用户同意授权隐私协议后再初始化互联SDK,默认未同意授权
L 206  * 注意:如未同意授权隐私协议,则互联SDK的所有功能都无法使用,包括初始化!!!
207  * 从3.5.7版本开始支持该方法
208  *
209  * @param isAgreedAuthorization 是否已经授权,isAgreedAuthorization=YES, 表示已经同意授权;isAgreedAuthorization=NO,表示未同意授权,互联SDK的所有功能都无法使用
210  */
211 + (void)setIsUserAgreedAuthorization:(BOOL)isUserAgreedAuthorization;
212
213 /**
214  * 获取当前用户是否已经同意授权隐私协议
215  * 从3.5.7版本开始支持该方法
216  */
217 + (BOOL)isUserAgreedAuthorization;
218
219 /**
eec5d6 220  * 判断用户手机上是否安装手机QQ
L 221  * \return YES:安装 NO:没安装
222  *
223  * \note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
224  * 只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
225  * 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
226  */
227 + (BOOL)iphoneQQInstalled;
228
229 /**
230  * 判断用户手机上是否安装手机TIM
231  * \return YES:安装 NO:没安装
232  *
233  * \note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
234  * 只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
235  * 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
236  */
237 + (BOOL)iphoneTIMInstalled;
238  
239 /**
240  * 登录授权
241  *
242  * \param permissions 授权信息列
243  */
244 - (BOOL)authorize:(NSArray *)permissions;
245
246 /**
247  * 登录授权
248  * \param permissions 授权信息列表
249  * \param localAppId 应用APPID
250  */
251 - (BOOL)authorize:(NSArray *)permissions
8822d6 252        localAppId:(NSString *)localAppId;
eec5d6 253
L 254 /**
255  * 登录授权<web为二维码扫码方式>
256  *
257  * \param permissions 授权信息列
258  */
259 - (BOOL)authorizeWithQRlogin:(NSArray *)permissions;
260
261 /**
262  * 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权
263  * \param permissions 需增量授权的信息列表
264  * \return 增量授权调用是否成功
265  */
266 - (BOOL)incrAuthWithPermissions:(NSArray *)permissions;
267
268 /**
269  * 重新授权,因token废除或失效导致接口调用失败,需用户重新授权
270  * \param permissions 授权信息列表,同登录授权
271  * \return 授权调用是否成功
272  */
273 - (BOOL)reauthorizeWithPermissions:(NSArray *)permissions;
274
275 /**
276  * 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户
277  * \return NO未登录,信息不足;YES条件满足,发送请求成功,请等待回调
278  */
279 - (BOOL)RequestUnionId;
280
281 /**
282  * (静态方法)处理应用拉起协议
283  * \param url 处理被其他应用呼起时的逻辑
284  * \return 处理结果,YES表示成功,NO表示失败
285  */
286 + (BOOL)HandleOpenURL:(NSURL *)url;
287
288 /**
289  * (静态方法)sdk是否可以处理应用拉起协议
290  * \param url 处理被其他应用呼起时的逻辑
291  * \return 处理结果,YES表示可以 NO表示不行
292  */
293 + (BOOL)CanHandleOpenURL:(NSURL *)url;
294
295 /**
296  * (静态方法)处理应用的UniversalLink拉起协议
297  * \param url 处理被其他应用呼起时的逻辑
298  * \return 处理结果,YES表示成功,NO表示失败
299  */
300 + (BOOL)HandleUniversalLink:(NSURL *)url;
301
302 /**
303  * (静态方法)sdk是否可以处理应用的Universallink拉起协议
304  * \param url 处理被其他应用呼起时的逻辑(应用的Universallink链接须满足官网注册时的格式要求)
305  * \return 处理结果,YES表示可以 NO表示不行
306  * 注:在调用其他Universallink相关处理接口之前,均需进行此项判断
307  */
308 + (BOOL)CanHandleUniversalLink:(NSURL *)url;
309
310 /**
311  * (静态方法)获取TencentOAuth调用的上一次错误信息
312  */
313 + (NSString *)getLastErrorMsg;
314
315 /**
316  * 以Server Side Code模式授权登录时,通过此接口获取返回的code值;
317  * 以Client Side Token模式授权登录时,忽略此接口。
318  */
319 - (NSString *)getServerSideCode;
320
321 /**
322  * 退出登录(退出登录后,TecentOAuth失效,需要重新初始化)
323  * \param delegate 第三方应用用于接收请求返回结果的委托对象
324  */
325 - (void)logout:(id<TencentSessionDelegate>)delegate;
326
327 /**
328  * 判断登录态是否有效
329  * \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权
330  */
331 - (BOOL)isSessionValid;
332
333 /**
334  * 获取用户个人信息
335  * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录
336  */
337 - (BOOL)getUserInfo;
338
339 /**
340  * 退出指定API调用
341  * \param userData 用户调用某条API的时候传入的保留参数
342  * \return 处理结果,YES表示成功 NO表示失败
343  */
344 - (BOOL)cancel:(id)userData;
345
346 /**
347  * CGI类任务创建接口
348  * \param apiURL CGI请求的URL地址
349  * \param method CGI请求方式:"GET","POST"
350  * \param params CGI请求参数字典
351  * \param callback CGI请求结果的回调接口对象
352  * \return CGI请求任务实例,用于取消任务,返回nil代表任务创建失败
353  */
354 - (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id<TCAPIRequestDelegate>)callback;
355
356 /**
357  * TencentOpenApi发送任务统一接口
358  * \param request 请求发送的任务
359  * \param callback 任务发送后的回调地址
360  */
361 - (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id<TCAPIRequestDelegate>)callback;
362
363 - (NSString *)getUserOpenID;
364
22eb75 365 /* 获取appSignToken */
L 366 + (NSString *)getAppSignToken;
367
368 /* 设置appSignToken,跨进程的应用可以通过该方法手动设置appSignToken */
369 + (void)setupAppSignToken:(NSString *)appSignToken;
370
eec5d6 371 @end
L 372
373 #pragma mark - TencentLoginDelegate(授权登录回调协议)
374
375 /**
376  * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议
377  *
378  * 第三方应用实现登录的回调协议
379  */
380 @protocol TencentLoginDelegate <NSObject>
381
382 @required
383
384 /**
385  * 登录成功后的回调
386  */
387 - (void)tencentDidLogin;
388
389 /**
390  * 登录失败后的回调
391  * \param cancelled 代表用户是否主动退出登录
392  */
393 - (void)tencentDidNotLogin:(BOOL)cancelled;
394
395 /**
396  * 登录时网络有问题的回调
397  */
398 - (void)tencentDidNotNetWork;
399
400 @optional
401 /**
402  * 登录时权限信息的获得
403  */
8822d6 404 - (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams __attribute__((deprecated("该接口已过期, 建议删除调用")));
eec5d6 405
L 406 /**
407  * unionID获得
408  */
409 - (void)didGetUnionID;
410
411 /**
412  * 强制网页登录,包括账号密码登录和二维码登录
413  * return YES时,就算本地有手Q也会打开web界面
414  */
415 - (BOOL)forceWebLogin;
22eb75 416
L 417 /* 获得appSignToken回调 */
418 - (void)tencentDidGetAppSignToken:(NSString *)appSignToken;
419
eec5d6 420 @end
L 421
422 #pragma mark - TencentSessionDelegate(开放接口回调协议)
423
424 /**
425  * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
426  *
427  * 第三方应用需要实现每条需要调用的API的回调协议
428  */
429 @protocol TencentSessionDelegate<NSObject, TencentLoginDelegate,
430                                 TencentWebViewDelegate>
431
432 @optional
433
434 /**
435  * 退出登录的回调
436  */
437 - (void)tencentDidLogout;
438
439 /**
440  * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。
441  * \param tencentOAuth 登录授权对象。
442  * \param permissions 需增量授权的权限列表。
443  * \return 是否仍然回调返回原始的api请求结果。
444  * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号
445  */
446 - (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions;
447
448 /**
449  * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。
450  * \param tencentOAuth 登录授权对象。
451  * \return 是否仍然回调返回原始的api请求结果。
452  * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号
453  */
454 - (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth;
455
456 /**
457  * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。
458  * \param tencentOAuth token及有效期限等信息更新后的授权实例对象
459  * \note 第三方应用需更新已保存的token及有效期限等信息。
460  */
461 - (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth;
462
463 /**
464  * 用户增量授权过程中因取消或网络问题导致授权失败
465  * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType
466  */
467 - (void)tencentFailedUpdate:(UpdateFailType)reason;
468
469 /**
470  * 获取用户个人信息回调
471  * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse
472  * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success
473  *          错误返回示例: \snippet example/getUserInfoResponse.exp fail
474  */
475 - (void)getUserInfoResponse:(APIResponse*) response;
476
477 /**
478  * 社交API统一回调接口
479  * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse
480  * \param message 响应的消息,目前支持‘SendStory’,‘AppInvitation’,‘AppChallenge’,‘AppGiftRequest’
481  */
482 - (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message;
483
484 /**
485  * post请求的上传进度
486  * \param tencentOAuth 返回回调的tencentOAuth对象
487  * \param bytesWritten 本次回调上传的数据字节数
488  * \param totalBytesWritten 总共已经上传的字节数
489  * \param totalBytesExpectedToWrite 总共需要上传的字节数
490  * \param userData 用户自定义数据
491  */
492 - (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData;
493
494
495 /**
496  * 通知第三方界面需要被关闭
497  * \param tencentOAuth 返回回调的tencentOAuth对象
498  * \param viewController 需要关闭的viewController
499  */
500 - (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController;
501
502 @end
503
504 #pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调)
505
506 /**
507  * \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议
508  *
509  * 第三方应用可以根据自己APP的旋转方向限制,通过此协议设置
510  */
511 @protocol TencentWebViewDelegate <NSObject>
512 @optional
513 - (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
514 - (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit;
515 - (BOOL) tencentWebViewShouldAutorotateWithWebkit;
516 @end