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