项目涉及微信登录、微信分享、微博分享、Facebook分享、Twitter分享。
使用 ShareSDK 的微信登录方法之前,需配置微信App 的 Secret,然而登录之后 ShareSDK 返回的 token 不是后台想要的,导致调用后台的登录方法报错。(ShareSDK 的微信登录 跟 原生的微信登录方法返回的 token 不同)
所以我只能用原生的微信登录方法,但是在集成了 ShareSDK 的情况下调用微信登录之后,死活不走 WXApiDelegate(未集成 ShareSDK 之前会走 WXApiDelegate)。
由于 Twitter 分享的文档都是英文,Facebook 分享之前也没做过,我懒得一个个去搞所以就换成了友盟分享,然而在集成了友盟分享的情况下,调用原生的微信登录方法之后也是不走 WXApiDelegate。然后我看了下微信SDK源码之后换了一个方法:
After:
//调用原生的微信登录接口
let req = SendAuthReq.init()
req.scope = "snsapi_userinfo"
req.state = "123"
WXApi.sendAuthReq(req, viewController: nil, delegate: self)
Befor:
//调用原生的微信登录接口
let req = SendAuthReq.init()
req.scope = "snsapi_userinfo"
req.state = "123"
WXApi.sendReq(req)
并且在登录界面实现了微信代理方法:
// MARK: 微信代理方法
extension GMLoginView: WXApiDelegate {
func onResp(_ resp: BaseResp!) {
print("-->> 微信代理方法")
}
}
这时终于走了 AppDelegate 的 WXApiDelegate。使用友盟分享SDK实现了微信分享、微博分享、Facebook分享、Twitter分享功能,使用原生的微信登录接口了实现后台登录。
只在集成友盟分享SDK的时候,同时集成微信SDK即可。
微信分享 和 微信登录的回调都在 AppDelegate 的 WXApiDelegate 中处理。
虽然不走 GMLoginView 的 WXApiDelegate ,但是这段代码却不得不写,否则就不走 AppDelegate 的 WXApiDelegate,不知道为什么会这样。
集成友盟分享SDK时的 AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.configThirdSDK(launchOptions: launchOptions)
return true
}
func configThirdSDK(launchOptions: [UIApplicationLaunchOptionsKey: Any]?) {
//配置友盟分享
UMSocialManager.default().openLog(true)
UMSocialManager.default().umSocialAppkey = GMConst.kYoumengAppID
UMSocialManager.default().setPlaform(.wechatSession, appKey: GMConst.kWechatAppID, appSecret: nil, redirectURL: nil)
UMSocialManager.default().setPlaform(.sina, appKey: GMConst.kSinaAppID, appSecret: GMConst.kSinaSecret, redirectURL: nil)
UMSocialManager.default().setPlaform(.twitter, appKey: GMConst.kTwitterID, appSecret: GMConst.kTwitterSecret, redirectURL: nil)
UMSocialManager.default().setPlaform(.facebook, appKey: GMConst.kFacebookID, appSecret: nil, redirectURL: nil)
//配置原生微信API
WXApi.registerApp(GMConst.kWechatAppID, enableMTA: true)
}
// MARK: 设置系统回调
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let absoluteString = url.absoluteString
if absoluteString.range(of: GMConst.kWechatAppID) != nil {
return WXApi.handleOpen(url, delegate: self as WXApiDelegate)
} else {
return UMSocialManager.default().handleOpen(url, sourceApplication: sourceApplication, annotation: annotation)
}
}
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
//代码同上一个方法
}
}
// MARK: 微信代理方法
extension AppDelegate: WXApiDelegate {
func onResp(_ resp: BaseResp!) {
if resp is SendMessageToWXResp { //微信分享
if resp.errCode == 0 {//分享成功
GMHudUtils.showHUD(title: "分享成功")
} else if resp.errCode == -2 {
GMHudUtils.showHUD(title: "分享失败")
}
} else if resp is SendAuthResp{ //微信登录
self.loginStatus = LoginStatus.none
if resp.errCode == 0 {//登录成功
//调用后台的登录接口
} else {
GMHudUtils.showHUD(title: "登录失败")
}
}
}
}
GMLoginView.swift
class GMLoginView: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
}
@IBAction func loginBtnAction(_ sender: UIButton) {
HUD.flash(.label("登录中..."), delay: 999) { _ in }
//调用微信原生的登录接口
let req = SendAuthReq.init()
req.scope = "snsapi_userinfo"
req.state = "123"
WXApi.sendAuthReq(req, viewController: nil, delegate: self)
}
}
// MARK: 微信代理方法
extension GMLoginView: WXApiDelegate {
func onResp(_ resp: BaseResp!) {
print("-->> 微信代理方法")
}
}