以前也做过静态库的开发,不过都是一些简单的调用,最近在做项目的时候,发现其中还有很多问题,所以建个小项目简单记录遇到的问题以及正确的解决办法。

在项目中遇到的问题如下:xib文件获取不到,
            storyboard提示not loadead yet ,
            xib和storyboard中的图片获取不到。
 
通常我们进行静态库开发的过程包括下面几个方面:(可以实现在开发静态库的同时在主工程中查看代码结果是否和预期一致)
1、主工程:可以实现直接测试静态库内的各种模块功能;
2、静态库:封装自己的静态库,方便使用,使功能模块化;
3、bundle资源包:把静态库中的资源文件封装到bundle包中。资源文件包括图片、storyboard,xib文件、plist文件以及mp3等。
4、aggregate:实现脚本合并静态库支持的设备,生成通用静态库。
下面开始逐步实现:
 

一、新建名称为JFSDKDemo的单控制器工程,设置最低系统版本号,设置目标设备。

 

二、新建名称为JFSDKFramework的静态库,具体为file—new—target—cocoatouch framework。设置最低系统版本号,设置目标设备

 
        1、设置JFSDKFramework为静态库:Build Settings —>Mach-O Type 设置为Static Library
   
        2、新建控制器:SDKVCtest01(勾选xib,同时创建xib文件)。添加一张图片备用。然后这个xib中添加两个UIImageView,其中一个在xib中直接设置图片,另一个在代码中设置。xib如下:
           3、新建控制器SDKVCtest02,同时创建SDKVCtest02.storyboard,关联控制器和故事板。SDKVCtest02.storyboard中和上面的xib一样布局。
           4、此时JFSDKFramework的Build Phases如下所示:(可以根据具体情况调整暴露的头文件),在JFSDKFramework.h文件中添加公开的头文件,如#import <JFSDKFramework/SDKVCtest01.h>,用于解决引用公开头文件时‘Missing submodule ’的提示。
 
 
 
 
                5、此时在ViewController.m中添加两个控制器的头文件。然后分别展示两个控制器(xib和storyboard),部分代码如下:
 
- (IBAction)pushXib:(UIButton *)sender {

    SDKVCtest01 *vc = [[SDKVCtest01 alloc]init];

    [self presentViewController:vc animated:YES completion:nil];
} - (IBAction)pushStoryboard:(UIButton *)sender {
SDKVCtest02 *vc = [[SDKVCtest02 alloc]init]; [self presentViewController:vc animated:YES completion:nil];
}
 
                发现,啥也没有,这就对了,因为默认的加载xib,storyboard,图片等资源是在程序的主bundle中加载的,此时主工程中虽然添加了我们的SDK但是查找不到相应的资源,因而下面我们对资源文件进行打包,即使用bundle文件打包资源文件。
 

三、bundle资源包:把静态库中的资源文件封装到bundle包中。资源文件包括图片、storyboard,xib文件、plist文件以及mp3等。

          生成bundle有两种方式,
                    第一种就是直接在桌面新建文件夹,修改名称添加“.bundle”后缀,然后把资源文件添加进去即可。
                    第二种:在Xcode中file—>new —>target —>mac os —>bundle。然后把资源添加到编译文件中。
       
     我们采用第二种,
       1、因为我们的静态库中有xib和storyboard,我们的bundle中需要的是编译之后的nib和storyboardc文件,如果采用第一种方式需要每次编译之后找到编译的文件添加到bundle文件中,这样很麻烦;
       2、此外若xib或者storyboard中直接引用图片,默认是主bundle,采用第二种方式时,若要修改为自定义bundle只能代码解决,而第一种方式图片和xib以及storyboard一起编译,不用任何其他修改即可完美运行,因而第二种不予采纳。
 
        采用第二种的方式只需要添加xib和storyboard文件到bundle target中,会直接编译文件到bundle文件中。
 
        具体步骤如下:
            1、file—>new —>target —>mac os —>bundle 新建bundle命名为“JFSDKSources”。Build Settings中设置Base SDK 为 Latest IOS;Build Settings中设置COMBINE_HIDPI_IMAGES 为NO,防止图片被编译为tiff格式;设置最低系统版本号,设置目标设备。
            2、把第二步中的xib,storyboard以及图片资源添加到JFSDKSources中,查看Build Phases确保资源文件被添加到Copy Bundle Resources中(因为Xcode9拖拽的文件都不会被添加,这个真的很坑,每次都要手动添加),最后如下图:
 
 
 
 
            3、修改两个控制器中的代码引用,把默认的主bundle修改为我们自定义的bundle包:
            
//SDKVCtest01
 
- (instancetype)init{
SDKVCtest01 *testVC = [[SDKVCtest01 alloc]initWithNibName:@"SDKVCtest01" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]];
return testVC;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.view.backgroundColor = [UIColor whiteColor];
self.imageView1.image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil];
}
//SDKVCtest02
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Do any additional setup after loading the view.
self.imageView1.image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil]; }
- (instancetype)init{
SDKVCtest02 *testVC = [[UIStoryboard storyboardWithName:@"SDKVCtest02" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]] instantiateViewControllerWithIdentifier:@"SDKVCTest02"]; return testVC;
}
 
            4、主工程中添加product中的JFSDKSources.bundle。
 
            command+r,发现xib,storyboard以及png都完美呈现出来,这样,静态库和bundle资源包基本完成,还需要最后一步。
 

四、新建aggregate:实现脚本合并静态库支持的设备,生成通用静态库。

            1、file—>new —>target —>cross-platform—>aggregate 
            2、Build Phases 新建Run Script,添加如下脚本

FMK_NAME="JFSDKFramework"
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
SDK_DIR=${SRCROOT}/Products/${FMK_NAME}
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}/${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
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator
# Cleaning the oldest.
if [ -d "${SDK_DIR}" ]
then
rm -rf "${SDK_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}"
#mv "${INSTALL_DIR}/${FMK_NAME}.bundle" "${SDK_DIR}"
open "${SDK_DIR}"
 
            3、command +R,编译几秒钟弹出framework文件。
 
大功告成!!!
 
 
附:不同资源在静态库中的加
 
 //图片
UIImage *image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil];
//storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SDKVCtest02" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]];
//xib
SDKVCtest01 *testVC = [[SDKVCtest01 alloc]initWithNibName:@"SDKVCtest01" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]]; NSArray *array = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] loadNibNamed:@"nibname" owner:nil options:nil];
//mp3
NSString *path = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] pathForResource:@"test" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: path];
//plist
NSString *filePath = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] pathForResource: @"test" ofType: @"plist"];
NSDictionary *plistDic = [NSDictionary dictionaryWithContentsOfFile:filePath];
 
注意:  1、storyboard 在bundle中的文件应该是编译之后的 storyboardc 文件;
      2、xib 在bundle中的文件应该是编译之后的 nib 文件;
      3、不要让图片编译成tiff格式。
      4、‘Missing submodule ’的问题。在JFSDKFramework.h文件中添加公开的头文件,如#import <JFSDKFramework/SDKVCtest01.h>,用于解决引用公开头文件时提示。
      5、Build Active Architecture Only,设置为NO的时候,会编译支持的所有的版本;设置为YES的时候,是为Debug的时候速度更快,它只编译当前的architecture 版本
      
 
Demo地址:点这里
 
                   SDK 开发

iOS SDK开发汇总的更多相关文章

  1. ios项目开发汇总

    UI界面 iOS和Android 界面设计尺寸规范  http://www.alibuybuy.com/posts/85486.html iPhone app界面设计尺寸规范  http://www. ...

  2. 转载-iOS SDK开发

    最近帮兄弟公司的做支付业务sdk,积累了 sdk 封装的经验!下面我会从零开始把我的 sdk 封装和调试经历分享给大家,希望能给看到这篇文章的人有所帮助! 本文我会从以下几个方面来讲述: Framew ...

  3. 【转】使用Xcode中的iOS SDK给iphone开发出第一个App程序

    之前已经折腾过用Xcode开发OS X的程序了,现在继续折腾,用iOS SDK开发移动设备(iphone/ipad/ipod touch)的程序. 1.从iOS Developer Library中找 ...

  4. XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.开启PAServ ...

  5. 百度VS高德:LBS开发平台ios SDK对比评测

    随着iPhone6手机的热销,目前的iOS应用开发市场也迎来了全盛时期.据了解,目前市面上已有的iOS应用基本覆盖了购物.上门服务.用车服务.娱乐等行业.而在这些iOS应用中,内置LBS服务的应用占大 ...

  6. 【视频教学】如何利用高德地图IOS SDK进行开发?

    Step1:使用IOS SDK可以做什么高德地图 iOS SDK 是一套基于 iOS 5.1.1 及以上版本的地图应用程序开发接口.通过该接口,用户可使用高德地图数据和服务轻松构建功能丰富.交互性强的 ...

  7. iOS开发之引用百度地图SDK(一)-----------SDK开发指南

    (void)viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView.delegate = self; // 此处记得不用 ...

  8. 浅谈iOS视频开发

     浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...

  9. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

随机推荐

  1. 子div撑不开父div

    方法一:推荐 设置父div的overflow:hidden; 方法二: 父div结束前增加一个空div style=”clear:both;” .clear { clear:both; } <d ...

  2. Windows系统编程之异步I/O和完成端口

    Windows系统编程之异步I/O和完成端口[作者]北极星2003[来源]看雪技术论坛(bbs.pediy.com) [时间]2006年7月1日 一.  同步I/O和异步I/O 在介绍这部分内容之前先 ...

  3. Linux下nautilus的右键快捷菜单项设置

    某一天我的Linux更新完后, 我照常在文件夹下点击右键想打开终端, 却发现右键快捷菜单没有Open in terminal的菜单项了. 在网上查找了一下, 结合自己系统的情况发现了解决办法. 由于我 ...

  4. mybatis环境配置与入门例子

    1.jar包的导入 mybatis需要jar包:mybatis-3.4.6.jar mysql驱动jar包:mysql-connector-java-5.1.34.-bin.jar 日志记录jar包: ...

  5. asp.net对接拼多多

    asp.net对接拼多多视频地址:https://www.bilibili.com/video/av43512047/?p=7

  6. TI 开发板安装USB转串口驱动

    使用TI开发板的时候,USB转串口驱动没有,显示,无法识别设备.搜了好久才搜到相关驱动. 做个记录. 链接: https://pan.baidu.com/s/1ZT5zzVcU727jrYacKVoT ...

  7. python基础的几个小练习题

    题目: 1.写一个程序,判断2008年是否是闰年. 2.写一个程序,用于计算2008年10月1日是这一年的第几天?(2008年1月1日是这一年的第一天) 3.(文件题)有一个“record.txt”的 ...

  8. 【sping揭秘】16、@After(finally) 但是这个实在afterturning之前执行

    package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...

  9. c/c++本地时间获取

    在记录程序日志时,需要记录时间.如下: #include <iostream> #include <time.h> #include <windows.h> usi ...

  10. Django--Session 操作

    Session Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要 ...