iOS完整项目制作SDK并调用详细步骤

iOS完整项目制作SDK并调用详细步骤

前言

  本篇博客记录将iOS完整项目打包为SDK的详细步骤以及制作过程中所遇到的问题,希望对有相同需求的童鞋有所帮助。(还在奋斗中。。。有进展则更新)

制作sdk的一些疑问?

  1. 什么是SDK?
  2. 制作静态库还是动态库呢?
  3. 如何用同一个项目实现条件编译应用程序和库文件?
  4. 项目里有App extension怎么办?
  5. 怎么将结果返回给GUI呢?
  6. 日志如何保存和查看?

么保存呢?

什么是SDK

  SDK(software development kits):软件开发工具包,一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
  通俗点大致就是一库、一Demo、一使用手册。
    库文件:提供对外开放接口供第三方调用,启动相应功能。
    Demo : 一个演示如何使用SDK的示例。
    使用手册:说明如何使用SDK以及使用过程中常见问题。

静态库和动态库的选择?

	  动态库:运行时加载,发布的程序需要一同携带着。
	  静态库:将汇编期生成的目标.o文件和引用的库一同链接为可执行文件,有framework和.a的形式,通过ar命令将其解压可以看到其实就是.o文件的集合。
		    .a:单纯的二进制文件,需要配合.h文件一同使用。
		    .framework:二进制文件+资源文件,可以直接使用。
		    .framework = .a + .h + ResourceFile(资源文件)

如何用同一个项目条件编译出应用程序和库文件?

  问:为什么不新建framework项目?
  答:比如新建一个cocoa framework的项目,将代码添加进来,如果项目代码更新了或者引用文件目录改变了怎么办?再删除添加么?而新建Target,添加相应文件,在同一个项目中方便管理,维护同一套代码更方便,具体步骤如下:

iOS完整项目制作SDK并调用详细步骤_第1张图片
iOS完整项目制作SDK并调用详细步骤_第2张图片
embed in application = none
iOS完整项目制作SDK并调用详细步骤_第3张图片
iOS完整项目制作SDK并调用详细步骤_第4张图片
iOS完整项目制作SDK并调用详细步骤_第5张图片
iOS完整项目制作SDK并调用详细步骤_第6张图片
  将所需编译的源文件拖过来,需要暴露的头文件放在Header-public中,不需要暴露的则放在Header-project中。

iOS完整项目制作SDK并调用详细步骤_第7张图片
  如果项目涉及swift/oc/c混编和第三方库(如果不涉及不用往下看了),原来的桥接头文件此时将不再起效,需要将oc头文件放在Umbrella Header中。
查看生成程序中的framework/Modules/module.modulemap,可以看到其中有requires objc表示支持Object-C。

  设置Header Path:头文件搜索路径。
  设置Library Path :库文件搜索路径。

  项目中调用了第三方静态库(C代码),在Umbrella Header中引入OC头文件报错:Include of non-modular header inside framework module。
  1、网上解决方法:buildsetting->allow non-modular includes in framework modules(我试了并没有用,是我打开方式不对么,哭死…)
  2、将调用的第三方库相关头文件不要放在Umbrella Header中import的头文件中,放在m文件中即可。编译再一次通过了,撒花。

项目里有App Extension怎么处理?

为了方便重签名,省去繁琐的签名步骤,所以自己写了一个重签名的应用,如下所示:
iOS完整项目制作SDK并调用详细步骤_第8张图片

如有需要可以在此下载:https://download.csdn.net/download/fei86155/12505723

  我用到的是Network Extension,那么重签名的步骤如下:

  • 编译
  • 在demo项目中添加xx.appex
  • 确认capabilities相应权限是否打开
  • 对appex进行重签名,要和宿主APP保持一致
    – 首先修改Info.plist中的bundle id
    – 创建一个正确的appex mobileprovision 文件
    – 将mobileprovision 文件重命名embeded.mobileprovision 替换掉appex中的provision文件
    – 通过provision生成entitlements.plist文件:
    – security cms -D -i embedded.mobileprovision > temp.plist
    – /usr/libexec/PlistBuddy -x -c ‘Print :Entitlements’ temp.plist > entitlements.plist
    – 通过 codesign -fs “证书” --entitlement entitlements.plist xx.appex命令进行重签名
  • 编译运行,查看appex是否成功被调用。

怎么将结果返回给GUI呢

  通过回调可以实现当库文件执行到某个状态时来告知GUI改变状态,比如我登录QQ成功,需要显示登陆成功的界面。
  通过delegate代理可以实现该需求,步骤如下:

 GUI-Project:
 
 SDK-Project:
 

日志怎么保存和查看?

	方式一:将日志内容写到文件中,保存文件到Document目录下。然后通过itunes工具将日志拿出。
	如果itunes连上手机无法查看到自己的应用,在Info.plist文件中添加:Application supports iTunes file sharing = YES
	方式二:提供一个接口将日志内容读出来
	方式三:通过系统应用->控制台来过滤进程,查看相应日志。

你可能感兴趣的:(iOS)