QQLoginAppDelegate.h

//  QQLoginAppDelegate.h//  QQLogin  Created by xushao on 2/3/14.//  Copyright (c) 2014 TGG. All rights reserved.//#import #import @interface QQLoginAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window;@end

QQLoginAppDelegate.m

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [TencentOAuth HandleOpenURL:url];}-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    return [TencentOAuth HandleOpenURL:url];}

QQLoginViewController

  QQLoginViewController.m//  QQLogin  Created by xushao on 2/3/14.//  Copyright (c) 2014 TGG. All rights reserved.//#import "QQLoginViewController.h"@interface QQLoginViewController ()@property(nonatomic, strong)TencentOAuth *tencentAuth;@end@implementation QQLoginViewController- (void)viewDidLoad{
    [super viewDidLoad];
    [self initAPI];
	// Do any additional setup after loading the view, typically from a nib.}- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.}- (IBAction)login:(UIButton *)sender {
    NSArray *permission = [NSArray arrayWithObjects:@"get_user_info",@"add_t", nil];
    [self.tencentAuth authorize:permission inSafari:NO];
    }- (IBAction)logout:(UIButton *)sender {
    [self.tencentAuth logout:self];}-(void)initAPI{
    self.tencentAuth = [[TencentOAuth alloc] initWithAppId:@"101015000" andDelegate:self];}-(void)tencentDidLogin{
    self.labelText.text = @"login succeful";}-(void)tencentDidNotNetWork{
    self.labelText.text=@"There's not newwork";}-(void)tencentDidNotLogin:(BOOL)cancelled{
    if (cancelled) {
        self.labelText.text = @"canceled";
    }else{
        self.labelText.text =@"didn't login";
    }}-(void)tencentDidLogout{
    self.labelText.text =@"logout";}@end
iOS SDK 环境搭建目录前言	2变更历史	31. iOS SDK 下载	42. iOS SDK目录结构	43. 将iOS SDK文件添加到工程中	44. 修改必要的代码	124.1 修改工程配置文件	124.2 重写AppDelegate 的handleOpenURL和openURL方法	134.3 在代码中实现TencentSessionDelegate协议中的方法	144.4 初始化iOS SDK API数据对象TencentOAuth。	145. 调用SDK登录	15前言QQ登录iOS SDK 封装了QQ登录的登录授权以及大部分OpenAPI,应用只需要修改相应参数,不需要理解验证授权流程,即可快速实现QQ登录功能。iOS平台上(iPad,iPhone,iPod)的应用,请在申请appid,appkey后,使用QQ互联提供的iOS SDK。1.5版本增加 QQAPI 对象,以支持手机QQ的调用。以前申请过 APPID 类似“QQXXXXXXXX”的开发商,建议重新申请。为了兼容旧版本的手机QQ,需要增加 URL Scheme,QQ + 十六进制新AppId,不足八位在首部补0。(如 appid=222222 则 scheme=QQ0003640E)手机QQ SDK说明文档详见iOS SDKAPI使用说明。 本SDK仅适用于移动应用,即基于使用Implicit_Grant方式获取Access_Token接入的应用。 变更历史V2.2	支持拉起手机QQ QQ空间结合版进行QZone分享V2.0.1	增加全新的分享到QZone的接口V2.0   新增API判断手机QQ版本
       新增WPA临时会话
       支持分享音频消息
       Demo 实现简单调整
       分享消息结构化改造
       新增系统库Security.framework 
v1.8	新增了手机QZone开放平台能力支持新增了调用腾讯微云的SDK接口新增了1个发送腾讯微博的接口v1.5	新增了手机QQ SDK的支持新增手机QQ SSO 登录实现v1.4 	新增SendStory空间定向分享接口(sendStory:friendList:)新增增量授权机制v1.3 	新版SDK以framework形式发布新增1个设置QQ头像接口(setUserHeadpic)新增2个微博相关接口(matchNickTips,getIntimateFriends)新增2个会员相关接口(getVipInfo,getVipRichInfo)1. iOS SDK 下载请到SDK下载页面下载最新版本QQ登录iOS SDK。2. iOS SDK目录结构iOS SDK包中带有两个文件:1. TencentOpenAPI.framework打包了iOS SDK的头文件定义和具体实现。2. TencentOpenApi_iOS_Bundle.bundle 打包了iOS SDK需要的资源文件。3. 将iOS SDK文件添加到工程中1. 将iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷贝到应用开发的目录下。然后将TencentOpenAPI.framework从SDK的保存目录拖拽到工程导航视图(project navigator)中的Frameworks虚拟目录下。注意TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle必须放到应用的资源的根目录下,否则会出现资源无法加载的问题。2. 在弹出的对话框中勾选“Create groups for any added folders”,去掉“copy items into destination group’s folder(if needed)”,在Add to targets中选择要加入SDK的target之后点击finish。完成之后就将iOS SDK的framework文件加入了开发工程中。3. 添加SDK依赖的系统库文件。分别是”Security.framework”, “libiconv.dylib”,“SystemConfiguration.framework”,“CoreGraphics.Framework”、“libsqlite3.dylib”、“CoreTelephony.framework”、“libstdc++.dylib”、“libz.dylib”。在Xcode中打开工程配置文件,选择“summary”一栏。4. 在“summary”中选择“Linked Frameworks and Libraries”一栏,点击“+”图标。5. 直接在默认库文件中选择后点击“Add”,下图以添加“SystemConfiguration.framework”为例:6. 返回后看到“SystemConfiguration.framework”已经在“Linked Frameworks and Libraries”中出现。 7. 在Xcode中打开工程配置文件,选择“Build Phases”一栏。8.在“Build Phases”中选择展开“Copy Bundle Resources”一栏,并点击“+”图标9. 选择“Add Other...”,进入iOS SDK文件所在目录,选择TencentOpenApi_IOS_Bundle.bundle,点击回车或者点击“Open”。10. 返回后看到TencentOpenApi_IOS_Bundle.bundle已经在“Copy Bundle Resources”中出现。11. 修改必要的工程配置属性。在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”。4. 修改必要的代码4.1 修改工程配置文件在XCode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type”添加一条新的“URL scheme”,新的scheme = tencent + appid。如果您使用的是XCode3或者更低的版本,则需要在plist文件中添加。Demo中我们注册的appid是222222。如下图4.2 重写AppDelegate 的handleOpenURL和openURL方法openURL:- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{return [TencentOAuth HandleOpenURL:url];}handleOpenURL:- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{return [TencentOAuth HandleOpenURL:url];}4.3 在代码中实现TencentSessionDelegate协议中的方法具体协议可以参照TencentOpenAPI.framework /Headers中的TencentOAuth.h文件4.4 初始化iOS SDK API数据对象TencentOAuth。(1) 创建TencentOAuth并初始化其appid,demo为222222。delegate为实现TencentSessionDelegate的对象:
  _tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"222222",   andDelegate:self]; 这里delegate不能为空(2) 初始化redirectURI(这里需要填写注册APP时填写的域名。默认可以不用填写。建议不用填写。demo中注册时的地址是“www.qq.com”):
  _tencentOAuth.redirectURI = @"www.qq.com"; (3)设置应用需要用户授权的API列表。 (建议如果授权过多的话,可能会造成用户不愿意授权。这里最好只授权应用需要用户赋予的授权。):
  _permissions =  [[NSArray arrayWithObjects:@"get_user_info", @"add_t", nil] retain]; 5. 调用SDK登录1.登录时,调用TencetnOAuth对象的authorize方法:[_tencentOAuth authorize:_permissions inSafari:NO]; 2. 登录完成后,会调用TencentSessionDelegate中关于登录的协议方法。登录成功:
 @protocol TencentSessionDelegate - (void)tencentDidLogin{
    _labelTitle.text = @"登录完成";
    
    if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length]){
    //  记录登录用户的OpenID、Token以及过期时间
        _labelAccessToken.text = _tencentOAuth.accessToken;
    }
    else
    {
        _labelAccessToken.text = @"登录不成功 没有获取accesstoken";
    }}非网络错误导致登录失败:
 @protocol TencentSessionDelegate -(void)tencentDidNotLogin:(BOOL)cancelled{if (cancelled){_labelTitle.text = @"用户取消登录";
	}
	else {
	_labelTitle.text = @"登录失败";
	}} 网络错误导致登录失败:
 @protocol TencentSessionDelegate -(void)tencentDidNotNetWork{
	_labelTitle.text=@"无网络连接,请设置网络";} 3. 登录成功后,即可获取到access token和openid。accessToken和 openid保存在TencentOAuth对象中。可以通过相应的属性方法直接获得。[_tencentOAuth accessToken] ;[_tencentOAuth openId] ;特别提示: 1.由于登录是异步过程,这里可能会由于用户的行为导致整个登录的的流程无法正常走完,即有可能由于用户行为导致登录完成后不会有任何登录回调被调用。开发者在使用SDK进行开发的时候需要考虑到这点,防止由于一直在同步等待登录的回调而造成应用的卡死,建议在登录的时候将这个实现做成一个异步过程。2.获取到的access token具有3个月有效期,过期后提示用户重新登录授权。3. 第三方网站可存储access token信息,以便后续调用OpenAPI访问和修改用户信息时使用。如果需要保存授权信息,需要保存登录完成后返回的accessToken,openid 和 expirationDate三个数据,下次登录的时候直接将这三个数据是设置到TencentOAuth对象中即可。获得:[_tencentOAuth accessToken] ;[_tencentOAuth openId] ;[_tencentOAuth expirationDate] ;设置:[_tencentOAuth setAccessToken:accessToken] ;[_tencentOAuth setOpenId:openId] ;[_tencentOAuth setExpirationDate:expirationDate] ;4. 建议应用在用户登录后,即调用getUserInfo接口获得该用户的头像、昵称并显示在界面上,使用户体验统一。
1. SSO安全登录QQ帐号iOS SDK支持应用跳转到手机QQ进行登录,给用户提供更加安全、快捷的体验 。如果用户没有安装手机QQ,将打开登录页面。2. 分享到QQ和QQ空间2.1 分享到QQ好友分享到QQ好友支持发送:- 纯文本消息(QQApiTextObject)- 纯图片消息(QQApiImageObject)- 新闻类消息(QQApiNewsObject)- 音频类消息(QQApiImageObject)- 视频类消息(QQApiVideoObject)在用户安装了手机QQ时通过手机QQ进行分享,否则调用浏览器页面进行分享。其中文本消息,图文消息和音频消息的title是必须的,summary可以不填,具体调用请参考2.3 分享示例代码。使用分享到QQ好友功能需要设置QQ业务回调,请参考6. 处理QQ业务的回调。2.2 分享到QQ空间分享到QQ空间的接口用于取代老的分享接口addShareWithParams(该接口已经废弃)。分享到QQ空间支持发送:- 带有URL的消息- 新闻类消息(QQApiNewsObject)- 音频类消息(QQApiImageObject)- 视频类消息(QQApiVideoObject)分享时调用浏览器页面进行分享。其中title是必须的,summary可以不填,具体调用请参考2.3 分享示例代码。使用分享到QQ空间功能需要设置QQ业务回调,请参考6. 处理QQ业务的回调。
 2.3 分享示例代码下面是各种分享消息的实例代码,作为开发者调用QQ好友分享和QQ空间分享的参考:纯文本分享:1234QQApiTextObject *txtObj = [QQApiTextObject objectWithText:@"QQ互联测试"];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];//将内容分享到qqQQApiSendResultCode sent = [QQApiInterface sendReq:req];
 纯图片分享:123456789NSString *imgPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.gif"];NSData *imgData = [NSData dataWithContentsOfFile:imgPath];QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imgData
                                               previewImageData:imgData
                                               title:@"QQ互联测试"
                                               description:@"QQ互联测试分享"];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];//将内容分享到qqQQApiSendResultCode sent = [QQApiInterface sendReq:req];
 新闻分享:1234567891011121314NSString *utf8String = @"http://www.163.com";NSString *title = @"新闻标题";NSString *description = @"新闻描述";NSString *previewImageUrl = @"http://cdni.wired.co.uk/620x413/k_n/NewsForecast%20copy_620x413.jpg";QQApiNewsObject *newsObj = [QQApiNewsObjectobjectWithURL:[NSURL URLWithString:utf8String]title:title
description:description
previewImageURL:[NSURL URLWithString:previewImageUrl]];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];//将内容分享到qq//QQApiSendResultCode sent = [QQApiInterface sendReq:req];//将内容分享到qzoneQQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
 
 音乐分享:123456789101112131415NSString *utf8String = @"http://y.qq.com/i/song.html?songid=432451&source=mobileQQ%23wechat_redirect";NSString *title = @"歌曲名:不要说话";NSString *descriotion = @"专辑名:不想放手歌手名:陈奕迅";NSString *previewImageUrl = @"http://imgcache.qq.com/music/photo/mid_album_300/V/E/000J1pJ50cDCVE.jpg";NSString *flashURL = @"http://10.136.9.109/fcgi-bin/fcg_music_get_playurl.fcg?song_id=1234&redirect=0&filetype=mp3&qqmusic_fromtag=15&app_id=100311325&app_key=b233c8c2c8a0fbee4f83781b4a04c595&device_id=1234";QQApiAudioObject *audioObj =[QQApiAudioObject objectWithURL:[NSURL URLWithString:utf8String]title:title
description:descriotion
previewImageURL:[NSURL URLWithString:previewImageUrl]];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:audioObj]//将内容分享到qq//QQApiSendResultCode sent = [QQApiInterface sendReq:req];//将被容分享到qzoneQQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];视频分享:12345678910111213NSString *previewPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"video.jpg"];NSData* previewData = [NSData dataWithContentsOfFile:previewPath];NSString *utf8String = @"http://www.163.com";QQApiVideoObject *videoObj = [QQApiVideoObject objectWithURL:[NSURL URLWithString:utf8String ? : @""]title:@"QQ互联测试"description:@"QQ互联测试分享"previewImageData:previewData];[videoObj setFlashURL:[NSURL URLWithString:@"http://v.qq.com/cover/5/53x6bbyb07ebl3s/n0013r8esy6.html"]];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:videoObj];//将内容分享到qq//QQApiSendResultCode sent = [QQApiInterface sendReq:req];//将被容分享到qzoneQQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];注意:分享到QQ空间接口暂时不支持发送多张图片的能力,若开发者传入多张图片,则会自动选入第一张图片作为预览图。多图的能力将在以后支持。
 3. 调用OpenAPISDK中具体支持的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方法:12345678TCSetUserHeadpic *params = [TCSetUserHeadpic dictionary];params.paramImage = p_w_picpath;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通知应用界面需要关闭:1234567891011@protocol TencentSessionDelegate- (void)setUserHeadpicResponse:(APIResponse*) response- (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返回调用结果:12345678910111213141516@protocol TencentSessionDelegate- (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:协议接口才能够进入增量授权逻辑,否则默认第三方应用放弃增量授权。示例如下:123456789- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth
withPermissions:(NSArray *)permissions{// incrAuthWithPermissions是增量授权时需要调用的登录接口// permissions是需要增量授权的权限列表[tencentOAuth incrAuthWithPermissions:permissions];return NO; // 返回NO表明不需要再回传未授权API接口的原始请求结果;// 否则可以返回YES}
 注意:在用户通过增量授权页重新授权登录后,第三方应用需更新自己维护的token及有效期限等信息。**用户在增量授权时是可以更换帐号进行登录的,强烈要求第三方应用核对增量授权后的用户openid是否一致,以添加必要的处理逻辑(用户帐号变更需重新拉取用户的资料等信息)**增量授权成功时,会通过tencentDidUpdate:协议接口通知第三方应用:1234567891011121314- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth{
    _labelTitle.text = @"增量授权完成";
    if (tencentOAuth.accessToken        && 0 != [tencentOAuth.accessToken length])
    { // 在这里第三方应用需要更新自己维护的token及有效期限等信息
        // **务必在这里检查用户的openid是否有变更,变更需重新拉取用户的资料等信息**
    _labelAccessToken.text = tencentOAuth.accessToken;
    }
    else
    {
        _labelAccessToken.text = @"增量授权不成功,没有获取accesstoken";
    }}
 增量授权失败时,会通过tencentFailedUpdate:协议接口通知第三方应用:12345678910111213141516171819202122- (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. 调用微云接口iOS SDK支持调用腾讯微云的接口,支持对照片,音频,视频,结构化数据的上传,下载,删除等能力。下面以微云照片上传为例,向开发者介绍如何向腾讯微云上传照片。4.1创建微云request对象,调用TencentOAuth实例的统一发送接口123456789101112- (void)weiyunUpload:(NSNumber *)weiyunType{
    WeiYun_upload_photo_GET *request = [[WeiYun_upload_photo_GET alloc] init];
    //data是图片的二进制数据流
    request.param_sha = [data digest];
    request.param_md5 = [data md5];
    request.param_name = @"test";
    request.param_size = [NSString stringWithFormat:@"%u", [data length]];
    request.param_upload_type = @"control";
    request.paramUploadData = data;
    [_tencentOAuth sendAPIRequest:request callback:self];}
 4.2 实现TCAPIRequestDelegate协议,响应结果-(void)cgiRquest:didResponse用来响应统一api的调用结果,request是请求的消息,response是响应的结果。123456789101112- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response{
    if (URLREQUEST_SUCCEED == response.retCode && kOpenSDKErrorSuccess == response.detailRetCode)
    {
        NSString *str = [self responseDataProcess:request didResponse:response];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"操作成功"
                        message:[NSString stringWithFormat:@"%@",str]
                        delegate:self cancelButtonTitle:@"我知道啦" 
                        otherButtonTitles: nil];
        [alert show];
    }}
 注意:上传图片是两步的过程。需要先获得上传参数,再根据上传参数拼装HTTP协议上传到微云的服务器。两步是分开进行的,所以需要注意两个问题。1.第三方需要将上传对象进行保存,否则将无法进行默认的大数据上传。2.iOS SDK 1.8实现了拉取上传参数和数据的上传。但是上传没有实现断点续传,所以对大数据的上传支持有限,可以通过实现 TCAPIRequestUploadDelegate 和 TCAPIRequestDownloadDelegate 来取消内部的自动上传和下载的逻辑,获得上传下载参数后自己拼装请求参数。TCAPIRequestUploadDelegate 协议:1- (BOOL)cgiUploadRequest:(TCAPIRequest *)uploadRequest shouldBeginUploadingStorageRequest:(NSURLRequest *)storageRequest;
 TCAPIRequestDownloadDelegate 协议:1- (BOOL)cgiDownloadRequest:(TCAPIRequest *)downloadRequest shouldBeginDownloadingStorageRequest:(NSURLRequest *)storageRequest;如果不实现上传、下载协议,则按默认方式进行数据的上传下载。第三方实现协议若返回YES,则默认进行数据的上传下载。返回NO则停止上传下载。由第三方获取当前数据后自己上传下载数据。其他API统一接口的调用参照上传照片的调用方式。目前统一接口主要支持微云所有API接口的调用和微博上传带有图片微博的调用,具体可以参考WeiyunAPI.h和WeiboAPI.h中有关微云和微博TCAPIRequest对象的定义。
 5. WPA临时会话iOS SDK支持发起QQ临时会话,获取指定QQ帐号在线状态。使用WPA功能需要设置QQ业务回调,请参考6. 处理QQ业务的回调。5.1 发起QQ临时会话下面是向指定QQ号码发起临时会话的示例代码:123456789- (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];}
 5.2 获取指定QQ号码的在线状态下面是获取指定QQ号码在线状态的示例代码:1234567- (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];}
 6. 处理QQ业务的回调

 在使用QQApiInterface 的方法时需要设置回调才能正确调用。设置方法如下:1234567891011- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{#if __QQAPI_ENABLE__[QQApiInterface handleOpenURL:url delegate:(id)[QQAPIDemoEntry class]];#endifif (YES == [TencentOAuth CanHandleOpenURL:url]){return [TencentOAuth HandleOpenURL:url];}return YES;}
 在handleOpenURL 中添加[QQApiInterface handleOpenURL:url delegate:(id)[QQAPIDemoEntry class]]代码,可以在QQAPIDemoEntry类中实现QQApiInterfaceDelegate的回调方法。更完整的示例请参考SDKDemo。7. iOS SDK 腾讯平台开放能力iOS SDK支持第三方应用成为腾讯业务内容的提供商,要想成为腾讯业务内容提供商需要在QQ互联的官网进行注册。使用SDK响应腾讯业务发起的内容请求可以参考下面的操作:7.1 修改工程配置文件在XCode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type”添加一条新的“URL scheme”,新的scheme = tencent + appid+‘.’+ content,identifier“tencentApiIdentifier”为。如果您使用的是XCode3或者更低的版本,则需要在plist文件中添加。Demo中我们注册的appid是222222。如下图7.2 重写AppDelegate 的handleOpenURL和openURL方法openURL:1234567- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    if (YES == [TencentApiInterface canOpenURL:url delegate:self])
    {
        [TencentApiInterface handleOpenURL:url delegate:self];
    }}
 handleOpenURL1234567- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    if (YES == [TencentApiInterface canOpenURL:url delegate:self])
    {
        [TencentApiInterface handleOpenURL:url delegate:self];
    }}
 7.3 实现TencentApiInterfaceDelegate协议响应腾讯业务的请求,需要实现TencentApiInterfaceDelegate协议的两个方法:1234@protocol TencentApiInterfaceDelegate//onTencentReq是腾讯业务向第三方应用主动发起请求,要求第三方应用响应提供内容,第三方应用再响应完成后需要调用TencentApiInterface的sendRespMessageToTencentApp返回腾讯业务。- (BOOL)onTencentReq(TencentApiReq *)req;//onTencentResp是第三方应用主动向腾讯业务发起请求后,腾讯业务返回请求结果。
 可以参考以下代码实现对腾讯业务的请求的响应,或参考我们的sample中的代码实现1234567891011121314151617181920212223242526272829- (BOOL)onTencentReq:(TencentApiReq *)req{
    NSArray *array = [req arrMessage];
    for (id obj in array)
    {
        if ([obj isKindOfClass:[TencentTextMessageObjV1 class]])
        {
            obj = (TencentTextMessageObjV1 *)obj;
            [obj setSText:@"test"];
        }
        if ([obj isKindOfClass:[TencentImageMessageObjV1 class]])
        {
            obj = (TencentImageMessageObjV1 *)obj;
            NSString *path = [NSString stringWithFormat:@"%@/qzone0.jpg",
            [[NSBundle mainBundle] resourcePath]];
            UIImage *p_w_picpath = [[UIImage alloc] initWithContentsOfFile:path];
            NSData *data = UIImageJPEGRepresentation(p_w_picpath, 1.0f);
            [obj setDataImage:data];
        }
        if ([obj isKindOfClass:[TencentVideoMessageV1 class]])
        {
            //请加入一段视频URL
            obj = (TencentVideoMessageV1 *)obj;
            [obj setSUrl:@" http://www.tudou.com/programs/view/_cVM3aAp270/"];
        }
    }
    TencentApiResp *resp = [TencentApiResp respFromReq:req];
    [TencentOAuth sendRespMessageToTencentApp:resp];}


1.集成【QQ登录】SDK


【QQ登录】SDK下载地址:

http://wiki.open.qq.com/wiki/website/SDK下载

【QQ登录】相关的帮助文档地址:

http://wiki.opensns.qq.com/wiki/【QQ登录】IOS_SDK使用说明

在里边帮助文档写的很清楚,也很给力,傻瓜式的配置步骤!应该没有什么难度!

2.腾讯SDK的困惑

当我集成【QQ登录】SDK的时候,我觉的很困惑:【腾讯开放平台】和【QQ登录】和【腾讯微信】之间的关系?


【腾讯开放平台】:即open.qq.com,主要是接入空间、朋友网之间的功能。QQ登录】不互通。有自己封装好的API。

【QQ登录】:针对QQ的;主要接入跟QQ好友,分组等相关功能。与【腾讯开放平台】不互通。有自己封装好的API。

【腾讯微信】:【腾讯开放平台】与【QQ登录】都集成了微信的相关功能API。可以自己根据API说明来手动写POST来调用接口,完成相应的功能!

还有最近出了相应的【腾讯微博开放平台】,主要针对微博:http://dev.t.qq.com/wireless/ios/

如果需要,也可以了解一下。


可见,腾讯将自己的开放平台分解成几个相关的子模块!并且子模块之间也可以相互调用【开放平台】的接口!

3.一些接入过程中可以使用的资源和理解

1、有帮助文档的API说明,使用时可以查阅。

2、在【QQ登录】SDK中,oauth_consumer_key=appid

3、可以使用测试工具来测试接口:http://connect.qq.com/sdk/webtools/index.html(很给力!!!)