iOS学习过程中遇到的各种坑 - Go语言中文社区

iOS学习过程中遇到的各种坑


    前段时间因为各种原因需要学习iOS,因此我就开始了iOS学渣之路,因为是零基础,所以我在iOS开发过程中遇到了各种坑,现在将iOS开发过程中遇到的各种问题记录下来,以备后面复习。本来是应该从语言相关开始说起的,但是因为最近要上架APP,所以我打算先说说如何将代码打包成静态库,网上也有很多相关的博客或者教程,但是还是想自己再总结一下,加深一下印象。

一、什么是库?

库是共享程序代码的一种方式,一般分为静态库和动态库。

二、静态库与动态库的区别?

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

三、a与.framework有什么区别?

    静态库分为两种,分别是 .a和.framework。

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

四、为什么要使用静态库?

(1)方便共享代码,便于合理使用。

(2)实现iOS程序的模块化。可以把固定的业务模块化成静态库。

(3)和别人分享你的代码库,但不想让别人看到你代码的实现。

五、打包.framework静态库的步骤
   1)首先新建一个工程,如下图所示:















选择Cocoa Touch Framework,点击next。

2)创建好项目之后,系统会自动生成一个.h文件,我们将所有需要打包文件拖到该工程中。

3)然后选中Target,选中Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中。

4)然后在创建项目的时候系统自动生成的那个.h文件中,把所有需要暴露的.h文件都用#import <工程名/PublicHeader.h>引入,记住一定要将所有的需要暴露的.h文件都写在给定位置,不然编译后生成的.framework在引用的时候会有警告;

5)新建一个Target,选择Targets下面的静态库项目,点击下面的➕号,出现如下页面,选择Other下的Aggregate,取一个和项目相关的名字即可。


6)选中新建的Target,也就是上面的Aggregate,点击Build Pharas ,选中左上角的+,New Run Script Phase;点开Run Script,添加如下的脚本:

# Sets the target folders and the final framework product.

# 如果工程名称和FrameworkTarget名称不一样的话,要自定义FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}

# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework

# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build

# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"

open "${INSTALL_DIR}"

7)选中Targets中的第一个Target,也就是创建的静态库,点击Build Setting -> Mach-O Type,选择Static Library,因为如果不选择的话,系统会默认为是动态库,后面运行会报错。

8)还有一个问题存在,就是无法在iPhone5和iPhone5c上使用我们现在创建的这个.framework静态库,所以我们需要在Build Setting -> Architectures ->Valid Architectures中添加armv7s。如果想要适配更多机型的话,还需要加入下面几个:


9)将Build Active Architecture Only 设置为NO 。

10)如果 SDK 有用到 Category,注意项目设置 Other Linker Flags 添加 -ObjC。

11)TARGETS (yooweiSDK) - Build Settings-ENABLE_BITCODE 设置为NO . 否则真机上跑会报ld: -bundle and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together

12)完成上述工作之后,我们基本上已经完成了所有的配置工作,接下来,我们需要选择正确的Target,这时我们不能选择静态库了,我们需要选择我们之前创建的那个Aggregate,然后Command + B编译,编译完成后会自动弹出已经创建完成的.framework;

12)此外,你可能还需要设置下面所示,反正我是需要的,调整最低支持的iOS系统,如果不将版本设置为最低版本8.0的话,可能还是会不能在iPhone5和iPhone5c上使用我们创建的这个静态库。


13)检验我们生成的这个静态库都兼容哪些机型的话,一定要用lipo -info + 项目中Product路径,在终端上运行一下,如果出现下面几个配置的话就是成功了。


   到这里,我们的静态库就打包好了,如何将自己打包好的静态库引用到自己的项目中,可以看我下篇博客。可能我这里面还有不足,望大家多多指教,共同学习。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Silence723/article/details/79120602
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-26 17:35:12
  • 阅读 ( 1132 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢