- 作者:Mandarava(鰻駝螺)
- 參考:
- 微信官方文檔《iOS接入指南》
- 微信SDK Demo項(xiàng)目
- 微信iOS SDK文檔
準(zhǔn)備工作
首先到微信開(kāi)放平臺(tái)注冊(cè)開(kāi)發(fā)者帳號(hào),并在后臺(tái)的“管理中心”創(chuàng)建應(yīng)用、遞交審核,獲取應(yīng)用的AppID后即可用于開(kāi)發(fā);同時(shí),在微信的“資源中心”下載微信的最新SDK。這些基本的東西某就不曰(yue)了,如果有問(wèn)題請(qǐng)閱讀微信開(kāi)放平臺(tái)的幫助。
工具和版本
某這里使用Xcode7.1和微信SDK1.6.2。
微信分享詳細(xì)步驟
- 使用Xcode新建一個(gè)iOS項(xiàng)目,命名為:WeixinShareTest。
-
將SDK壓縮包中的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三個(gè)文件添加到項(xiàng)目中。
image.png - 建立橋接文件:WeixinShareTest-Bridging-Header.h,文件內(nèi)容:
@import UIKit; //使用1.6版必須有(PS:1.5版可以不要)
#import "WXApiObject.h"
#import "WXApi.h"
建立橋接(PS:搜索“bridging”可以快速定位)
-
導(dǎo)入有關(guān)的類庫(kù):SystemConfiguration.framework,libz.tbd,libsqlite3.0.tbd,libc++.tbd(注:Xcode7開(kāi)始把.dylib改成了.tbd了,如果是用Xcode6.4這里的.tbd還原成.dylib;另外,實(shí)際上,這里還缺少一個(gè)依賴包,后面再曰)。
image.png -
設(shè)置Url schame:添加一個(gè)URL Type,identifier中填寫(xiě):weixin,URL Schemes中填寫(xiě)你的AppID。
image.png - 另外,按照SDK中說(shuō)明文件的說(shuō)法,還需要將下面的內(nèi)容加入到項(xiàng)目的Info.plist中(用文本編輯器打開(kāi),放在倒數(shù)第2行上面即可)。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
- 聲明AppDelegate實(shí)現(xiàn)WXApiDelegate協(xié)議
class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate
- 在 AppDelegate的application:didFinishLaunchingWithOptions:函數(shù)中向微信注冊(cè)id
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
WXApi.registerApp("Your_AppID") //改成你實(shí)際的AppID
return true
}
- 重寫(xiě)AppDelegate的application:handleOpenURL:和application:openURL:sourceApplication:annotation:方法
func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {
return WXApi.handleOpenURL(url, delegate: self)
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return WXApi.handleOpenURL(url, delegate: self)
}
- 實(shí)現(xiàn)WXApiDelegate中的方法onReq和onResp方法。這二個(gè)方法怎么使用某先不表,后面再曰,這里只空實(shí)現(xiàn)它們;這二個(gè)方法不影響分享操作,只是你可能需要知道分享結(jié)果,如分享是否成功,發(fā)生了什么錯(cuò)誤等,需要用到onResp;onReq是微信終端向第三方應(yīng)用發(fā)起請(qǐng)求,要求第三方應(yīng)用響應(yīng)的操作,咱這里用不到。
func onReq(req: BaseReq!) {
//onReq是微信終端向第三方程序發(fā)起請(qǐng)求,要求第三方程序響應(yīng)。第三方程序響應(yīng)完后必須調(diào)用sendRsp返回。在調(diào)用sendRsp返回時(shí),會(huì)切回到微信終端程序界面。
}
func onResp(resp: BaseResp!) {
//如果第三方程序向微信發(fā)送了sendReq的請(qǐng)求,那么onResp會(huì)被回調(diào)。sendReq請(qǐng)求調(diào)用后,會(huì)切到微信終端程序界面。
}
-
到這里,我們可以嘗試編譯一下,看看到目前為止的工作是否都正常。而事實(shí)是,編譯結(jié)果出現(xiàn)2個(gè)錯(cuò)誤,主要是前一個(gè)錯(cuò)誤:
image.png
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in libWeChatSDK.a(MTAHelper.o)
這個(gè)錯(cuò)誤是因?yàn)槿鄙倭薈oreTelephony.framework,不過(guò)微信SDK并沒(méi)有說(shuō)這是個(gè)依賴庫(kù)(PS:微信SDK1.5不需要,應(yīng)該是1.6新增的),但不管它,加進(jìn)來(lái)再說(shuō)。再次編譯,成功!
- 下面開(kāi)始實(shí)現(xiàn)分享操作,微信有很多分享方式,可以分享文本、鏈接、圖片、音頻、視頻、文件等,可以將資源分享到朋友圈、聊天界面、收藏等。具體實(shí)現(xiàn)方法都可以在參考微信SDK Demo中的WXApiRequestHandler.m中的方法(當(dāng)然它是OC代碼),這里某只實(shí)現(xiàn)二個(gè)常用的,一個(gè)是文本分享,一個(gè)圖片分享,圖片分享自動(dòng)生成縮略圖。具體實(shí)現(xiàn)如下,其中inScene可選的值有三個(gè):WXSceneTimeline(朋友圈)、WXSceneSession(聊天界面) 、WXSceneFavorite(收藏)。
//分享文本
func sendText(text:String, inScene: WXScene)->Bool{
let req=SendMessageToWXReq()
req.text=text
req.bText=true
req.scene=Int32(inScene.rawValue)
return WXApi.sendReq(req)
}
///分享圖片
func sendImage(image:UIImage, inScene:WXScene)->Bool{
let ext=WXImageObject()
ext.imageData=UIImagePNGRepresentation(image)
let message=WXMediaMessage()
message.title=nil
message.description=nil
message.mediaObject=ext
message.mediaTagName="MyPic"
//生成縮略圖
UIGraphicsBeginImageContext(CGSize(width: 100, height: 100))
image.drawInRect(CGRectMake(0, 0, 100, 100))
let thumbImage=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
message.thumbData=UIImagePNGRepresentation(thumbImage)
let req=SendMessageToWXReq()
req.text=nil
req.message=message
req.bText=false
req.scene=Int32(inScene.rawValue)
return WXApi.sendReq(req)
}
- 調(diào)用分享方法的代碼:
sendText("這是來(lái)自Mandarava(鰻駝螺)的分享", inScene: WXSceneTimeline) //分享文本到朋友圈
sendImage(UIImage(named: "MyImage.png")!, inScene: WXSceneTimeline) //分享圖片到朋友圈,假設(shè)項(xiàng)目中已經(jīng)添加了一張名曰MyImage.png的大圖片作為分享圖片
下面是文本分享和圖片分享到朋友圈的結(jié)果;另外這里顯示的是“未審核應(yīng)用”,因?yàn)槟尺@個(gè)只是測(cè)試應(yīng)用,用了一個(gè)未經(jīng)審核過(guò)的AppID。
- 事情還沒(méi)完,如果你想知道用戶是否完成了分享,需要實(shí)現(xiàn)前面說(shuō)過(guò)的onResp方法,回到AppDelegate.swift中去實(shí)現(xiàn)它;這個(gè)方法實(shí)現(xiàn)起來(lái)其實(shí)很簡(jiǎn)單,代碼如下;其中,可以用resp.isKindOfClass(SendMessageToWXResp)來(lái)確保的是分享操作的回調(diào)(當(dāng)然,因?yàn)槲覀冞@里只有分享操作,這個(gè)檢測(cè)不要也罷)。
func onResp(resp: BaseResp!) {
if resp.isKindOfClass(SendMessageToWXResp){//確保是對(duì)我們分享操作的回調(diào)
if resp.errCode == WXSuccess.rawValue{//分享成功
NSLog("分享成功")
}else{//分享失敗
NSLog("分享失敗,錯(cuò)誤碼:%d, 錯(cuò)誤描述:%@", resp.errCode, resp.errStr)
}
}
}
題外話:寫(xiě)這篇文章時(shí),某用的AppID一直是個(gè)亂取的值(并不是來(lái)自微信開(kāi)放平臺(tái)后臺(tái)創(chuàng)建應(yīng)用的AppID),整個(gè)開(kāi)發(fā)過(guò)程沒(méi)什么問(wèn)題,直到測(cè)試這個(gè)onResp時(shí)發(fā)現(xiàn)一直沒(méi)反應(yīng),但代碼肯定沒(méi)問(wèn)題(因?yàn)橐郧霸陧?xiàng)目中也是這樣做的),后來(lái)發(fā)現(xiàn)原來(lái)是這個(gè)AppID的問(wèn)題,用回了在開(kāi)放平臺(tái)創(chuàng)建的AppID后就能正常收到onResp了。所以,實(shí)踐之前,盡量先去開(kāi)放平臺(tái)創(chuàng)建應(yīng)用獲得真實(shí)的AppID來(lái)測(cè)試。
- 題外話:可以用
WXApi.isWXAppInstalled()
來(lái)檢查系統(tǒng)中是否安裝了微信,在未安裝時(shí)隱藏分享按鈕,避免Appstore審核被拒;也不要用通過(guò)分享來(lái)提供應(yīng)用內(nèi)獎(jiǎng)勵(lì),這屬于“使用App Store以外的軟件提供額外功能”,也會(huì)被拒。我納悶的是,審核的系統(tǒng)中會(huì)裝有微信嗎?通過(guò)隱藏微信分享的方式或許能混過(guò)去。 - 打完收工!若有錯(cuò)誤歡迎批評(píng)指證;轉(zhuǎn)載本文請(qǐng)注明來(lái)源。
by Mandarava(鰻駝螺)