一、功能模块SDK封装步骤:

1、创建IOS Framework工程

先我们需要创建一个iOS的CocoaTouch工程,点击Next,输入我们Framework的名字即可。下方我们暂且将该Framework的名字命名为“CreateLoginSDKFramework”。操作如下所示:

Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名项目工程

2、设置兼容版本:

创建完工程后,我们要选择“Deployment Target”, 此处我们选择的是8.0。也就是说此处我们封装的SDK所支持的iOS系统版本是iOS8.0+。操作所示:

Xcode ——》Project ——》Targets ——》General ——》Deployment Info ——》iOS8.0(最低支持的兼容版本)

3.1、配置动态库:

创建的framework默认是动态库,操作如下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Msch-O Type——》Dynamic Library

Xcode ——》Project ——》Targets ——》Build Settings ——》Build active Architecture only——》NO

3.2、配置静态库:

由于创建的framework默认是动态库,所以我们要讲Mach-O Type设置为静态库“Static Library”。操作如下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Msch-O Type——》Static Library

Xcode ——》Project ——》Targets ——》Build Settings ——》Build active Architecture only——》NO

Xcode ——》Project ——》Targets ——》Build Settings ——》Dead Code Stripping——》NO

Xcode ——》Project ——》Targets ——》Build Settings ——》Link With Standard Libraries——》NO

4、设置支持所有架构(armv7/armv7s/arm64):

Xcode ——》Project ——》Targets ——》Build Settings ——》Build Active Architecture Only——》NO

5、导入源代码文件,设置要公开的所有头文件:

将事先准备好的SDK源代码引入到我们的Framework的工程中进行编译了,在编译之前我们要选择SDK用户可以看到的文件。在Build Phases下的Headers中进行设置的。将用户可以看到的头文件放在Public中,用户看不到的放在Project中。操作如下所示:

Xcode ——》Project ——》Targets ——》Build Phases ——》Headers——》Public/Private/Project

6、编译工程:

设置和配置完毕后,我们就要对我们的Framework程进行编译了。先选择模拟器进行编译,然后选择真机进行编译。编译完后,在Products下会生成相应的Framework, 然后通过Show in Finder进行查看即可。查看时,如果想看“模拟器”和“真机”的framework的话,在Show in finder后,需要前往上层文件夹查看。

7、第一种方式(使用命令行合并模拟器和真机Framework库):

因为在模拟器下编译会生成模拟器下使用的Framework,在真机下编译会生成真机使用的Framework。如果想我们生成的Framework既可以在真机下使用,也可以在模拟器下使用,那么我们需要将两个Framework进行合并。使用终端命令将上述两个文件进行合并。下方就是合并上述两个文件的执行命令, 执行完下方命令后会生成合并后的新文件。操作如下所示:

打开终端 ——》lipo -create 模拟器framework路径  真机framework路径 -output 新的文件

注意事项:

1、编译Framework工程前,需要设置Edit Scheme, 选择run->将Debug模式改成Release模式,选择Close。

2、合并Framework出现error:can't map input file: xxxFramework.framework/ (Invalid argument),原因是如果工程名称和Framework的Target名称不一样的话,要自定义FrameworkName。

lipo -info xxxFramework.framework/xxxFramework

或者

cd xxxFramework.framework

lipo -info xxxFramework

完整命令如下:

lipo -create /Users/yh/Library/Developer/Xcode/DerivedData/YouHone_SDK-dchvyxjtxmxejegowpxcteqnerux/Build/Products/Release-iphonesimulator/YouHone_SDK.framework/YouHone_SDK/Users/yh/Library/Developer/Xcode/DerivedData/YouHone_SDK-dchvyxjtxmxejegowpxcteqnerux/Build/Products/Release-iphoneos/YouHone_SDK.framework/YouHone_SDK -output /Users/yh/Desktop/NewSDK/YouHone_SDK

注意:记得将新合成的YouHone_SDK文件,替换成发布模式的真机里面YouHone_SDK文件

Debug-iphonesos(测试模式真机)

Debug-iphonesimulator(测试模式模拟器)

Release-iphonesos(发布模式真机)

Release-iphonesimulator(发布模式模拟器)

3、如果需要隐藏文件中的分类创建的类,需要在工程添加

Xcode ——》Project ——》Targets ——》Build Phases ——》Other Linker Flags ——》-all_load

8、第二种方式(使用脚本合并模拟器和真机Framework库):

1、编译framework的shell脚本

#buildtargetTARGET_NAME=${PROJECT_NAME} if [[ $1 ]] then TARGET_NAME=$1 fi UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products/" #创建输出目录,并删除之前的framework文件 mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}" rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework" #分别编译模拟器和真机的Framework xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build #拷贝frameworkuniver目录 cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}" #合并framework,输出最终的frameworkbuild目录 lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}" #删除编译之后生成的无关的配置文件 dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/" for file in ls $dir_path do if [[ ${file} =~ ".xcconfig" ]] then rm -f "${dir_path}/${file}" fi done #判断build文件夹是否存在,存在则删除 if [ -d "${SRCROOT}/build" ] then rm -rf "${SRCROOT}/build" fi rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos" #打开合并后的文件夹 open "${UNIVERSAL_OUTPUT_FOLDER}"

2、编译library(静态库.a文件)的脚本

#要build的target名 target_Name=${PROJECT_NAME} if [[ $1 ]] then target_Name=$1 fi UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}_Products" # 创建输出目录,并删除之前的文件 rm -rf "${UNIVERSAL_OUTPUT_FOLDER}" mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}" # 分别编译真机和模拟器版本 xcodebuild -target "${target_Name}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${target_Name}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build #复制头文件到目标文件夹 HEADER_FOLDER="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/include/${target_Name}" if [[ -d "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/usr/local/include" ]] then HEADER_FOLDER="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/usr/local/include" fi cp -R "${HEADER_FOLDER}" "${UNIVERSAL_OUTPUT_FOLDER}" #合成模拟器和真机.a包 lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${target_Name}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${target_Name}.a" -output "${UNIVERSAL_OUTPUT_FOLDER}/lib${target_Name}.a" # 判断build文件夹是否存在,存在则删除 if [ -d "${SRCROOT}/build" ] then rm -rf "${SRCROOT}/build" fi #打开目标文件夹 open "${UNIVERSAL_OUTPUT_FOLDER}"

二、资源文件的Bundle封装步骤:

1、Bundle工程的创建:

首先像创建Framework工程一样创建一个Bundle工程,因为iOS工程下方没有Bundle类型的工程,所以我们需要在OS X -> Framework & Library -> Bundle下面来创建我们的Bundle工程。操作如下所示:

Xcode ——》File\New\Project ——》macOS\Framework and Library\Bundle——》命名项目工程

2、配置Bundle工程:

创建完Bundle工程后,我们要对其进行相应的配置。因为我们是选择OS X创建的Bundle,默认的Bundle是不能在iOS中使用的,所以我们得将Base SDK进行设置,选择相应的iOS样式即可(默认Mac OS样式),如下所示。选择完Base SDK后,我们还要像上面Framework的封装一样,设置一下要兼容的iOS版本(iOS Deployment Target)。操作如下所示:

A、Xcode ——》Project ——》Targets ——》Build Settings ——》Base SDK ——》iOS样式

B、Xcode ——》Project ——》Targets ——》General ——》Deployment Info ——》Deployment Target——》ios8.0(最低支持的兼容版本)

C、Xcode ——》Project ——》Targets ——》Build Settings ——》Installation Directory ——》清空路径

D、Xcode ——》Project ——》Targets ——》Build Settings ——》Skip Install ——》默认YES,跳过安装过程

E、Xcode ——》Project ——》Targets ——》Build Settings ——》COMBINE_HIPI_IMAGES ——》设置NO(如果为YES,图片是TIFF模式)

3、导入Bundle资源文件并进行编译:

进行上述配置完后,接下来就是引入资源文件进行编译了,下方引入的资源文件就是我们的LoginSDK.storyboard。引入资源后,进行编译,编译后会在Products下面生成相应的Bundle资源文件,该文件就可以和我们的Framework进行使用了。

Xcode ——》Project ——》Targets ——》Build Phases——》Copy Bundle Resources ——》添加图片资源

4、项目中Bundle资源的加载:

生成完Bundle资源文件后,我们在SDK的源代码中,要从Bundle资源文件中进行资源的加载。下方代码就是加载相应Bundle的代码。通过下方的宏定义,就可以通过“Bundle”的名字来加载Bundle。

#define LOGIN_SDK_BUNDLE_NAME @"LoginSDKResource.bundle"

#define LOGIN_SDK_BUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: LOGIN_SDK_BUNDLE_NAME]

#define LOGIN_SDK_BUNDLE[NSBundle bundleWithPath: LOGIN_SDK_BUNDLE_PATH]

5、注意事项:

如果Bundle工程中中引用了资源文件,工程编译过后会出现.storyboardc或者.xibc文件才算真正封装成功。

三、封装后的SDK文件的使用步骤:

1、导入SDK,进行路径配置

导入SDK到我们的App工程后,我们要对其进行相应的配置。首先我们要对Framework Search Paths进行配置,也就是说告诉编译器我们的第三方SDK所在的位置。下方这个配置项在引入SDK后就默认存在的,如果没有的话就进行配置即可。操作如下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Search Paths\Framework Search Paths ——》$(PROJECT_DIR)/LoginSDK

2、进行编译配置

配置完路径后,接下来我们要在Other Linker Flags添加上-Objc和-all_load选项。-Objc这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。而-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。操作如下所示:

Xcode ——》Project ——》Targets ——》Build Settings ——》Linking\Other Link Flags——》-Objc和-all_load

3、SDK的使用:

配置完毕后,接下来就是在我们App中使用该SDK了。下方代码就是我们上述LoginSDK的使用方式,首先获取单例,然后检查是否登录,登录成功后根据Block回调跳转到首页,如果未登录,就通过LoginAPI获取登录页面进行登录。

4、 注意事项:

《A》如果打包导出的是动态库,需要在新的工程

Xcode ——》Project ——》Targets ——》General ——》Embedded Binaries ——》添加导入Framework库

《B》如果打包导出的是态库,需要在新的工程

Xcode ——》Project ——》Targets ——》General ——》Link Binary With Libraries ——》添加导入Framework库

如果是态库,那么在新的工程还需要额外的配置:

Xcode ——》Project ——》Targets ——》Build Phases ——》New Copy Files phase ——》添加导入Framework库

如果是态库,资源打包进Framework是读取不了的。静态Framework和.a文件都是编译进可执行文件里面的。只有动态Framework能在.app的Framework文件夹下看到,并读取.framework里的资源文件。

转载于:https://www.cnblogs.com/yuhao309/p/8960730.html

iOS项目功能模块封装SDK使用总结相关推荐

  1. 员工评价系统第二天,项目功能模块图

    项目功能模块图 项目需要实现的功能模块,的具体划分,也可以作为原型给客户看.

  2. java烟草项目功能模块_一个电商项目的功能模块梳理

    电商项目核心玩法:定制商品+供应链(商品辅料库)+网红社区 最近做项目,功能越来越多,想清晰地理解项目,有点累了. 今天抽空,把这个项目的核心功能模块简要总结下,顺便画了个图. 一.全局功能模块图 二 ...

  3. php项目功能模块开发,PHP+MySQLl网站开发项目式教程项目二 模块五 后台功能实现.ppt...

    登录验证码 --效果展示 任务二:管理员登录 登录验证码 --判断验证码 在用户提交表单后,在判断用户名和密码之前,应该先判断验证码是否正确.如果验证码有误,则没有必要继续判断用户名和密码. 任务二: ...

  4. iOS项目总结——梦享一键连接SDK

    目录 项目背景 项目业绩 模块图层 实现方案 账号认证 Token认证 云认证 工厂方法优化账号.token.云认证的调用 众包认证 一键连接 通信安全 学习总结 1.项目背景 梦享网络公司第一代核心 ...

  5. ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。

    DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...

  6. iOS项目中的网络请求和上下拉刷新封装

    代码地址如下: http://www.demodashi.com/demo/11621.html 一.运行效果图 现在的项目中不可避免的要使用到网络请求,而且几乎所有软件都有上下拉刷新功能,所以我在此 ...

  7. 去年一个百万级的小软件项目经验分享,20来个功能模块,项目不太好做有些棘手

    别人总觉得是在显吧,干脆把这个项目认为是小项目了,不知道把这个项目是小了,别人会不会又觉得又显吧了?说大也不行.说小也不行,也的确没招了. 我想主要把项目里遇到的问题分享给大家一起探讨,也并不是为了什 ...

  8. 对Android和iOS项目中的模块结构和类结构设计的探讨

    1. 现有的代码规范缺少探讨的部分 1.1 关于项目的代码结构 通常来说,一个项目由多个模块组成:一个模块由多个类组成:一个类由多个方法组成:一个方法由多条语句组成: 按照代码粒度从大到小,可以划分为 ...

  9. JavaWEB二十一:BookShop项目 - 各模块功能

    BookShop项目 - 各模块功能 导读:各模块的开发逻辑架构 业务逻辑 对项目的各部分进行开发时,首要任务是明确该部分的业务逻辑.明确任务逻辑后,才可能对html文件.dao层.service层. ...

最新文章

  1. Docker部署网站之后映射域名
  2. IOT/智能设备日志解决方案(1):概述
  3. Android Gradle使用总结
  4. 数据分析机器学习-分类好坏的评价方式
  5. 【渝粤教育】国家开放大学2018年秋季 0508-21T影视特技及后期合成 参考试题
  6. project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...
  7. 5G:关键技术实现可引领
  8. Network-based Fraud Detection for Social Security Fraud
  9. Eclipse配置Tomcat并运行
  10. 【深度学习】基于Keras的手写体识别
  11. android串口方案:usb转串口 usb 转ttl
  12. UG NX 12 删除草图
  13. Linux字符设备驱动详解
  14. java-net-php-python-jsp音像店租赁录像计算机毕业设计程序
  15. 计算机无法进去系统,开机进入bios无法进入系统怎么办_电脑开机就进入bios的解决方法...
  16. 如何查看自己网站的访问量
  17. Mac系统关闭体统提示升级
  18. 【python】Flask-SQLAlchemy的Lost connection问题
  19. 伺服阀放大器|通用型电液伺服阀放大器|伺服阀放大器厂家
  20. WWDC21主题演讲6 月 8 日凌晨1点开幕

热门文章

  1. 【NOI2022】PV「什么是信息学精神?」
  2. Python将绝对路径转换为相对路径方法实例
  3. mac mysql本地连接数_Mac OS X下MySQL 5.0的默认连接数
  4. hibernate实战第二版 蒲成带目录_太NB了! 阿里程序员带你玩转Spring:脑图+实战五+面试百问+知识总结...
  5. STM32H743+CubeMX-串口重定向printf
  6. 用python编写一个点餐程序_Python写一个自动点餐程序
  7. Vue第二部分(5):编程式的路由导航和实战案例
  8. [3] ADB 设备连接管理
  9. 科来数据包生成器找不到网卡_CPU:网卡老哥,你到底怎么工作的?
  10. php 规则配置,模块Config配置规则