QQSDK(OAuth登录)Binding工程

来源:互联网 发布:淘宝店铺7阶层是什么 编辑:程序博客网 时间:2024/06/08 13:33

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

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

<span style="font-family:SimSun;font-size:14px;">/** 取消收听腾讯微博上的用户 */FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_DEL_IDOL;/** 获取微博中最近at的好友 */FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO;/** 获取微博中匹配昵称的好友 */FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO;/** 获取会员用户基本信息 */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;</span>

    _permissions = [[NSArray arrayWithObjects:                     kOPEN_PERMISSION_GET_USER_INFO,                     kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,                     kOPEN_PERMISSION_ADD_ALBUM,                     kOPEN_PERMISSION_ADD_IDOL,                     kOPEN_PERMISSION_ADD_ONE_BLOG,                     kOPEN_PERMISSION_ADD_PIC_T,                     kOPEN_PERMISSION_ADD_SHARE,                     kOPEN_PERMISSION_ADD_TOPIC,                     kOPEN_PERMISSION_CHECK_PAGE_FANS,                     kOPEN_PERMISSION_DEL_IDOL,                     kOPEN_PERMISSION_DEL_T,                     kOPEN_PERMISSION_GET_FANSLIST,                     kOPEN_PERMISSION_GET_IDOLLIST,                     kOPEN_PERMISSION_GET_INFO,                     kOPEN_PERMISSION_GET_OTHER_INFO,                     kOPEN_PERMISSION_GET_REPOST_LIST,                     kOPEN_PERMISSION_LIST_ALBUM,                     kOPEN_PERMISSION_UPLOAD_PIC,                     kOPEN_PERMISSION_GET_VIP_INFO,                     kOPEN_PERMISSION_GET_VIP_RICH_INFO,                     kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO,                     kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO,                     nil] retain];

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


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

public class OPEN_PERMISSION{public const string ADD_TOPIC = "add_topic";public const string ADD_ONE_BLOG = "add_one_blog";public const string ADD_ALBUM = "add_album";public const string UPLOAD_PIC = "upload_pic";public const string LIST_ALBUM = "list_album";public const string ADD_SHARE = "add_share";public const string CHECK_PAGE_FANS = "check_page_fans";public const string ADD_PIC_T = "add_pic_t";public const string DEL_T = "del_t";public const string GET_REPOST_LIST = "get_repost_list";public const string GET_INFO = "get_info";public const string GET_OTHER_INFO = "get_other_info";public const string GET_FANSLIST = "get_fanslist";public const string GET_IDOLLIST = "get_idollist";public const string ADD_IDOL = "add_idol";public const string DEL_IDOL = "del_idol";public const string GET_INTIMATE_FRIENDS_WEIBO = "get_intimate_friends_weibo";public const string MATCH_NICK_TIPS_WEIBO = "match_nick_tips_weibo";public const string GET_VIP_INFO = "get_vip_info";public const string GET_VIP_RICH_INFO = "get_vip_rich_info";public const string GET_USER_INFO = "get_user_info";public const string GET_SIMPLE_USER_INFO = "get_simple_user_info";//public const NSString WEIYUN_UPLOAD_PIC = "get_user_info";//public const NSString WEIYUN_DOWNLOAD_PIC = "get_user_info";//public const NSString WEIYUN_GET_PIC_LIST = "get_user_info";//public const NSString WEIYUN_DELETE_PIC = "get_user_info";//public const NSString WEIYUN_GET_PIC_THUMB = "get_user_info";//public const NSString WEIYUN_UPLOAD_MUSIC = "get_user_info";//public const NSString WEIYUN_DOWNLOAD_MUSIC = "get_user_info";//public const NSString WEIYUN_GET_MUSIC_LIST = "get_user_info";//public const NSString WEIYUN_DELETE_MUSIC = "get_user_info";//public const NSString WEIYUN_UPLOAD_VIDEO = "get_user_info";//public const NSString WEIYUN_DOWNLOAD_VIDEO = "get_user_info";//public const NSString WEIYUN_GET_VIDEO_LIST = "get_user_info";//public const NSString WEIYUN_DELETE_VIDEO = "get_user_info";//public const NSString WEIYUN_UPLOAD_PHOTO = "get_user_info";//public const NSString WEIYUN_DOWNLOAD_PHOTO = "get_user_info";//public const NSString WEIYUN_GET_PHOTO_LIST = "get_user_info";//public const NSString WEIYUN_DELETE_PHOTO = "get_user_info";//public const NSString WEIYUN_GET_PHOTO_THUMB = "get_user_info";//public const NSString WEIYUN_CHECK_RECORD = "get_user_info";//public const NSString WEIYUN_CREATE_RECORD = "get_user_info";//public const NSString WEIYUN_DELETE_RECORD = "get_user_info";//public const NSString WEIYUN_GET_RECORD = "get_user_info";//public const NSString WEIYUN_MODIFY_RECORD = "get_user_info";//public const NSString WEIYUN_QUERY_ALL_RECORD = "get_user_info";}

2.NSArray数组处理

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

/** * 登录授权 * \param permissions 授权信息列表 * \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b> */- (BOOL)authorize:(NSArray *)permissions inSafari:(BOOL)bInSafari;
既然知道这个参数是个字符数组,我们就不必直译NSArray来添加Api,以免使用时出现数据类型转换的麻烦事,可直接使用string[]

[Export ("authorize:inSafari:")]bool Authorize(string[] permissions,bool bInSafari);
3.委托协议TencentSessionDelegate

这是个本身引用其它协议的delegate,对比了官方文档说明,有两种参考方案

第一,通过WeakDelegate引用,但这种方案不靠谱,说明它不是简单的weak引用,会报错BI1006


[BaseType (typeof (NSObject), KeepUntilRef="Dismiss"),   Delegates=new string [] { "WeakDelegate" }, Events=new Type [] { typeof (SomeDelegate) }) ]  class Demo {      [Export ("show")]      void Show (string message);  }  
第二,通过继承使用,可以理解为是使用父类的方法

/** * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议 * * 第三方应用需要实现每条需要调用的API的回调协议 */@protocol TencentSessionDelegate<NSObject, TencentLoginDelegate, TencentApiInterfaceDelegate>
对应api为
[Model][Protocol]  [BaseType (typeof(NSObject))]interface TencentSessionDelegate:TencentLoginDelegate,TencentApiInterfaceDelegate

4.使用SessionDelegate

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

/** 已实现的开放接口的回调委托对象 */@property(nonatomic, assign) id<TencentSessionDelegate> sessionDelegate;
/** * 初始化TencentOAuth对象 * \param appId 第三方应用在互联开放平台申请的唯一标识 * \param delegate 第三方应用用于接收请求返回结果的委托对象 * \return 初始化后的授权登录对象 */- (id)initWithAppId:(NSString *)appId        andDelegate:(id<TencentSessionDelegate>)delegate;
原以为,initWithAppId这个方法已经对delegate赋值就可以了,但由于使用会对其两次实例化,SessionDelegate无法对应上,因此在使用的时候,同样对其赋值

_TencentOAuth = new TencentOAuth ();var deg = new SessionDelegate (this);_TencentOAuth.SessionDelegate = deg;_TencentOAuth = _TencentOAuth.InitWithAppId(appId,deg);
这样回调才会正常。


这个SDK有着多种不同的数据类型,在对api对应binding的时候,需要理解部分数据类型的含义,所以代码上会出现不同的定义,那就看自己的需要了。

工程,QQSDK(并未完整测试,如有问题及时联系,多谢!)。





0 0