Swift版微信分享詳細步驟

  • 作者:Mandarava(鰻駝螺)
  • 參考:

準備工作

首先到微信開放平臺注冊開發者帳號,并在后臺的“管理中心”創建應用、遞交審核,獲取應用的AppID后即可用于開發;同時,在微信的“資源中心”下載微信的最新SDK。這些基本的東西某就不曰(yue)了,如果有問題請閱讀微信開放平臺的幫助。

工具和版本

某這里使用Xcode7.1和微信SDK1.6.2。

微信分享詳細步驟

  1. 使用Xcode新建一個iOS項目,命名為:WeixinShareTest。
  2. 將SDK壓縮包中的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三個文件添加到項目中。


    image.png
  3. 建立橋接文件:WeixinShareTest-Bridging-Header.h,文件內容:
@import UIKit; //使用1.6版必須有(PS:1.5版可以不要)
#import "WXApiObject.h"
#import "WXApi.h"

建立橋接(PS:搜索“bridging”可以快速定位)


image.png
  1. 導入有關的類庫:SystemConfiguration.framework,libz.tbd,libsqlite3.0.tbd,libc++.tbd(注:Xcode7開始把.dylib改成了.tbd了,如果是用Xcode6.4這里的.tbd還原成.dylib;另外,實際上,這里還缺少一個依賴包,后面再曰)。


    image.png
  2. 設置Url schame:添加一個URL Type,identifier中填寫:weixin,URL Schemes中填寫你的AppID。


    image.png
  3. 另外,按照SDK中說明文件的說法,還需要將下面的內容加入到項目的Info.plist中(用文本編輯器打開,放在倒數第2行上面即可)。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
  1. 聲明AppDelegate實現WXApiDelegate協議
class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate 
  1. 在 AppDelegate的application:didFinishLaunchingWithOptions:函數中向微信注冊id
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        WXApi.registerApp("Your_AppID") //改成你實際的AppID
        return true
    }
  1. 重寫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)
}
  1. 實現WXApiDelegate中的方法onReq和onResp方法。這二個方法怎么使用某先不表,后面再曰,這里只空實現它們;這二個方法不影響分享操作,只是你可能需要知道分享結果,如分享是否成功,發生了什么錯誤等,需要用到onResp;onReq是微信終端向第三方應用發起請求,要求第三方應用響應的操作,咱這里用不到。
func onReq(req: BaseReq!) {
    //onReq是微信終端向第三方程序發起請求,要求第三方程序響應。第三方程序響應完后必須調用sendRsp返回。在調用sendRsp返回時,會切回到微信終端程序界面。
}
func onResp(resp: BaseResp!) {
    //如果第三方程序向微信發送了sendReq的請求,那么onResp會被回調。sendReq請求調用后,會切到微信終端程序界面。
}
  1. 到這里,我們可以嘗試編譯一下,看看到目前為止的工作是否都正常。而事實是,編譯結果出現2個錯誤,主要是前一個錯誤:


    image.png
"_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in libWeChatSDK.a(MTAHelper.o)

這個錯誤是因為缺少了CoreTelephony.framework,不過微信SDK并沒有說這是個依賴庫(PS:微信SDK1.5不需要,應該是1.6新增的),但不管它,加進來再說。再次編譯,成功!


image.png
  1. 下面開始實現分享操作,微信有很多分享方式,可以分享文本、鏈接、圖片、音頻、視頻、文件等,可以將資源分享到朋友圈、聊天界面、收藏等。具體實現方法都可以在參考微信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)
}
  1. 調用分享方法的代碼:
sendText("這是來自Mandarava(鰻駝螺)的分享", inScene: WXSceneTimeline) //分享文本到朋友圈
sendImage(UIImage(named: "MyImage.png")!, inScene: WXSceneTimeline) //分享圖片到朋友圈,假設項目中已經添加了一張名曰MyImage.png的大圖片作為分享圖片

下面是文本分享和圖片分享到朋友圈的結果;另外這里顯示的是“未審核應用”,因為某這個只是測試應用,用了一個未經審核過的AppID。


image.png
  1. 事情還沒完,如果你想知道用戶是否完成了分享,需要實現前面說過的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來測試。

  1. 題外話:可以用 WXApi.isWXAppInstalled() 來檢查系統中是否安裝了微信,在未安裝時隱藏分享按鈕,避免Appstore審核被拒;也不要用通過分享來提供應用內獎勵,這屬于“使用App Store以外的軟件提供額外功能”,也會被拒。我納悶的是,審核的系統中會裝有微信嗎?通過隱藏微信分享的方式或許能混過去。
  2. 打完收工!若有錯誤歡迎批評指證;轉載本文請注明來源。
    by Mandarava(鰻駝螺)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容