当前位置: > > > Swift - 腾讯官方SDK的配置及使用(分享到QQ空间、分享到好友)

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.bundleTencentOpenAPI.framework 添加到项目中来

(3)在 Build Phases -> Link Binary With Libraries 中点击加号,添加如下依赖库到项目中来:libz.tbdlibstdc++.tbdCoreTelephony.frameworklibsqlite3.tbdCoreGraphics.frameworkSystemConfiguration.frameworklibiconv.tbdSecurity.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)纯文本分享:
            
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()
    }    
}

6,源码下载
hangge_1070.zip(2016-02-28)
hangge_1070.zip(2016-09-16 最新版Swift3)

7,分享完毕后的回调响应
上面判断的是程序调用QQ是否成功。如果想要知道发送的结果,实现根据用户分享结果(发送成功、用户取消发送、发生其他错误等等)。进行不同的处理。我们可以在程序中添加个回调响应。具体参考我的另一篇文章:Swift - QQ分享完毕后的回调响应(判断是否分享成功)
评论8
  • 8楼
    2017-09-17 00:08
    梦子

    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)
    }
    请问站长 两个都集成该怎么办

    站长回复

    两个都集成也没问题,你可以根据url来进行判断,是QQ的url就 return TencentOAuth.handleOpen(url)。是微信的话就return WXApi.handleOpen(url, delegate: self)

  • 7楼
    2016-09-19 15:38
    无yi

    bridge.h 怎么用 感觉都没用到

    站长回复

    当然有用了,因为腾讯SDK使用Objective-C写的。如果我们要在Swift中使用,就必须先在桥街头文件中引用进来。同时这个bridge.h在工程中也要配置一下,具体参考我原来写的这篇文章:Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)

  • 6楼
    2016-08-01 18:42
    无忧乐活

    handleSendResult是在唤起QQ的一瞬间调用的,只能检测无法唤起手QQ的情况。 比如中途用户取消了或者其他情况是无法检测到的!怎么获取分享后的结果? 比如分享成功 或者失败?

    站长回复

    可以参考我最近写的另一篇文章:Swift - QQ分享完毕后的回调响应(判断是否分享成功)

  • 5楼
    2016-08-01 17:09
    无忧乐活

    同时集成了微信和QQ,根据站长的文章,都要重写AppDelegate.swift里的方法,而且返回TencentOAuth.HandleOpenURL(url)但是微信返回的也是微信的方法,那么怎么处理?

    站长回复

    不太明白你说的“微信返回的也是微信的方法”是什么意思。分享QQ,和分享微信这两个是独立的,应该互不影响的。

  • 4楼
    2016-04-05 16:48
    真珠奶茶小土逗

    如果真机测试的时候系统检测到没有安装qq无法分享,那么如何给用户返回这个信息呢,谢谢

    站长回复

    QQApiInterface.sendReq()发送后使用返回结果的,可以根据这个判断是否分享成功。我文章尾部已补充相关内容,你可以看下。

  • 3楼
    2016-03-26 18:43
    有微信的吗 谢谢

    有微信的吗 谢谢

    站长回复

    有的,Swift - 发送消息(文本,图片,文件等)给微信好友或分享到朋友圈(http://www.hangge.com/blog/cache/detail_757.html)

  • 2楼
    2016-03-16 15:50
    果啤

    航哥 你的源码是不是少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>

    站长回复

    这个是我遗漏了,多谢提醒,现已修正。

  • 1楼
    2016-03-15 14:14
    qlcx35@gmail.com

    真是太感谢了

    站长回复

    不客气,欢迎常来看看。