QQSDK(OAuth登录)Binding工程

    本章主要记录的是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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值