分享到 :

iOS-登录及分享

1. SSO安全登录QQ帐号

iOS SDK支持应用跳转到手机QQ进行登录,给用户提供更加安全、快捷的体验 。
如果用户没有安装手机QQ,且开发者具有webview权限,则显示登录页;如果开发者没有webview权限,sdk版本大于等于2.9,则显示登录页,sdk版本小于2.9,则显示下载页。由于跳转至下载页在当前苹果app审核有被拒风险,所以,希望开发者尽快升级是用最新版sdk。

1.1 授权登录

整个授权过程可以分为,发送请求获取用户授权以及获取用户授权结果两个部分。

  • 发送请求获取用户授权:
    在取得用户授权之前,首先必须清楚自己需要用户的哪些信息,iOS SDK提供多种选择,开发者可以根据自己的需要请求用户不同信息的授权。具体可以获取的授权信息参见1.2获取用户授权参数说明。
    在设置完需要请求的授权信息之后,就可以发送请求了(备注:inSafari参数从iOS SDK1.3版本后废除)。
NSArray* permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_USER_INFO,kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,kOPEN_PERMISSION_ADD_SHARE,nil];
TencentOAuth *_tencentOAuth = [TencentOAuth initWithAppid:appid andDelegate:delegate];
[_tencentOAuth authorize:permissions inSafari:NO];

其中_tencentOAuthTencentOAuth类的实例。

  • 获取用户授权结果
    获取用户授权结果,采用的是代理回调的方式,所以开发者需要实现TencentLoginDelegate协议,登录结果分为三种:登录成功、登录失败和登录取消。
- (void)tencentDidLogin;  // 登录成功后的回调
- (void)tencentDidNotLogin:(BOOL)cancelled;  // 登录失败后的回调
- (void)tencentDidNotNetWork;  // 登录时网络有问题的回调

如果登录成功,则开发者可以通过实现TencentLoginDelegate协议中的以下方法获取:

// 登录时权限信息的获得
- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams;

1.2 获取用户授权参数说明

字符串 含义
kOPEN_PERMISSION_GET_USER_INFO 获取用户信息
kOPEN_PERMISSION_GET_SIMPLE_USER_INFO 移动端获取用户信息
kOPEN_PERMISSION_GET_INFO 获取登录用户自己的详细信息
kOPEN_PERMISSION_GET_VIP_RICH_INFO 获取会员用户详细信息
kOPEN_PERMISSION_GET_VIP_INFO 获取会员用户基本信息
kOPEN_PERMISSION_GET_OTHER_INFO 获取其他用户的详细信息
kOPEN_PERMISSION_ADD_TOPIC 发表一条说说到QQ空间 (需要申请权限)
kOPEN_PERMISSION_ADD_ONE_BLOG 发表一篇日志到QQ空间 (需要申请权限)
kOPEN_PERMISSION_ADD_ALBUM 创建一个QQ空间相册 (需要申请权限)
kOPEN_PERMISSION_UPLOAD_PIC 上传一张照片到QQ空间相册 (需要申请权限)
kOPEN_PERMISSION_LIST_ALBUM 获取用户QQ空间相册列表 (需要申请权限)
kOPEN_PERMISSION_ADD_SHARE 同步分享到QQ空间、腾讯微博
kOPEN_PERMISSION_CHECK_PAGE_FANS 验证是否认证空间粉丝

iOS SDK V2.9.5废除了腾讯微博相关的接口,关于废除的参数,特此说明

字符串 含义
kOPEN_PERMISSION_ADD_PIC_T 上传图片并发表消息到腾讯微博
kOPEN_PERMISSION_DEL_T 删除一条微博信息
kOPEN_PERMISSION_GET_REPOST_LIST 获取一条微博的转播或评论信息列表
kOPEN_PERMISSION_GET_FANSLIST 获取登录用户的听众列表
kOPEN_PERMISSION_GET_IDOLLIST 获取登录用户的收听列表
kOPEN_PERMISSION_ADD_IDOL 收听腾讯微博上的用户
kOPEN_PERMISSION_DEL_IDOL 取消收听腾讯微博上的用户
kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO 获取微博中最近at的好友
kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO 获取微博中匹配昵称的好友

2. 分享到QQ和QQ空间

2.1 分享到QQ好友

在用户安装了手机QQ时通过手机QQ进行分享,否则调用浏览器页面进行分享。
其中文本消息,图文消息和音频消息的title是必须的,summary可以不填,具体调用请参考2.3 分享示例代码。
使用分享到QQ好友功能需要设置QQ业务回调,请参考6.处理QQ业务的回调。

2.2 分享到QQ空间

分享到QQ空间的接口用于取代老的分享接口addShareWithParams(该接口已经废弃)。
在用户安装了手机QQ(4.6版本以上)时通过手机QQ中的QZone结合版进行分享,否则调用浏览器页面进行分享。分享时调用浏览器页面进行分享。其中title是必须的,summary可以不填,具体调用请参考2.3 分享示例代码。使用分享到QQ空间功能需要设置QQ业务回调,请参考6.处理QQ业务的回调。
在分享到QQ好友和QQ空间的时候,根据是本地分享还是浏览器中的分享,支持分享的消息类型不同。
因为webQQ好友分享和web QQ空间的分享都不支持非URL类型的分享,所以这里建议在分享到QQ好友或者QQ空间的时候尽量避免这两种类型的调用,避免发生不支持的错误。

分享消息类型 QQ好友 QQ空间 webQQ好友 webQQ空间
QQApiTextObject 支持 不支持 不支持 不支持
QQApiImageObject 支持 不支持 不支持 不支持
QQApiNewsObject 支持 支持 支持 支持
QQApiAudioObject 支持 支持 支持 支持
QQApiVideoObject 支持 支持 支持 支持
QQApiGroupTribeImageObject 仅群部落 不支持 不支持 不支持
QQApiAddFriendObject 游戏好友 不支持 不支持 不支持
QQApiFileObject 仅数据线 不支持 不支持 不支持
QQApiGameConsortiumBindingGroupObject 仅群部落 不支持 不支持 不支持

2.3 分享示例代码(详细请参见SDK中Demo)

下面是各种分享消息的实例代码,作为开发者调用QQ好友分享和QQ空间分享的参考:(注:如果可以分享到QQ空间,则会在示例代码中给出;不给出,则表示空间不支持该类分享)

  • 纯文本分享
//开发者分享的文本内容
QQApiTextObject *txtObj = [QQApiTextObject objectWithText:@"text"];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];
//将内容分享到qq
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 纯图片分享
//开发者分享图片数据
NSData *imgData = [NSData dataWithContentsOfFile:path];
QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imgData
                                           previewImageData:imgData
                                           title:@"title"
                                           description :@"description"];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];
//将内容分享到qq
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 多图分享至QQ收藏
//开发者分享多个图片数据至QQ收藏
NSArray *imgArray = [NSArray arrayWithObjects: imgData, imgData1, imgData2, imgData3, nil];
QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imgData
                                           previewImageData:imgData
                                           title:@"title"
                                           description :@"description"
imageDataArray:imgArray];
[imgObj setCflag:kQQAPICtrlFlagQQShareFavorites];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];
//将内容分享到qq
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 新闻分享
//分享跳转URL
NSString *url = @"http://xxx.xxx.xxx/";
//分享图预览图URL地址
NSString *previewImageUrl = @"preImageUrl.png";
QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:utf8String]
												title: @"title"
												description:@"description"
												previewImageURL:[NSURL URLWithString:previewImageUrl]];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
//将内容分享到qq
//QQApiSendResultCode sent = [QQApiInterface sendReq:req];
//将内容分享到qzone
QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
  • 音乐分享
//分享跳转URL
NSString *url = @"http://xxx.xxx.xxx/";
//分享图预览图URL地址
NSString *previewImageUrl = @"preImageUrl.png";
//音乐播放的网络流媒体地址
NSString *flashURL = @"xxx.mp3 ";
QQApiAudioObject *audioObj =[QQApiAudioObject objectWithURL :[NSURL URLWithString:url] title:@"title" description:@"description" previewImageURL:[NSURL URLWithString:previewImageUrl]];
//设置播放流媒体地址
[audioObj setFlashUrl:flashURL];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:audioObj]
//将内容分享到qq
//QQApiSendResultCode sent = [QQApiInterface sendReq:req];
//将被容分享到qzone
QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
  • 群部落发表话题(2.8.1)
//初始化一些图片数据
 ... ...
QQApiGroupTribeImageObject *imgObj = [QQApiGroupTribeImageObject objectWithData:preImageData previewImageData:preImageData title:self.binding_title ? : @"" description:self.binding_description ? : @"" imageDataArray:imageArray];
if ([self.binding_bid integerValue] > 0)
	imgObj.bid = self.binding_bid;
if ([self.binding_groupTribeName length] > 0)
	imgObj.bname = self.binding_groupTribeName;
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj]
//将内容分享到qq
//QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 分享文件(仅数据线)(2.8.1)
NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.txt"];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
QQApiFileObject *fileObj = [QQApiFileObject objectWithData:fileData previewImageData:nil title:self.binding_title ? : @"" description:self.binding_description ? : @""];
if (self.binding_description != nil && ![self.binding_description isEqualToString:@""])
	fileObj.fileName = self.binding_description;
else
	fileObj.fileName = @"test.txt";
[fileObj setCflag:kQQAPICtrlFlagQQShareDataline];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:fileObj];
//将内容分享到qq
//QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 添加好友(2.8.1)
QQApiAddFriendObject *object = [[QQApiAddFriendObject alloc] initWithOpenID:self.binding_openID];
object.description = self.binding_description;
object.subID = self.binding_subID;
object.remark = self.binding_remark;
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:object];
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
  • 游戏绑定工会群(2.8.1)
QQApiGameConsortiumBindingGroupObject *object = [[QQApiGameConsortiumBindingGroupObject alloc] initWithGameConsortium:self.binding_GroupID unionid:self.binding_GameSectionID zoneID:self.binding_ownerSignature appDisplayName:@"天天酷跑"];
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:object];
QQApiSendResultCode sent = [QQApiInterface sendReq:req];

3. 调用OpenAPI

iOS SDK中具体支持的API种类和每条API的参数说明,请参照API列表。这里用设置用户头像举例说明。

3.1 OpenAPI参数字典封装

在封装各接口的参数字典时,推荐使用为每个接口新增的参数封装辅助类,如接口(BOOL)addShareWithParams:(NSMutableDictionary *)params对应辅助类TCAddShareDic
TCAddShareDic辅助类中属性:
@property (nonatomic, retain) TCRequiredStr paramTitle;对应于CGI请求中参数title
TCRequiredStr 表示这是一个必填参数,类型是字符串
TCOptionalStr 表示这是一个可选参数,类型是字符串

3.2 设置用户头像调用示例

设置QQ头像时,调用TencetnOAuth对象的setUserHeadpic方法:

TCSetUserHeadpic *params = [TCSetUserHeadpic dictionary];
params.paramImage = image;
params.paramFileName = @"make";
UIViewController *headController = nil;
[_tencentOAuth setUserHeadpic:params andViewController:&headController];
UIViewController *rootController = [[[app delegate] window] rootViewController];
[rootController dismissModalViewControllerAnimated:NO];
[rootController presentModalViewController:headController animated:YES];

设置头像完成后,会调用TencentSessionDelegate中的tencentOAuth:doCloseViewController通知应用界面需要关闭:

- (void)tencentOAuth:(TencentOAuth *) tencentOAuth doCloseViewController: (UIViewController *) viewController {
	if (tencentOAuth == _tencentOAuth)  {
		UIApplication *app = [UIApplication sharedApplication];
		UIViewController *rootController = [[[app delegate] window] rootViewController];
		[rootController dismissModalViewControllerAnimated:YES];
	}
}

设置头像完成后,会调用TencentSessionDelegate中的setUserHeadpicResponse返回调用结果:

- (void)setUserHeadpicResponse:(APIResponse*) response {
	if (nil == response)
		return ;
	if (URLREQUEST_FAILED == response.retCode && kOpenSDKErrorUserHeadPicLarge == response.detailRetCode) {
	        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"操作失败" message:[NSString stringWithFormat:@"您的图片大小超标啦,请更换一张试试呢:)"]
	        delegate:self cancelButtonTitle:@"我知道啦" otherButtonTitles: nil];
	        [alert show];
	        [alert release];
	    }
}

3.3 使用增量授权

当第三方应用调用某个API接口时,如果服务器返回操作未被授权,则会触发增量授权逻辑。第三方应用需自行实现tencentNeedPerformIncrAuth:withPermissions:协议接口才能够进入增量授权逻辑,否则默认第三方应用放弃增量授权。示例如下:

- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions: (NSArray *) permissions {
	// incrAuthWithPermissions是增量授权时需要调用的登录接口
	// permissions是需要增量授权的权限列表
	[tencentOAuth incrAuthWithPermissions:permissions];
	// 返回NO表明不需要再回传未授权API接口的原始请求结果,否则返回YES
	return NO;
}

注意:在用户通过增量授权页重新授权登录后,第三方应用需更新自己维护的token及有效期限等信息。
用户在增量授权时是可以更换帐号进行登录的,强烈要求第三方应用核对增量授权后的用户openid是否一致,以添加必要的处理逻辑(用户帐号变更需重新拉取用户的资料等信息)
增量授权成功时,会通过tencentDidUpdate:协议接口通知第三方应用:

- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth {
	_labelTitle.text = @"增量授权完成";
	if (tencentOAuth.accessToken && 0 != [tencentOAuth.accessToken length]) {
	// 在这里第三方应用需要更新自己维护的token及有效期限等信息
	// **务必在这里检查用户的openid是否有变更,变更需重新拉取用户的资料等信息**
		_labelAccessToken.text = tencentOAuth.accessToken;
	} else {
        _labelAccessToken.text = @"增量授权不成功,没有获取accesstoken";
	}
}

增量授权失败时,会通过tencentFailedUpdate:协议接口通知第三方应用:

- (void)tencentFailedUpdate:(UpdateFailType)reason {
    switch (reason) {
        case kUpdateFailNetwork:
            _labelTitle.text=@"增量授权失败,无网络连接,请设置网络";
            break;
        case kUpdateFailUserCancel:
            _labelTitle.text=@"增量授权失败,用户取消授权";
            break;
        case kUpdateFailUnknown:
        default:
            _labelTitle.text=@"增量授权失败,未知错误";
            break;
    }
}

3.4 返回数据说明

APIResponse属性:

  • retCode - 网络请求返回码,主要表示服务器是否成功返回数据
  • seq - 请求的序列号,依次递增,方便内部管理
  • errorMsg - 错误消息
  • jsonResponse - 由服务器返回的json格式字符串转换而来的json字典数据(具体参数字段请参见对应API说明文档)
  • message - 服务器返回的原始字符串数据
  • detailRetCode - 新增的详细错误码,以区分不同的错误原因(v1.2以及之前的SDK接口无此参数)

3.5 返回码说明

retCode网络请求返回码说明:

返回码 含义
0 表示成功,请求成功发送到服务器,并且服务器返回的数据格式正确
1 表示失败,可能原因有网络异常,或服务器返回的数据格式错误,无法解析

detailRetCode详细错误码说明:

返回码 含义
kOpenSDKInvalid 无效的错误码
[公共错误码]
kOpenSDKErrorSuccess 成功
kOpenSDKErrorUnknown 未知错误
kOpenSDKErrorUserCancel 用户取消
kOpenSDKErrorReLogin token无效或用户未授权相应权限需要重新登录
kOpenSDKErrorOperationDeny 第三方应用没有该api操作的权限
[网络相关错误码]
kOpenSDKErrorNetwork 网络错误,网络不通或连接不到服务器
kOpenSDKErrorURL URL格式或协议错误
kOpenSDKErrorDataParse 数据解析错误,服务器返回的数据解析出错
kOpenSDKErrorParam 传入参数错误
kOpenSDKErrorConnTimeout http连接超时
kOpenSDKErrorSecurity 安全问题
kOpenSDKErrorIO 下载和文件IO错误
kOpenSDKErrorServer 服务器端错误
[webview中特有错误]
kOpenSDKErrorWebPage 页面错误
[设置头像 自定义错误码段]
kOpenSDKErrorUserHeadPicLarge 图片过大 设置头像自定义错误码

4. WPA临时会话

iOS SDK支持发起QQ临时会话,获取指定QQ帐号在线状态。使用WPA功能需要设置QQ业务回调,请参考6. 处理QQ业务的回调。

4.1 发起QQ临时会话

下面是向指定QQ号码发起临时会话的示例代码:

- (void)onOpenWPA:(QElement *)sender {
[self.view endEditing:YES];
[self.root fetchValueUsingBindingsIntoObject:self];
QQApiWPAObject *wpaObj = [QQApiWPAObject objectWithUin:self.binding_uin];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:wpaObj];
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
[self handleSendResult:sent];
}

4.2 获取指定QQ号码的在线状态

下面是获取指定QQ号码在线状态的示例代码:

- (void)getQQUinOnlineStatues:(QElement *)sender {
[self.view endEditing:YES];
[self.root fetchValueUsingBindingsIntoObject:self];
NSArray *ARR = [NSArray arrayWithObjects:self.binding_uin, nil];
[QQApiInterface getQQUinOnlineStatues:ARR delegate:self];
}

5. QZone

iOS SDK支持获取QQ用户的信息、发表说说、设置及浏览获取空间相册。

5.1 获取用户信息

获取用户信息分为两个步骤:
首先,发送获取用户信息的请求;

[_tencentOAuth getUserInfo])

其中,_tencentOAuthTencentOAuth类的实例。
其次,实现协议TencentSessionDelegate的获取到用户信息后的回调方法:

//可以通过response获取数据的返回结果
- (void)getUserInfoResponse:(APIResponse*) response;

下面以显示所有信息为例,进行说明:

- (void)getUserInfoResponse:(APIResponse*) response {
	if (URLREQUEST_SUCCEED == response.retCode && kOpenSDKErrorSuccess == response.detailRetCode) {
		NSMutableString *str = [NSMutableString stringWithFormat:@""];
	   for (id key in response.jsonResponse) {
			[str appendString: [NSString stringWithFormat:@"%@:%@\n", key, [response.jsonResponse objectForKey:key]]];
	   }
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"操作成功" message: [NSString stringWithFormat:@"%@",str] delegate:self cancelButtonTitle:@"我知道啦" otherButtonTitles: nil];
		[alert show];
	} else {
		NSString *errMsg = [NSString stringWithFormat:@"errorMsg:%@\n%@",response.errorMsg, [response.jsonResponse objectForKey:@"msg"]];
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"操作失败" message:errMsg delegate:self cancelButtonTitle:@"我知道啦" otherButtonTitles: nil];
		[alert show];
	}
}

5.2分享到QZone

分享方式与第二章中的分享文本及图片等类似,举例如下:

// 设置预览图片
NSURL *previewURL = [NSURL URLWithString:@"…"];
// 设置分享链接
NSURL* url = [NSURL URLWithString: @"…"];
QQApiNewsObject* imgObj = [QQApiNewsObject objectWithURL:url title: @"…" description: @"…" previewImageURL:previewURL];
// 设置分享到QZone的标志位
[imgObj setCflag: kQQAPICtrlFlagQZoneShareOnStart ];
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:imgObj];
QQApiSendResultCode sent = [QQApiInterface sendReq:req];

获取分享结果的方法与5.1中相同,此时需要实现TencentSessionDelegate协议的方法如下,具体用法此处不再赘述使用方法。

// 分享到QZone回调
- (void)addShareResponse:(APIResponse*) response;

5.3 创建QZone相册

创建QZone相册的参数较多是通过TCAddAlbumDic传递的,举例如下:

- (void)addAlbum {
	TCAddAlbumDic *dic = [TCAddAlbumDic dictionary];
	// 设置相册名称
	dic.paramAlbumname = @"…";
	// 设置相册描述
	dic.paramAlbumdesc =@"…";
	NSInteger index = …;
	if (index > 1) {
		//主要是参数是1,3,4,5,缺少个2
		index += 1;
	}
	// 设置相册权限
	dic.paramPriv = [NSString stringWithFormat:@"%d", index];
	if (5 == index) {	// 如果权限为回答问题的人可见
		// 设置问题
		dic.paramQuestion = @"…";
		// 设置问题答案
		dic.paramAnswer = @"…";
	}
	// 发送添加QZone相册请求
	if (NO == [_tencentOAuth addAlbumWithParams:dic]) {
	    // 请求失败,显示相应提示
	    // …
	}
}

其中,_tencentOAuthTencentOAuth类的实例。
获取分享结果的方法与5.1中相同,此时需要实现TencentSessionDelegate协议的方法如下,具体用法此处不再赘述使用方法。

// 在QZone相册中创建一个新的相册回调
- (void)addAlbumResponse:(APIResponse*) response;

相册访问权限及对应的值

访问权限 对应值
所有人可见 1
全部QQ好友可见 3
仅主人可见 4
回答问题的人可见 5

5.4 获取相册列表

获取相册列表的请求只需直接获取即可`[_tencentOAuth getListAlbum]`;获取相册列表的数据,只需实现`TencentSessionDelegate`协议的响应方法即可,该协议方法如下:
// 获取用户QZone相册列表回调
- (void)getListAlbumResponse:(APIResponse*) response;

取得相册列表的具体方法如下:

- (void)getListAlbumResponse:(APIResponse*) response {
	if (URLREQUEST_SUCCEED == response.retCode && kOpenSDKErrorSuccess == response.detailRetCode) {
		// 取得相册数据
		NSArray *blumArray = [[response jsonResponse] objectForKey:@"album"];
	} else {
		NSString *errMsg = [NSString stringWithFormat: @"errorMsg: %@\n%@",response.errorMsg, [response.jsonResponse objectForKey:@"msg"]];
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"操作失败" message:errMsg delegate:self cancelButtonTitle:@"我知道啦" otherButtonTitles: nil];
		[alert show];
	}
}

5.5 上传图片

上传图片可以通过设置TCUploadPicDic并发送相应请求完成。举例如下:

- (void)uploadPic {
	TCUploadPicDic *params = [TCUploadPicDic dictionary];
	// 设置上传的图片,UIImage
	params.paramPicture = image;
	// 上传图片所在的相册ID,可以通过获得相册列表获取
	params.paramAlbumid = [self albumId];
	// 图片名称
	params.paramTitle = @"…";
	// 图片描述
	params.paramPhotodesc = @"…";
	// 如果传1,则当albumid为空时,图片会上传到手机相册
	// 如果传0或不传时,则当albumid为空时,图片会上传到贴图相册
	params.paramMobile = @"1";
	// 标识图片上传时是否发feed,1为发,0为不发
	params.paramNeedfeed = @"1";
	// 照片拍摄时的地理位置的经度
	params.paramX = @"39.909407";
	// 照片拍摄时的地理位置的纬度
	params.paramY = @"116.397521";
	// 发送请求
	if (NO == [_tencentOAuth uploadPicWithParams:params]) {
	        // 请求失败提示
	        // …
	}
}

其中,_tencentOAuthTencentOAuth类的实例。
获取分享结果的方法与5.1中相同,此时需要实现TencentSessionDelegate协议的方法如下,具体用法此处不再赘述使用方法。

// 上传照片到QZone指定相册回调
- (void)uploadPicResponse:(APIResponse*) response;

5.6 发表说说

发表说说可以通过设置TCAddTopicDic并发送相应请求完成。举例如下:

-(void)addTopic {
	TCAddTopicDic *params = [TCAddTopicDic dictionary];
	// 发布说说时引用的信息类型,1表示图片,2表示网页,3表示视频
	params.paramRichtype = @"3";
	// 其参数设置详见本小节末尾处的列表
	params.paramRichval = @"http://www.tudou.com/programs/view/C0FuB0FTv50/";
	// 发布说说内容
	params.paramCon = @"腾讯addtopic接口测试--失控小警察视频参数";
	// 发布说说时的地址
	params.paramLbs_nm = @"广东省深圳市南山区高新科技园腾讯大厦";
	// 第三方平台类型,1表示QQ空间,2表示腾讯朋友,3表示腾讯微博,4表示腾讯Q+
	params.paramThirdSource = @"2";
	// 发布说说时的经度
	params.paramLbs_x = @"39.909407";
	// 发布说说时的纬度
	params.paramLbs_y = @"116.397521";
	// 此部分为用户自定义的保留字段
	[params setObject:@"test" forKey:PARAM_USER_DATA];
	// 发布请求
	if(NO == [_tencentOAuth addTopicWithParams:params]) {
	        // 请求失败提示
	        // …
	}
}

其中,_tencentOAuthTencentOAuth类的实例。
获取分享结果的方法与5.1中相同,此时需要实现TencentSessionDelegate协议的方法如下,具体用法此处不再赘述使用方法。

// 在QZone中发表一条说说回调
- (void)addTopicResponse:(APIResponse*) response;

paramRichval参数设置:
richtype为网页或视频时,此值为该网页或视频的URL
richtype为图片时,详情如下:

  1. 当该图片来自于网站时
    参数名称 是否必须 类型 描述
    url 必须 string 网站图片的URL
    height 必须 string 图片高度,单位:px
    width 必须 string 图片宽度,单位:px

输入时每个值中间用“&”分隔,如下所示:
url=http://qq.com/logo.png&width=25&height=21

  1. 当该图片来自于QQ空间相册时
    参数名称 是否必须 类型 描述
    albumid 必须 string 图片所属空间相册的ID
    pictureid 必须 string 图片ID
    sloc 必须 string 小图ID
    pictype 必须 string 图片类型(JPG=1,GIF=2,PNG=3)
    picheight 必须 string 图片高度,单位:px
    picwidth 必须 string 图片宽度,单位:px

输入时每个值中间用逗号(,)分隔,如下所示 :
albumid,pictureid,sloc,pictype,picheight,picwidth

5.7 验证空间粉丝

验证空间粉丝可以通过设置TCCheckPageFansDic并发送相应请求完成。举例如下:

-(void)checkFans {
	TCCheckPageFansDic *params = [TCCheckPageFansDic dictionary];
	// API参数中的保留字段,可以塞入任意字典支持的类型,再调用完成后会带回给调用方
	params.paramUserData = @"checkFans";
	//表示认证空间的QQ号码
	[params setParamPage_id:@"973751369"];
	// 发送请求
	if(NO == [_tencentOAuth checkPageFansWithParams:params]){
	    // 请求失败提示
	    // …
	}
}

其中,_tencentOAuthTencentOAuth类的实例。
获取分享结果的方法与5.1中相同,此时需要实现TencentSessionDelegate协议的方法如下,具体用法此处不再赘述使用方法。

	// 检查是否是QZone某个用户的粉丝回调
- (void)checkPageFansResponse:(APIResponse*) response;

6. 处理QQ业务的回调

在使用QQApiInterface 的方法时需要设置回调才能正确调用。设置方法如下:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
	[QQApiInterface handleOpenURL:url delegate:qqApiDelegate];
	return YES;
}

handleOpenURL 中添加[QQApiInterface handleOpenURL:url delegate: qqApiDelegate]代码,可以在QQAPIDemoEntry类中实现QQApiInterfaceDelegate的回调方法。更完整的示例请参考SDKDemo。
添加关于onReq和onResp的说明,同时微信与QQ回调相同,提醒开发者注意采用不同的代理处理回调。

返回顶部