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() } }
hangge_1070.zip(2016-02-28)
hangge_1070.zip(2016-09-16 最新版Swift3)
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>
真是太感谢了