TencentOAuth.h 16 KB

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