前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS (动态库,静态库) 的制作,使用及遇到的问题

iOS (动态库,静态库) 的制作,使用及遇到的问题

作者头像
honey缘木鱼
发布2019-06-14 20:45:59
6.8K0
发布2019-06-14 20:45:59
举报
文章被收录于专栏:娱乐心理测试娱乐心理测试

去年接的一个私活,制作SDK给其它游戏厂家使用,功能很简单就是集成 登录,注册,支付等功能。当初抵挡不住金钱的诱惑,对于从没做过SDK的我竟有莫名的勇气接了下来,边学边做,一周时间完成,几乎没有测试,但介入游戏项目时,一个又一个的坑暴露了出来,填完坑之后,决定一定要记录下来,方便以后自己和有需要的人查阅。

一.动态库,静态库的区别

库 是共享代码的方式,一般分为静态库和动态库。 1. 表现形式

静态库:.a和.framework; .a文件是一个纯二进制文件,.framework除了二进制文件还有外部资源文件;.a 文件不能直接使用,至少要有.h文件配合;.framework可以直接使用。 .a+.h+sourceFile = .framework。

动态库:.tbd(系统库)和.framework。

2. 编译链接 静态库: 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。 动态库: 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

3. 优点 静态库:

  • 模块化,分工合作。
  • 避免少量改动经常导致大量的重复编译连接。
  • 也可以重用,注意不是共享使用。

动态库:

  • 可执行文件体积缩小,将整个应用程序分模块,团队合作,进行分工,影响比较小。
  • 多个应用程序共享内存中得同一份库文件,节省资源。
  • 可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
  • 应用插件化。
  • 可以用于不同应用间共享,这就大大节省了内存。

4. iOS 平台的认可 在 iOS 8 之前,iOS 平台不支持开发者使用用户自己的动态 Framework,appstore不能上架,因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码。但是,iOS 8/Xcode 6 推出之后,因为Extension 和 App 是两个分开的可执行文件,同时需要共享代码,iOS添加了对动态库的支持。

二.制作动态库,静态库

1.创建一个动态库YZKJFramework,新建-->Project

2.设置参数 在TARGETS下选中工程,在Build Settings下更改几个参数。

(1).Build Active Architecture Only: 指明是否只编译当前连接设备所支持的指令集,如果是,那么只编译出连接设备所对应的指令集,如果否,则编译出所有其它有效的指令集(由Architectures和Valid Architectures决定)。

(2).Dead Code Stripping, 设置为 NO 关闭对代码中“dead”,“unreachable”代码过滤. (3). Link With Standard Libraries 设置为 NO 避免重复链接. (4).mach -0 type ,即选择动态库(Dynamic Library)或静态库(Static Library)。

三.打包Framework

1. 编写代码 因为涉及很多功能,不可能把每个文件的头文件都暴露出来,于是创建单例YvGameUserAPIManage,把需要用到的方法和变量放在单例内,然后直接暴露这个单例的头文件就OK!

代码语言:javascript
复制
以初始化方法为 例:
-(void)initWithAppId:(NSString*)appId channelId:(NSString*)channelId urlScheme:(NSString *)urlScheme isTest:(BOOL)isTest isReYunReport:(NSUInteger)stateReport{
    self.appId = appId;
    self.channelId = channelId;
    self.urlScheme = urlScheme;
    self.isTest = isTest;
    self.reyunReport = stateReport;
    self.isLogin = NO;
    _payTYpe = @1;
}

2.设置Headers 将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,当然,隐藏的头文件就无法再被引用。

Tracking.h 和reyun.h是用了第三方的静态库,用到了里面的方法,所以也需要公开出来。

3.编译 (1). 选中模拟器,编译程序,适合模拟器的SDK。 (2).选中测试机,编译程序,适合真机的SDK。当初直接用测试机编译的。

右键finder中找到framework文件。

四.使用Framework
  1. 把生成好的framework 拖入需要的项目中。
  1. 引用framework头文件

3.引入方法

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        [[YvGameUserAPIManage shareInstance] initWithAppId:SDK_APPID channelId:@"assg001" urlScheme:@"Demo" isTest:YES isReYunReport:1];
        [Tracking initWithAppKey:reYunAppKey withChannelId:@"_default_"];
       [reyun initWithAppId:@"2c222c9aeb796f0fb25c1b4b747f80c4" channelID:@"QQ"];
    return YES;
}
五.遇到的问题总结

1. 打包编译动态库报错

解决方案:添加libSystem.tbd即可!

2.使用动态库是程序崩溃

解决方案: 在Embedded Binaries里添加framework。

3. 图片不显示 解决方案:需要创建图片的 bundle ,然后和库一起导入。

4. 制作的库支持的CPU指令集不全,所报的错误

报错原因: 原来对方用模拟器测试运行的,其CPU架构为x86_64,我导入的framework是真机编译出来的动态库(支持的指令集为armv7、armv7s、arm64,并没有x86_64),所以报此错误,应该生成适合模拟器和真机的通用库。

解决方案:

  1. 选中TARGETS下的工程,点击上方的Editor,选择Add Target创建一个Aggregate.

2.嵌入脚本。选中刚刚创建的Aggregate,然后选中右侧的Build Phases,点击左下方加号,选择New Run Script Phase。

3.脚本复制进去

代码语言:javascript
复制
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命令将其合并成一个通用framework  
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下  
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi

4、编译新的framework,选择Generic iOS Device,意思是“iOS通用设备”,大概就是说模拟器和真机都能用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.动态库,静态库的区别
  • 二.制作动态库,静态库
  • 三.打包Framework
  • 四.使用Framework
  • 五.遇到的问题总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档