Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起
編者語:Xamarin 并入微軟快一年了,在國內推廣還是慢,主要有兩個方面,Xamarin在國內的本地化不足真正在國內的解決方案基本上沒有,第二就是和本土的一些主要SDK接入案例基本上也沒有。上述原因令不少企業放棄使用這個很好的跨平臺解決方案。在新一年本人覺得是時候把本人的東西貢獻給各界友好了,希望把這幾年開發的心得一次過給大家。當然在國內Xamarin社區也開始起步,如衣哥,guitarpark,周岳等Xamarin專家也會分享他們的經驗。小弟只是做那么的一點點事擺了。
? ? ? ?大家希望有一些本地化的SDK和Xamarin的整合,這無可避免地需要和一些Static Library?和 Dynamic?Framework進行整合。這個時候就需要Binding了。Xamarin 給大家提供一個命令行工具Sharpie,對傳統的iOS?Static Library 和 iOS Framework 進行轉換適配C#的項目。
? ? ? ?先看看Sharpie, Sharpie是一個命令。其實是通過Clang對調用Static Library /Dynamic Framework 時所需要的頭文件進行轉換,把C++/Objective-C轉換成C#。 在Xamarin的網站你可以下載(?https://download.xamarin.com/objective-sharpie/ObjectiveSharpie.pkg?)。這里補充一點,在使用Sharpie你還是得有對Static Library / Framework 的基本知識,否則你遇到問題時,你就無法入手了。(多次說跨平臺不是不學每個平臺)。
? ? ? ?這里補充一下Static Library和Framework的知識。
? ? ? ?Static Library(靜態庫) - 從源代碼編譯的目標文件的集合,其實就是一個源代碼的實現所對應的二進制實現。配合上提供的頭文件(.h),可以獲取到靜態庫中(.a)暴露的屬性和方法。
? ? ? ?Dynamic Framework(動態庫)- 相當于一個包,隨時可以調用,像iOS的UIKit之類的就是動態庫。它對比起靜態庫不需要.h文件就可以調用,而且只需要加載一次,對程序的執行效率相對于靜態庫有所提高。
? ? ? ?很多第三方的組件都喜歡為iOS提供靜態庫和動態庫,像微信就提供了靜態庫給iOS調用。
? ? ? ?
? ? ? ?微信就提供了libWeChatSDK.a的靜態庫,和三個頭文件,分別對應了微信提供的驗證,API, 基礎類三個頭文件。而Sharpie需要做的是把這三個基于Objective-C的頭文件轉換為C#.
? ? ? ?
? ? ? ?下面我們嘗試去做轉換看看有哪些值得注意的地方。 ? ? ?
? ? ? ?1. 做轉換讓 Sharpie幫你把.h頭文件轉換成ApiDefinition.cs和Structs.cs
sharpie?bind?--output=WeChat.iOS?--namespace=WeChat.iOS?--sdk=iphoneos10.2?/Users/lujianhui/Desktop/OpenSDK1.7.6/WechatAuthSDK.h?/Users/lujianhui/Desktop/OpenSDK1.7.6/WXApi.h?/Users/lujianhui/Desktop/OpenSDK1.7.6/WXApiObject.h??
? ? ? ?
? ? ? ?轉換成功后,會在你指定的文件夾生成ApiDefinitions.cs和StructsAndEnums.cs。
? ? ? ?2. 打開你的Xamarin Studio / Visual Studio for Mac/ Visual Studio (我這里用Visual Studio for Mac)創建iOS Bindings Library 項目
? ? ? ?
? ? ? ?把剛才生成的文件分別放進對應的ApiDefinition.cs和Structs.cs里面
? ? ? ?
? ? ? ?這里馬上遇到我們的一個坑了,首先如果你嘗試去編譯,你會發現你是編譯不過的。別慌,哥在!!
? ? ? ?
? ? ? ?首先這是一個標簽[Verify(MethodToProperty)],這是需要你去確認,這些地方是否轉換正確,因為在OC是一個靜態方法,現在在C#會幫你轉換成屬性,你可以通過原有的頭文件轉換檢查確認無誤后,你可以刪除/注釋掉它。還有一些提示出錯的如BaseType不用理,這個只是編輯器不支持這個標簽,不影響項目編譯和運行。(這里贊贊Sharpie還是轉換類挺高的,當然也得贊微信團隊,做的東西也是蠻標準的。)重新編譯后就能通過了。
? ?3.把libWeChatSDK.a添加進項目中的Native References文件夾內
? ?
? ?這里是另一個坑,由于靜態庫會有對iOS的不同依賴,所以必須根據要求,對剛加進來的靜態庫進行調整。
? ?根據微信文檔
? ?
? ?我們需要點擊libWeChatSDK右鍵跳到屬性,進行修改,首先我們需要把Smart Link 和Force Load鉤上,因為這個靜態庫是必須加載的,其次按照上面的文件,把Frameworks和LinkFlags補上,最后效果如下:
? ?
? ?這樣我們重新編譯就把Binding基本上完成了。
? ?4.我們嘗試把這個項目接入一個Xamarin.iOS做一個簡單的測試看看是否成功
? ???
? ?接下來按照微信的接入步驟,把一些配置先弄好
? ?
? ?還有Bundle ID必須和你在微信注冊時候是一致的
? ?接下來我定義一個簡單的類去做一個接入和發送信息到朋友圈的例子。
? ?先定義一個WeChatAPI類
using?System;??
using?WeChat.iOS;??
??
namespace?WeChat.iOS.Samples??
{??
????public?class?WeChatAPI:?WXApiDelegate??
????{??
????????//微信登錄??
????????public?bool?Log(string?appID)??
????????{??
????????????var?result?=?WXApi.RegisterApp(appID);??
????????????return?result;??
????????}??
????????//微信鏈接打開??
????????public?bool?Open(NSUrl?url)??
????????{??
????????????var?result?=?WXApi.HandleOpenURL(url,?this);??
????????????return?result;??
????????}??
????????//請求打開微信??
????????public?override?void?OnReq(BaseReq?req)??
????????{??
??
????????}??
????????//響應微信??
????????public?override?void?OnResp(BaseResp?resp)??
????????{??
??
????????}??
??
????????//發送信息到朋友圈??
????????public?bool?SendText(string?text)??
????????{??
????????????SendMessageToWXReq?req?=?new?SendMessageToWXReq();??
????????????req.Text?=?text;??
????????????req.BText?=?true;??
????????????req.Scene?=?1;??
????????????WXApi.SendReq(req);??
??
????????????return?true;??
????????}??
??
????}??
}??
? ? 在AppDelegate.cs添加如下代碼
? ??
? ? 并在Storyboard添加一個Button,并做一個響應事件
? ??
? ? 運行看看
? ??
? ?是不是很有成就感呢?其實綁定還有一堆坑的,Sharpie隨著版本的不斷改進,對第三方的SDK兼容性越做越好了。接下來我會說說更多的案例,希望大家看了后有所啟發。祝大家有個愉快的周末.
? ?程序示例https://github.com/lokinfey/WeChatSDK? ?
原文地址:http://blog.csdn.net/kinfey/article/details/51280945
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
贊賞
人贊賞
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 急救包(First
- 下一篇: 介绍Portable PDB