ios 游戏sdk开发(「SDK」iOS端SDK开发总结和注意点)

发布时间:2023-11-27 17:47:35 浏览量:116次

「SDK」iOS端SDK开发总结和注意点

ios 游戏sdk开发(「SDK」iOS端SDK开发总结和注意点)

一、概念

    静态库:以.a.framework为文件后缀名。

    动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。

二、区别

    静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。

    动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。

  注意:但是苹果不让使用自己的动态库,否则审核就无法通过。所有我们制作SDK通常都是指静态库

注意点

1、项目名、里面的各种类名、文件名和方法名最好都 带上自己的前缀。

2、SDK的文件分层要以模块和功能进行划分。

3、在进行资源操作如图片加载、文件读取时,要对对应的方法进行封装处理,方便对资源的统一处理,如对UIImageView 设置图片的方法进行二次封装。

4、能不使用第三方类库就不使用,假如真的需要就最好是对第三方类库进行重命名和方法名修改,以防止SDK使用方的项目中类库文件和方法冲突。

5、要对SDK中需要用到的依赖文件进行记录以方便做文档。

6、SDK中尽量不要使用分类Category,因为会涉及到一个资源加载的问题,会使得SDK包变大。使用起来当然也是没有任何问题,只需要添加-all_load或-ObjC就可以。

7、制作的SDK需要注意debug模式和Realease模式,debug模式只是一般的测试,Realease才可进行上商店。

关于-ObjC

    这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来,这样编译之后的app会变大(因为加载了其他的objc代码进来)但是如果静态库中有类和category的话只有加入这个flag才行

关于-all_load

    这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_loadxcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。

关于-force_load

    如果有多个三方库,有的需要加,有的不需要,用-all_load到最后duplicate symbol错误此时可以用-force_load + 路径方式

1、SDK库的含义:

共享程序代码的方式,可以对自己的项目进行封装,生成库,方便别人的使用。

2、SDK库的分类:

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

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


3、SDK库的形式:

A、.a与.framework文件是静态库(.framework属于自己创建),自己创建的.framework是静态库文件。

B、.tbd(Xcode7和iOS9 之前是.dylib文件)与.framework文件是动态库(.framework属于系统自带),系统自带的.framework是动态库文件。


4、静态库和动态库的区别:

《1》.a是一个纯二进制文件,不能直接使用,至少要有.h文件配合

《2》.framework中除了有二进制文件之外还有资源文件,可以直接使用。

.framework = .a(二进制文件) + .h (头文件) + resourceFile (资源文件)


5、静态库的使用优点:

《1》方便程序共享代码,便于合理规范使用。

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

《3》能够与别人分享你的代码库,但又不想让别人看到你代码如何实现。

《4》开发第三方SDK的业务模块需求。


6、静态库的制作的注意点:

《1》.a是二进制文件,需要配合.h头文件和其它文件才能使用,.framework可以直接使用。

《2》图片资源的处理可以使用.bundle文件,.bundle文件的名字和.a或.framework的名字相同。

《3》.bundle文件的简单制作如下:

ios 游戏sdk开发(「SDK」iOS端SDK开发总结和注意点)

首先,新建一个文件夹;

其次,修改文件夹的后缀名为.bundle ;

最后,点击右键,打开显示包内容,就可以向其中添加图片资源。

《4》category文件打包成静态库文件再添加到工程,调用分类方法时会有找不到该方法的运行时错误(selector not recognized),解决办法就是在静态库的工程中配置other linker flags的值为-ObjC。

《5》如果静态库很复杂,需要暴露的.h头文件比较多,可以在静态库内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把需要暴露的.h头文件显示,不需要暴露的.h头文件集中放在这个内部创建的.h文件。


7、创建.a静态库文件流程如下:

《1》创建一个.a静态库工程

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

《2》一个静态库工程由头文件和实现文件组成(TestSDK.h和TestSDK.m),这些文件将被编译为库本身。由于不需要实现文件,需要右键单击TestSDK.m删除该文件并移动到废纸篓。

《3》创建一个自己封装的控件,然后拷贝到Xcode项目工程目录里面。注意拷贝的时候,要勾选3个选项,Copy items id needed、 Create groups和TestSDK。

《4》添加控件的.h头文件到库的主头文件TestSDK.h中

《5》生成静态库的形式:

A、模拟器,只有在模拟器才能编译运行

Build only Device ——》show in Finder ——》拿到模拟器的.a二进制文件和其它所有的.h头文件

B、真机,只有在手机端才能编译运行

iOS Simulators ——》show in Finder ——》拿到真机的.a二进制文件和其它所有的.h头文件

《6》合成真机与模拟器.a文件,这样可以在真机和模拟器都能够编译运行,终端命令如下:

lipo -create

模拟器.a文件目录

真机.a文件目录

-output 输出目录/TestSDk.a, 获取的TestSDk.a文件兼容模拟器和真机的二进制文件。

8、创建.framework静态库文件流程如下:

《1》创建一个.framework静态库工程

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

《2》创建两个新的工具类,或者向项目工程拖入一个相对完整的功能模块。

《3》在项目工程中添加所依赖的框架

Xcode ——》Project ——》Targets ——》Build Phases ——》Link Binary With Libraries

《4》在项目工程中设置要暴露的头文件接口,设置Public和Private,选择相应的运行设备。

Xcode ——》Project ——》Targets ——》Build Phases ——》Headers

《5》在项目工程中添加脚本

Xcode ——》Project ——》Targets ——》Build Phases ——》New Run Script Phase ——》 添加shell脚本

加入下面的脚本将模拟器和真机的Framework合并,如下所示:

if [ "${ACTION}" = "build" ]

then

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

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

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

#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

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

#open "${DEVICE_DIR}"

open "${SRCROOT}/Products"

fi

《6》点击Xcode左上角的运行按钮,然后脚本就自动弹出生成的Framework库文件。

《7》如果其他项目工程导入这个Framework库,编译报错,需要让编译器提前编译这个二进制文件,做法是Xcode->General->Embedded Binaries,将系统依赖的Framework添加上去即可。

《8》最后,Framework的核心在于内部结构的设计,谨慎设计你的每一个接口,在每个对外暴露的方法中需要做好注释,然而一份通用的接口文档也是必须的。


  • SDK中所有的类名都应该加前缀
  • 所有Category加前缀

  • 尽量不要引入第三方的库、如果引入要添加前缀
  • 比如添加了NSData+Base64,可以把NSData+Base64改成NSData+KYBase64,在前面加KY或者自己公司的缩写、产品缩写
  • 所有的提供的方法有测试例子
  • 文档的完整和正确
ios 游戏sdk开发(「SDK」iOS端SDK开发总结和注意点)

热门课程推荐

热门资讯

请绑定手机号

x

微信扫码在线答疑

扫码领福利1V1在线答疑

点击咨询
添加老师微信,马上领取免费课程资源

1. 打开微信扫一扫,扫描左侧二维码

2. 添加老师微信,马上领取免费课程资源

同学您好!

您已成功报名0元试学活动,老师会在第一时间与您取得联系,请保持电话畅通!
确定