本章主要记录的是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(并未完整测试,如有问题及时联系,多谢!)。