Xamarin.iOS能不能使用原生中的第三方库

教您如何去使用OC的第三方库到您的项目中


最近发现已经越来越多的朋友开始了解Xamarin,昨天看到一位朋友提到这样一个问题:是不是使用Xamarin开发必须要有源生的两个平台的开发经验?我想我得首先恭喜你,因为你在最开始接触Xamarin这个东西的时候就比我考虑的要多,我在最开始学习使用Xamarin开发项目的时候,根本没有考虑源生就是拿到需求开始百度找方法扣源生代码,一直到项目完成后才去学习源生的知识,我可以很负责任的告诉你,一点不会源生的知识你的Xamarin开发会异常困难和曲折。但是对于源生需要了解多少呢?这个问题我想最低得了解OC和Java基础和基本的平台机制,如果您有相应的源生开发经验,我想Xamarin对于您来说就是把开发语言从Java或者OC换成了C#,核心的内容它是不变的,用Xamarin开发不会对您有什么大的难度。

说完上边这一段我自己对Xamarin的理解之后,我们进入正题开始说说怎么在Xamarini项目中链接源生的第三方库(这里我们只谈iOS,Android的第三方库使用我们以后再介绍)

我们链接第三方库的步骤:
1.建立一个静态库,关于静态库和动态库的介绍你可以看这篇文章。
2.新建一个Xamarin.iOS binding Project,这个项目包含我们刚才新建的静态库和以C#代码展示的解释OC的API如何使用的元数据。
3.规范API的定义,这里我们通常会对用Objective Sharpie类库转化工具自动转化生成的API定义进行处理,把一些错误给完善。
4.引用这个绑定的项目。

1.建立静态库

首先我们拿github上的InfColorPicker作为例子,我们先在github上下载这个类库


Xamarin.iOS能不能使用原生中的第三方库_第1张图片
InfColorPicker.png

然后我们用Xcode打开PickerSamplePhone这个项目,我们可以发现项目的结构如下,一般跟类库名字同名的文件夹就是我们需要用来建立静态的文件

Xamarin.iOS能不能使用原生中的第三方库_第2张图片
项目结构.png

然后我们打开Xcode,File > New > Project > Framework & Library > Cocoa Touch Static Library,然后点击下一步,填写项目名称为 InfColorPicker结束创建。

Xamarin.iOS能不能使用原生中的第三方库_第3张图片
Xamarin.iOS能不能使用原生中的第三方库_第4张图片
Xamarin.iOS能不能使用原生中的第三方库_第5张图片

然后我们需要将下载的类库包中同名文件夹下的所有文件复制到我们的静态库项目中

Xamarin.iOS能不能使用原生中的第三方库_第6张图片
复制文件.png
Xamarin.iOS能不能使用原生中的第三方库_第7张图片
选择文件.png

然后我们需要修改自动创建的InfColorPicker.m文件,注释最后两行代码,因为库的写入方式不需要我们使用该文件

Xamarin.iOS能不能使用原生中的第三方库_第8张图片
修改.m文件.png

然后我们需要给项目添加依赖库,InfColorPicker target > Build Phases >Link Binary With Libraries >+

Xamarin.iOS能不能使用原生中的第三方库_第9张图片
链接依赖库.png
Xamarin.iOS能不能使用原生中的第三方库_第10张图片
Xamarin.iOS能不能使用原生中的第三方库_第11张图片

然后选择编译执行,到这一步我们的静态库文件算完成了一半,但是需要将生成的.a文件进一步加工,使它适配模拟器和真机的所有架构。

我们接着需要通过终端进入我们项目目录中,新建一个MakeFile文件,vim MakeFile

然后在vim编辑器中复制以下代码,将这个文件中YOUR-PROJECT-NAME 改为您的项目名称(如InfColorPicker)

XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
PROJECT_ROOT=./YOUR-PROJECT-NAME
PROJECT=$(PROJECT_ROOT)/YOUR-PROJECT-NAME.xcodeproj
TARGET=YOUR-PROJECT-NAME

all: lib$(TARGET).a

lib$(TARGET)-i386.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

lib$(TARGET)-armv7.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET)-arm64.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

lib$(TARGET).a: lib$(TARGET)-i386.a lib$(TARGET)-armv7.a lib$(TARGET)-arm64.a
    xcrun -sdk iphoneos lipo -create -output $@ $^

clean:
    -rm -f *.a *.dll

注意事项:
如果修改完成后推出vim编辑器输入make指令后出错,我们需要将里面所有的头部四个空格的地方全部删去,换成一个Tab键

编译成功后会看到一下的界面

Xamarin.iOS能不能使用原生中的第三方库_第12张图片
makefile完成.png

然后在项目文件夹中你会发现以下几个文件

Xamarin.iOS能不能使用原生中的第三方库_第13张图片
Paste_Image.png

同样你可以在终端中输入这段命令xcrun -sdk iphoneos lipo -info libInfColorPicker.a,去检查你的.a文件支持的架构。


2.新建Xamarin.iOS Binding Project

打开VS > File > New > Project> iOS > Bindings Library,输入项目名称完成创建

Xamarin.iOS能不能使用原生中的第三方库_第14张图片
Xamarin.iOS能不能使用原生中的第三方库_第15张图片

创建完成后会自动生成两个文件
ApiDefinition.cs:这个文件包含如何将OC API转化为 C#
Structs.cs:这个文件主要是一些代理和接口所需枚举和结构体

Xamarin.iOS能不能使用原生中的第三方库_第16张图片

然后将刚才生成的.a文件复制到您的项目文件夹中并添加到项目中去

Xamarin.iOS能不能使用原生中的第三方库_第17张图片

接着我们需要回到Mac 终端中,根据Objective Sharpie类库转化工具去生成上边两个文件相应的内容,这里我们就不给出详细步骤了,可以参考我之前写的文章。

//复制以下代码到终端
sharpie bind --output=InfColorPicker --namespace=InfColorPicker --sdk=[iphone-os] [full-path-to-project]/InfColorPicker/InfColorPicker/*.h

完成后会在您的项目文件夹下多出两个文件,分别是我们在VS中创建项目自动生成的两个文件的内容

Xamarin.iOS能不能使用原生中的第三方库_第18张图片
Paste_Image.png

分别复制两个文件里面的所有内容到指定的文件中


3.规范API的定义

在上面我们完成了Xamarin.iOS Binding Project的工作后,我们点击编译生成,如果我们发现有错误,我们查看错误提示,根据错误提示我们会发现[Verify]这样的一个东西,我们直接根据提示删除所有错误的[Verify],再次编译生成即可。

到这里我们的第三方库的转化就基本完成了,接着我们只需去把建好的Xamarin.iOS Binding Project生成的dll文件复制出来,添加到Xamarin.iOS项目文件夹中,添加引用,在需要使用第三方库的文件中导入头文件即可使用。

总而言之:在Xamarin中使用源生的第三方库我们不能直接向源生那样拖到项目目录中,我们需要去建立一个Binding Project,然后根据这个项目间接的去实现引用。同样有的时候我们还需要再对这个Binding Project去进一步的完善,根据要实现的功能,对某些方法可以进一步封装,这种方式在Xamarin.Forms中用的比较多。

到这里Xamarin.iOS中引用源生第三方库的介绍就完成了,希望能对您有所帮助。

——End 有问题可以加我微信,大家一起讨论

Xamarin.iOS能不能使用原生中的第三方库_第19张图片

你可能感兴趣的:(Xamarin.iOS能不能使用原生中的第三方库)