最近做了一个分享内容到QQ以及QQ空间的功能,记录一下以备不时之需。
1、首先我们需要到http://wiki.connect.qq.com/这个网站里为自己创建一个应用,并获取一个APP ID和APP KEY。这两样东西在使用QQ登录和分享到QQ/QQ空间都会用到。这里只讲分享到QQ/QQ空间的处理。
顺便提一句,注册的安卓应用和苹果应用APP ID和APP KEY都是一致的,所以安卓或苹果只需注册一个则两者都可以使用。
2、下载腾讯的SDK http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD 选择这个:iOS_SDK_V3.1.0 并下载。下载完成后将SDK中的 TencentOpenAPI.framework 和 TencentOpenApi_IOS_Bundle.bundle文件放到自己工程内。
3、首先我们需要在自己工程的AppDelegate.m文件中导入下面三个头文件:
import ” TencentOpenAPI/TencentOAuth.h”
import “TencentOpenAPI/QQApiInterface.h”
import “TencentOpenAPI/TencentApiInterface.h”
然后需要初始化一下授权:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
'''
(void)[[TencentOAuth alloc] initWithAppId:TENCENT_ID andDelegate:self];
'''
return YES;
}
TENCENT_ID就是注册应用时获取的APP ID。
4.1、在TARGETS>INFO>URL TYPES中加入腾讯的URL Schemes,格式为:tencent+APP ID。如下图所示
这样就可以跳转到QQ应用准备分享。
4.2、苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。
受此影响,当你的应用在iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 微信 URL Scheme 白名单-->
<string>wechat</string>
<string>weixin</string>
<!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<!-- QQ、Qzone URL Scheme 白名单-->
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdk</string>
<!-- 支付宝 URL Scheme 白名单-->
<string>alipay</string>
<string>alipayshare</string>
</array>
5、准备分享内容的主体(以分享新闻链接为例):
NSString *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 = [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];
详细的分享内容可以参照 腾讯的api使用说明:http://wiki.connect.qq.com/ios_sdk_api_%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
6、设置分享后回调。在AppDelegate.m里设置回调处理,这样设置的目的是分享完成之后能够返回自己的应用:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if([url.absoluteString hasPrefix:[NSString stringWithFormat:@"tencent%@",TENCENT_ID]]){
return [QQApiInterface handleOpenURL:url delegate:self];
}
return YES;
}
设置分享完成,返回自己应用后的处理:
#pragma mark - WeiChat或QQ 发送与接收请求处理
- (void)onReq:(BaseReq *)req {
Log(@"on Req: %@", req.description);
}
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:SendMessageToWXResp.class]) {
if (resp.errCode == 0) {
NewAlertSuccess(@"提示", @"分享成功!");
} else if (resp.errCode != -2) {
NewAlertWarning(@"提示", resp.errStr);
}
} else if([resp isKindOfClass:SendAuthResp.class]) {
SendAuthResp *aresp = (SendAuthResp *)resp;
if (aresp.errCode== 0) {
NSString *code = aresp.code;
[[NSNotificationCenter defaultCenter] postNotificationName:@"WeiChatCode" object:code];
}
}else if ([resp.class isSubclassOfClass: [SendMessageToQQResp class]]){ //qq回调
SendMessageToQQResp *QQResp = (SendMessageToQQResp *)resp;
if ([QQResp.result isEqualToString:@"0"]) {
NewAlertSuccess(@"提示", @"分享成功!");
}
}
}
需要注意一点,如果自己应用中也同时集成了微信分享的话,由于微信分享的回调处理的协议方法名与QQ是一样的,只有返回参数不同,可能会有问题存在。这时我们只需像上边那样,判断一下返回参数的类型分别处理即可。