引言
誠然,Xamarin是個優秀的跨平台解決方案,但畢竟還是不能將Native中所有的方法都直接實現。諸如各種第三方庫,也都只有java/oc原生版本的SDK,無法直接拿過來直接使用。但,不能直接拿過來用,就沒辦法擴展APP功能,不能使用已經造好的輪子嗎?答案是否定的!Xamarin中可以通過引用java中的Jar包,oc中的A檔,實現這一切!
什麼是a檔?
a檔就是iOS中的class library,我是這麼理解為啥叫a檔的,因為a檔生成的文件擴展名是.a。舉個栗子:
如何建立a檔
1、在XCode中建立一個新的project,選擇iOS底下的framework&library中的Cocoa Touch Static librar,輸入Product Name,選擇好存儲地址,項目就建立好了。
2、項目全貌
3、點選左邊側邊欄中,默認生成的TestClassLib.h文件,在該文件中增加個公開的靜態方法。給之後引用該a檔的項目調用方法。
4、接著打開TestClassLib.m,給add方法寫上具體實現方法
5、將項目設定中的CodeSigning設定為Developer。
6、Build For Running
7、運行成功後,展開Products文件夾,便能看到我們所需要的a檔了。show in finder。在Debug-iphonesimulator中的a檔,是給iPhone設備模擬器用了的;Debug-iphoneos中的a檔,則是給真機使用。如果打開文件夾後發現,只有一種類型的(如下1圖),我們需要重新Build For Running,在重新編譯前,在xcode中調整編譯目標即可(如下2圖),在打開finder,即可看到兩種類型(如下3圖)
在Xamarin工程中引用a檔
1、在一個現有的Xamarin工程中,添加新的工程,選擇類型為Bindings Library的工程,寫好工程名,創建成功。
2、在建好的Bindings Library中,添加現有項目,選擇我們剛剛創建的a檔,並確認該a檔文件的BuildAction為ObjcBindingNativeLibrary。
3、下載Objective Sharpie——轉換c#代碼的工具 鏈接:https://files.xamarin.com/~abock/ObjectiveSharpie/ObjectiveSharpie-3.0.8.pkg
1.打開terminal
1.確認Xcode的SDK版本,輸入 sharpie xcode -sdks
2.切換到你希望生成文件所在的位置
3.輸入轉換指令 sharpie bind -output
4、sharpie bind -output TestClassLib -namespace TestClassLib -sdk iphoneos9.3 ./TestClassLib/*.h
4、將利用Objective Sharpie生成的ApiDefinitions.cs替換Bindings Library中的ApiDefinition.cs
注意,工具生成的是ApiDefinitions,而原項目中的是ApiDefinition,多了個s哦,一定不能改著個文件的文件名,否則會報錯。
另,ApiDefinition中的錯誤不用去理會,build也不會報錯。
5、好,至此我們的操作差不多結束了,接下來,編寫代碼,調用a檔中的方法。
結束語
OK,這篇文章算是說完了,雖然沒有拿市面上任何一個SDK作例子,但我想,授人以魚不如授人以漁,知道怎麼制作a檔,引用a檔,大部分SDK,應該都可以搞定了。
參考資料:https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/walkthrough/
https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/