QQSDK(OAuth登录)Binding工程


QQSDK(OAuth登录)Binding工程

xamarin


本章主要记录的是QQ登录OAuth部分的api问题,与前些时候的OC语法特性不同,这个SDK的接口没有如微信SDK那般梳理的简单明确,有些语言特性之前也没处理过,下面介绍就是这部分:

1.FOUNDATION_EXTERN(C与C++语法特性的一些处理)

  1. <span style="font-family:SimSun;font-size:14px;">/** 取消收听腾讯微博上的用户 */
  2. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_DEL_IDOL;
  3. /** 获取微博中最近at的好友 */
  4. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO;
  5. /** 获取微博中匹配昵称的好友 */
  6. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO;
  7. /** 获取会员用户基本信息 */
  8. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;
  9. /** 获取会员用户详细信息 */
  10. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;
  11. /** 获取用户信息 */
  12. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;</span>
  1. _permissions = [[NSArray arrayWithObjects:
  2. kOPEN_PERMISSION_GET_USER_INFO,
  3. kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
  4. kOPEN_PERMISSION_ADD_ALBUM,
  5. kOPEN_PERMISSION_ADD_IDOL,
  6. kOPEN_PERMISSION_ADD_ONE_BLOG,
  7. kOPEN_PERMISSION_ADD_PIC_T,
  8. kOPEN_PERMISSION_ADD_SHARE,
  9. kOPEN_PERMISSION_ADD_TOPIC,
  10. kOPEN_PERMISSION_CHECK_PAGE_FANS,
  11. kOPEN_PERMISSION_DEL_IDOL,
  12. kOPEN_PERMISSION_DEL_T,
  13. kOPEN_PERMISSION_GET_FANSLIST,
  14. kOPEN_PERMISSION_GET_IDOLLIST,
  15. kOPEN_PERMISSION_GET_INFO,
  16. kOPEN_PERMISSION_GET_OTHER_INFO,
  17. kOPEN_PERMISSION_GET_REPOST_LIST,
  18. kOPEN_PERMISSION_LIST_ALBUM,
  19. kOPEN_PERMISSION_UPLOAD_PIC,
  20. kOPEN_PERMISSION_GET_VIP_INFO,
  21. kOPEN_PERMISSION_GET_VIP_RICH_INFO,
  22. kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO,
  23. kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO,
  24. nil nil] retain];

出现在申请操作权限描述的时候出现,在demo中没有细找对应的常量的字符描述,直接在测试时断点调试堆栈时查找对应字符数据,如图:

20141011160529953.jpg-210.1kB

根据这些提示,也就没必要同时写入到ApiDefinition文件中,进行接口定义了,因此可在引用时添加常量定义:

  1. public class OPEN_PERMISSION
  2. {
  3. public const string ADD_TOPIC = "add_topic";
  4. public const string ADD_ONE_BLOG = "add_one_blog";
  5. public const string ADD_ALBUM = "add_album";
  6. public const string UPLOAD_PIC = "upload_pic";
  7. public const string LIST_ALBUM = "list_album";
  8. public const string ADD_SHARE = "add_share";
  9. public const string CHECK_PAGE_FANS = "check_page_fans";
  10. public const string ADD_PIC_T = "add_pic_t";
  11. public const string DEL_T = "del_t";
  12. public const string GET_REPOST_LIST = "get_repost_list";
  13. public const string GET_INFO = "get_info";
  14. public const string GET_OTHER_INFO = "get_other_info";
  15. public const string GET_FANSLIST = "get_fanslist";
  16. public const string GET_IDOLLIST = "get_idollist";
  17. public const string ADD_IDOL = "add_idol";
  18. public const string DEL_IDOL = "del_idol";
  19. public const string GET_INTIMATE_FRIENDS_WEIBO = "get_intimate_friends_weibo";
  20. public const string MATCH_NICK_TIPS_WEIBO = "match_nick_tips_weibo";
  21. public const string GET_VIP_INFO = "get_vip_info";
  22. public const string GET_VIP_RICH_INFO = "get_vip_rich_info";
  23. public const string GET_USER_INFO = "get_user_info";
  24. public const string GET_SIMPLE_USER_INFO = "get_simple_user_info";
  25. // public const NSString WEIYUN_UPLOAD_PIC = "get_user_info";
  26. // public const NSString WEIYUN_DOWNLOAD_PIC = "get_user_info";
  27. // public const NSString WEIYUN_GET_PIC_LIST = "get_user_info";
  28. // public const NSString WEIYUN_DELETE_PIC = "get_user_info";
  29. // public const NSString WEIYUN_GET_PIC_THUMB = "get_user_info";
  30. // public const NSString WEIYUN_UPLOAD_MUSIC = "get_user_info";
  31. // public const NSString WEIYUN_DOWNLOAD_MUSIC = "get_user_info";
  32. // public const NSString WEIYUN_GET_MUSIC_LIST = "get_user_info";
  33. // public const NSString WEIYUN_DELETE_MUSIC = "get_user_info";
  34. // public const NSString WEIYUN_UPLOAD_VIDEO = "get_user_info";
  35. // public const NSString WEIYUN_DOWNLOAD_VIDEO = "get_user_info";
  36. // public const NSString WEIYUN_GET_VIDEO_LIST = "get_user_info";
  37. // public const NSString WEIYUN_DELETE_VIDEO = "get_user_info";
  38. // public const NSString WEIYUN_UPLOAD_PHOTO = "get_user_info";
  39. // public const NSString WEIYUN_DOWNLOAD_PHOTO = "get_user_info";
  40. // public const NSString WEIYUN_GET_PHOTO_LIST = "get_user_info";
  41. // public const NSString WEIYUN_DELETE_PHOTO = "get_user_info";
  42. // public const NSString WEIYUN_GET_PHOTO_THUMB = "get_user_info";
  43. // public const NSString WEIYUN_CHECK_RECORD = "get_user_info";
  44. // public const NSString WEIYUN_CREATE_RECORD = "get_user_info";
  45. // public const NSString WEIYUN_DELETE_RECORD = "get_user_info";
  46. // public const NSString WEIYUN_GET_RECORD = "get_user_info";
  47. // public const NSString WEIYUN_MODIFY_RECORD = "get_user_info";
  48. // public const NSString WEIYUN_QUERY_ALL_RECORD = "get_user_info";
  49. }

2.NSArray数组处理

登录鉴权部分出现的:((NSArray *)permissions)

  1. /**
  2. * 登录授权
  3. * \param permissions 授权信息列表
  4. * \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b>
  5. */
  6. - (BOOL)authorize:(NSArray *)permissions
  7. inSafari:(BOOL)bInSafari;

既然知道这个参数是个字符数组,我们就不必直译NSArray来添加Api,以免使用时出现数据类型转换的麻烦事,可直接使用string[]

  1. [Export ("authorize:inSafari:")]
  2. bool Authorize(string[] permissions,bool bInSafari);

3.委托协议TencentSessionDelegate

这是个本身引用其它协议的delegate,对比了官方文档说明,有两种参考方案
第一,通过WeakDelegate引用,但这种方案不靠谱,说明它不是简单的weak引用,会报错BI1006

20141011163110474.jpg-76.3kB

  1. [BaseType (typeof (NSObject), KeepUntilRef="Dismiss"),
  2. Delegates=new string [] { "WeakDelegate" }, Events=new Type [] { typeof (SomeDelegate) }) ]
  3. class Demo {
  4. [Export ("show")]
  5. void Show (string message);
  6. }

第二,通过继承使用,可以理解为是使用父类的方法

  1. /**
  2. * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
  3. *
  4. * 第三方应用需要实现每条需要调用的API的回调协议
  5. */
  6. @protocol TencentSessionDelegate<NSObject, TencentLoginDelegate, TencentApiInterfaceDelegate>

对应api为

  1. [Model][Protocol]
  2. [BaseType (typeof(NSObject))]
  3. interface TencentSessionDelegate:TencentLoginDelegate,TencentApiInterfaceDelegate

4.使用SessionDelegate

如果不注意这个参数,你的回调没办法执行,直接闪退,原因就出现在这个参数上,首先看api中

  1. /** 已实现的开放接口的回调委托对象 */
  2. @property(nonatomic, assign) id<TencentSessionDelegate> sessionDelegate;
  1. /**
  2. * 初始化TencentOAuth对象
  3. * \param appId 第三方应用在互联开放平台申请的唯一标识
  4. * \param delegate
  5. 第三方应用用于接收请求返回结果的委托对象
  6. * \return 初始化后的授权登录对象
  7. */
  8. - (id)initWithAppId:(NSString *)appId
  9. andDelegate:(id<TencentSessionDelegate>)delegate;

原以为,initWithAppId这个方法已经对delegate赋值就可以了,但由于使用会对其两次实例化,SessionDelegate无法对应上,因此在使用的时候,同样对其赋值

  1. _TencentOAuth = new TencentOAuth ();
  2. var deg = new SessionDelegate (this);
  3. _TencentOAuth.SessionDelegate = deg;
  4. _TencentOAuth = _TencentOAuth.InitWithAppId(appId,deg);

这样回调才会正常。

这个SDK有着多种不同的数据类型,在对api对应binding的时候,需要理解部分数据类型的含义,所以代码上会出现不同的定义,那就看自己的需要了。
工程,QQSDK(并未完整测试,如有问题及时联系,多谢!)。

作者:zhaowensky_126
原文地址:http://blog.csdn.net/zhaowensky_126/article/details/39995683

分享到