我之前寫過一篇關於調用QQ分享的文章:Swift - 騰訊官方SDK的配置及使用(分享到QQ空間、分享到好友)。通過使用騰訊提供的 SDK,我們可以從自己的 App 跳轉到手機 QQ,將消息分享給QQ 好友或發布到空間上。
通過 QQApiInterface.send() 方法發送消息後,根據返回 QQApiSendResultCode 類型的結果。我們可以判斷 QQ 是否調用成功。沒調用成功的話還能得到具體錯誤原因(API 不支持、還是 QQ 沒安裝等等)
除了判斷調用是否成功,我們有時還會需要知道發送的結果,這樣根據用戶分享結果進行不同的處理。本文演示如何通過委托響應,捕獲消息分享的結果。
1,樣例效果圖
當分享消息完畢,返回應用時,我們應用中會顯示是否分享成功的提示。如果分享失敗,還會附帶上失敗原因。
2,樣例代碼
(1)ViewController.swift
分享相關的代碼與前文一樣,這裡就不再寫了。點擊查看詳細代碼
(2)AppDelegate.swift
我們在 AppDelegate 中除了要重寫 open url 方法,還要添加 QQApiInterfaceDelegate 代理,並實現相關的代理方法。這樣當消息發送完畢後,我們可以在回調方法中進行需要的操作。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, QQApiInterfaceDelegate {
var window: UIWindow?
//重寫openURL
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
QQApiInterface.handleOpen(url, delegate: self)
return TencentOAuth.handleOpen(url)
}
//處理來至QQ的響應
func onResp(_ resp: QQBaseResp!) {
print("--- onResp ---")
//確保是對我們QQ分享操作的回調
if resp.isKind(of: SendMessageToQQResp.self) {
//QQApi應答消息類型判斷(手Q -> 第三方應用,手Q應答處理分享消息的結果)
if uint(resp.type) == ESENDMESSAGETOQQRESPTYPE.rawValue {
let title = resp.result == "0" ? "分享成功" : "分享失敗"
var message = ""
switch(resp.result){
case "-1":
message = "參數錯誤"
case "-2":
message = "該群不在自己的群列表裡面"
case "-3":
message = "上傳圖片失敗"
case "-4":
message = "用戶放棄當前操作"
case "-5":
message = "客戶端內部處理錯誤"
default: //0
//message = "成功"
break
}
//顯示消息
showAlert(title: title, message: message)
}
}
}
//處理來至QQ的請求
func onReq(_ req:QQBaseReq!){
print("--- onReq ---")
}
//處理QQ在線狀態的回調
func isOnlineResponse(_ response: [AnyHashable : Any]!) {
print("--- isOnlineResponse ---")
}
//顯示消息
func showAlert(title:String, message:String){
let alertController = UIAlertController(title: title,
message: message, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "確定", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.window?.rootViewController!.present(alertController, animated: true,
completion: nil)
}
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
}
}