Swift - 腾讯官方SDK的配置及使用(分享到QQ空间、分享到好友)
要实现信息分享到QQ空间或者发送消息给好友,我们可以借助第三方的SDK(比如:友盟、shareSDK)。也可以使用腾讯官方提供的SDK。本文介绍后者的配置和使用。
1,腾讯开放平台注册
(1)首先我们要在 腾讯开放平台(http://open.qq.com)上注册个账号。
(2)登陆后创建一个iOS应用,我们会得到一个APP ID,这个后面开发的时候要用到(应用没有提交审核没关系,不影响我们的测试使用)。

2,SDK下载与配置
(1)把iOS_SDK下载到本地,下载地址:http://wiki.open.qq.com/wiki/mobile/SDK下载
(2)将压缩包中的 TencentOpenApi_IOS_Bundle.bundle 和 TencentOpenAPI.framework 添加到项目中来

(3)在 Build Phases -> Link Binary With Libraries 中点击加号,添加如下依赖库到项目中来:libz.tbd、libstdc++.tbd、CoreTelephony.framework、libsqlite3.tbd、CoreGraphics.framework、SystemConfiguration.framework、libiconv.tbd、Security.framework。
(4)在Build Settings -> Linking配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”

(5)在 “info” -> “URL Types”中,新增一个URL Schemes。新的Schemes命名是:tencent + appid

(6)手工创建桥接头文件 bridge.h 来包含需要引用的Objective-C头文件,并设置到编译参数里。头文件内容如下:
//TencentOpenapi #import <TencentOpenAPI/TencentOAuth.h> #import <TencentOpenAPI/QQApiinterface.h> #import <TencentOpenAPI/QQApiInterfaceObject.h> #import <TencentOpenAPI/sdkdef.h> #import <TencentOpenAPI/TencentmessageObject.h> #import <TencentOpenAPI/TencentOAuthObject.h>(7)重写 AppDelegate.swift 的open url方法
//重写openURL
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return TencentOAuth.handleOpen(url)
}
(8)iOS 9系统策略更新,限制了http协议的访问。在“Info.plist”里增加如下代码:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqqwpa</string>
<string>mqqopensdkapiV3</string>
<string>wtloginmqq2</string>
<string>mqzone</string>
<string>mqqopensdkapiV2</string>
<string>mqqapi</string>
<string>mqq</string>
</array>
3,初始化TencentOAuth
我们在发送消息前还要创建iOS SDK API数据对象 TencentOAuth 并初始化其 appid,本样例delegate可以设为空。
import UIKit
class ViewController: UIViewController{
var _tencentOAuth:TencentOAuth!
override func viewDidLoad() {
super.viewDidLoad()
_tencentOAuth = TencentOAuth.init(appId: "1105212016", andDelegate: nil)
}
@IBAction func sendMessage(_ sender: AnyObject) { {
//消息分享相关代码
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
4,分享到QQ好友和QQ空间
iOS SDK支持在用户安装了手机QQ时,会跳转到手机QQ进行分享(我们可以选择分享给QQ好友还是QQ空间等其他地方),否则调用浏览器页面进行分享。
分享完毕后会提示,继续留在QQ还是返回到原APP。


(1)纯文本分享:


(1)纯文本分享:
let txtObj = QQApiTextObject(text: "欢迎访问 hangge.com") let req = SendMessageToQQReq(content: txtObj) QQApiInterface.send(req)
(2)纯图片分享:
let filePath = Bundle.main.path(forResource: "logo", ofType: "png")
let imgData = NSData(contentsOfFile:filePath!)
let imgObj = QQApiImageObject(data: imgData as Data!, previewImageData: imgData as Data!,
title: "hangge.com", description: "航歌 - 做最好的开发者知识平台")
let req = SendMessageToQQReq(content: imgObj)
QQApiInterface.send(req)
(3)新闻分享:
let newsUrl = URL(string: "http://www.hangge.com")
let title = "新闻标题"
let description = "新闻描述"
let previewImageUrl = URL(string: "http://www.hangge.com/blog/images/logo.png")
let newsObj = QQApiNewsObject(url: newsUrl, title: title, description: description,
previewImageURL: previewImageUrl,
targetContentType: QQApiURLTargetTypeNews)
let req = SendMessageToQQReq(content: newsObj)
QQApiInterface.send(req)
(4)音乐分享:
let url = URL(string:
"http://y.qq.com/i/song.html?songid=432451&source=mobileQQ%23wechat_redirect")
let title = "歌曲名:不要说话"
let descriotion = "专辑名:不想放手歌手名:陈奕迅"
let previewImageUrl = URL(string:
"http://imgcache.qq.com/music/photo/mid_album_300/V/E/000J1pJ50cDCVE.jpg")
let audioObj = QQApiAudioObject(url: url, title: title, description: descriotion,
previewImageURL: previewImageUrl,
targetContentType: QQApiURLTargetTypeAudio)
let req = SendMessageToQQReq(content: audioObj)
QQApiInterface.send(req)
(5)视频分享:
let url = URL(string: "http://v.qq.com/cover/5/53x6bbyb07ebl3s/n0013r8esy6.html")
let previewImageUrl = URL(string: "http://www.hangge.com/blog/images/logo.png")
let videoObj = QQApiVideoObject(url: url, title: "黑子的篮球", description: "第一季第一集",
previewImageURL: previewImageUrl,
targetContentType: QQApiURLTargetTypeVideo)
let req = SendMessageToQQReq(content: videoObj)
QQApiInterface.send(req)
5,分享接口调用是否成功的判断与处理
QQApiInterface.send() 方法发送消息后还会返回 QQApiSendResultCode 类型的结果。我们可以根据其结果来判断消息是否能成功调用接口进行发送。如果失败了话还可把原因告知给用户,比如是由于API不支持、还是QQ没安装等等,增强用户体验。
import UIKit
class ViewController: UIViewController{
var _tencentOAuth:TencentOAuth!
override func viewDidLoad() {
super.viewDidLoad()
_tencentOAuth = TencentOAuth.init(appId: "1105212016", andDelegate: nil)
}
//纯文本消息发送
@IBAction func sendTextMessage(_ sender: AnyObject) {
let txtObj = QQApiTextObject(text: "欢迎访问 hangge.com")
let req = SendMessageToQQReq(content: txtObj)
//发送并获取响应结果
let sendResult = QQApiInterface.send(req)
//处理结果
handleSendResult(sendResult: sendResult)
}
//处理分享返回结果
func handleSendResult(sendResult:QQApiSendResultCode){
var message = ""
switch(sendResult){
case EQQAPIAPPNOTREGISTED:
message = "App未注册"
case EQQAPIMESSAGECONTENTINVALID, EQQAPIMESSAGECONTENTNULL,
EQQAPIMESSAGETYPEINVALID:
message = "发送参数错误"
case EQQAPIQQNOTINSTALLED:
message = "QQ未安装"
case EQQAPIQQNOTSUPPORTAPI:
message = "API接口不支持"
case EQQAPISENDFAILD:
message = "发送失败"
case EQQAPIQZONENOTSUPPORTTEXT:
message = "空间分享不支持纯文本分享,请使用图文分享"
case EQQAPIQZONENOTSUPPORTIMAGE:
message = "空间分享不支持纯图片分享,请使用图文分享"
default:
message = "发送成功"
}
print(message)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
7,分享完毕后的回调响应
上面判断的是程序调用QQ是否成功。如果想要知道发送的结果,实现根据用户分享结果(发送成功、用户取消发送、发生其他错误等等)。进行不同的处理。我们可以在程序中添加个回调响应。具体参考我的另一篇文章:Swift - QQ分享完毕后的回调响应(判断是否分享成功)

QQ 需要//重写openURL
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return TencentOAuth.handleOpen(url)
}
微信也要//重写openURL
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
请问站长 两个都集成该怎么办
bridge.h 怎么用 感觉都没用到
handleSendResult是在唤起QQ的一瞬间调用的,只能检测无法唤起手QQ的情况。 比如中途用户取消了或者其他情况是无法检测到的!怎么获取分享后的结果? 比如分享成功 或者失败?
同时集成了微信和QQ,根据站长的文章,都要重写AppDelegate.swift里的方法,而且返回TencentOAuth.HandleOpenURL(url)但是微信返回的也是微信的方法,那么怎么处理?
如果真机测试的时候系统检测到没有安装qq无法分享,那么如何给用户返回这个信息呢,谢谢
有微信的吗 谢谢
航哥 你的源码是不是少url 白名单 需要在info.plist中添加如下,才能实现和QQ有关的授权和分享 对么?
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqqwpa</string>
<string>mqqopensdkapiV3</string>
<string>wtloginmqq2</string>
<string>mqzone</string>
<string>mqqopensdkapiV2</string>
<string>mqqapi</string>
<string>mqq</string>
</array>
真是太感谢了