最近做了一个分享内容到QQ以及QQ空间的功能,记录一下以备不时之需。

1、首先我们需要到http://wiki.connect.qq.com/这个网站里为自己创建一个应用,并获取一个APP ID和APP KEY。这两样东西在使用QQ登录和分享到QQ/QQ空间都会用到。这里只讲分享到QQ/QQ空间的处理。

QQ 分享至QQ空间功能java如何开发 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 分享至QQ空间功能java如何开发 qq空间分享文件_qq分享_02


这样就可以跳转到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是一样的,只有返回参数不同,可能会有问题存在。这时我们只需像上边那样,判断一下返回参数的类型分别处理即可。