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