iOS开发笔记(1)---- 静态库实践

来源:互联网 发布:淘宝退货率高会怎样 编辑:程序博客网 时间:2024/06/03 16:43

前言

作为iOS平台支持的唯一自定义代码库形式,静态库常用于第三方SDK或功能模块的开发。
目前介绍静态库开发的教程已经不少,在此我们只对静态库的开发过程做简要介绍,并且讲一讲内部实现及注意事项。

开发过程

创建静态库工程

 目前静态库类型共有两种,.a和.framework。 .framework与.a使用起来几乎一样,区别在于.framework已包含头文件而.a文件并不包含头文件。

代码编写

代码库内部实现。

工程设置

设置导出头文件和最低支持系统版本。

编译

编译代码库,真机版本和模拟器版本无法同时编译,若要静态库同时支持真机和模拟器则需要在编译两个版本后进行合并。

合并命令示例:
lipo -create /Users/username/Desktop/libPlugin.d.a /Users/username/Desktop/libPlugin.s.a -output /Users/username/Desktop/libPlugin.a

内部实践

静态库需要注意以下几点,入口方法,出口回调,界面展示,第三方文件引用,资源引用以及应用间通信。

入口方法

入口方法提供静态库入口,需要指定调用静态库所需参数。
一般情况下入口方法为静态方法或单例对象方法。

出口回调

如果在入口方法同步返回结果则无须回调,否则需要通过delegate或block异步返回调用结果,delegate或block对象需要在调用入口方法时或调用之前赋值。

界面展示

静态库中的界面展示有两张选择,自定义UIWindow或在App当前UIViewController基础上展示。

  • 自定义UIWindow

    需要在展示前保存当前keyWindow并在静态库调用结束时恢复。

  • 在App当前UIViewController基础上展示
    需要在调用入口方法时或调用之前传入当前UIViewController对象。

第三方文件引用

如果静态库中需要用到开源库或第三方SDK,则应考虑到使用静态库的App可能会引用同样的文件,如果重复引用会造成App编译不通过。

  • 引用源文件
    如果引用文件为代码源文件且代码体积较小可以直接更改文件名称(及常量名称)并编译到静态库中。

  • 引用静态库
    如果引用文件为其它静态库则只需要在静态库中引入头文件(如果引入库文件会将其编译到静态库中)。
    另外,通过反射技术可以实现与依赖库完全解耦,从而在运行时动态加载引用对象而不必在代码中引用头文件。其使用方法在iOS开发笔记(4)—- 反射中有所讲解。

资源引用

静态库中无法编译资源文件,所以只能通过相对路径访问资源文件。
最佳的一种方式是为静态库创建对应的资源包.bundle,并通过bundle中文件路径访问资源即可,如plugin.bundle/picture.png。使用时需要将.bundle和静态库同时引用。

应用间通信

许多厂商提供的SDK需要配合App使用,如微信、支付宝等等,此种情况下就需要用到应用间通信。
应用间通信通过URLScheme实现,需要在调用入口方法时或调用之前传入本应用URLScheme,并在静态库调用匹配应用接口时作为参数传递过去。
在接收匹配应用通知时需要App接收并将其传入静态库作处理,因此静态库需提供对应AppDelgate参数与返回值的方法。如

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation ;

静态库需要根据URL过滤来源,并在处理完成后通过出口回调通知App结果。

1 0
原创粉丝点击