iOS下创建framewok(上)

iOS开发中,有时候需要将一些工具包装起来,做成sdk提供给客户使用,制作过程可以分为两种。一种是制作静态库.a文件,一种是制作成framework文件。前者操作起来简单,但是提供给客户时比较麻烦,需要提供头文件。后者使用简便,可以直接导入,但是制作较为麻烦。

苹果在iOS8之前都不支持动态库framework方法,所以这里说的framework实质上都是静态库文件。如果有什么理解和整理错误的地方,欢迎大家指出问题所在。

这篇文章主要记录创建framework的方法。创建framework也有两种方法,一种是Xcode6之前的制作方法,一种是Xcode6之后的制作方法。这篇博客先讲解最新版本Xcode7制作framework的方法。

Xcode6就已经提供了动态库的制作方法。这里还是以Xcode7为例,两者的操作步骤是相同的。新建一个Project,选择iOS下的Framework & Library选项:

创建之后,选择你创建的Targets,在BuildSetting中搜索Mach-O,将之设置为Static Library:

然后这里开始写一个类来制作framework,提供给另一个项目进行测试,当新建好一个类文件的时候,需要在默认存在的ZYXTestFramework.h中将新建的类的头文件暴露出来,否则在另一个项目中导入头文件时会出现“Missing XXXXX”的警告。

在新建的类中写一个测试方法,打印传递过来的字符串,头文件暴露出该方法:

完成之后,选择Targets下的Build Phase选项,还需要将新创建的类的头文件暴露给使用framework的开发者调用。Headers下有三个选项Public,Private,Projects。可能中间的Private的名字会让人产生一些困惑,Private并不表明是私有的,其还是暴露了一些东西,Projects才是表明是私有的文件(该解释是从网上一篇教程中看到的,目前也不是太明确,不过一般来说还是使用Public和Projects这两个)。将ZYXFrameworkTest.h移动到Public下。

此时已经可以进行编译操作了,但是这里需要说明:我们制作的framework针对的iPhone手机的架构不只一种,一般模拟器使用的是x86 64与i386,而真机主要是arm64和armv7。armv7s很多sdk都没有特定去编译他,比如说facebook,我查看他们支持的架构未包括armv7s。网上有些教程说需要更改下图中的两个选项,其实对于这篇博文来说是没有必要的。

在编译时,设置为Release状态来进行framework的生成。这里先生成支持模拟器的Release版本,选择EditScheme,将run状态下的Debug改为Release。

运行,生成framework。可以查看生成的framework支持的架构,打开生成的framework在Finder中的位置,拖拽到终端,使用lipo命令来查看支持的架构。其中ZYXTestFramework文件实质上是静态.a文件。

可以看见支持的架构为i386何x86 64。接着再为真机生成一次framewok,因为手边没有真机,没办法截图。生成步骤与上述操作一样,只要换成真机设备就可以了。

最终生成之后需要合并两个文件,使之支持4个架构,在合并时,操作的就是上面所说的实质上是静态.a的ZYXTestFramework文件。在终端下执行lipo -create (模拟器生成的ZYXTestFrameWork路径)     ( 真机生成的路径 )  -outfile  合并的之后的路径和名称

上述生成操作也可以直接使用脚本来执行,在Xcode中新建一个Target,选择Aggregate。该Target可以用来执行脚本生成项目。

新建完毕后,在Build Phase下点击+号,选择New copy Run scripts,然后添加一段脚本

脚本内容如下:

set -e

# Sets the target folders and the final framework product.

# 如果工程名称和Framework的Target名称不一样的话,要自定义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}"

注意:使用这段脚本时“xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk
iphoneos clean build”该段脚本直接执行了真机生成,所以就像使用真机调试一样,需要一个签名证书。否则Build会失败。

生成时需要调整Target,对Aggregate执行run操作。最终会在当前项目目录中创建一个Products目录,在该目录下会有合成后的framework。  但是会有一个_codeSignature文件夹,应该是真机调试签名生成的文件夹。因为我看facebook的SDK中的framework中没有这个文件夹,所以不知道删除这个_codeSignature会不会有影响。使用者在使用这个framework时会不会也对这个framework进行签名,如果有人能解惑,非常感谢。

将生成后的framework放入测试项目中,导入头文件,进行测试。因为身边没有手机,所以直接用的模拟器测试的,这也是上面那个问题没有验证的原因。最终测试结果如下:(好像图片上传不了了,导入头文件和调用什么的都没截图了,太大)

可以看见最终是成功调用到framework中的api。这是Xcode7生成framework的方法,我个人觉得最终还是静态的库,应该不会被苹果拒绝,和facebook对比发现就是多了一个_codeSignature文件夹,这个app真机签名文件夹删除之后不知道有没有影响。

以上博文,恳请各位有能力的人能够指教解惑。再三感谢。

时间: 2025-01-31 01:35:34

iOS下创建framewok(上)的相关文章

ios下拉刷新上拉加载EGORefresh简单实现

前提下载 EGORefreshTableHeaderView.h  EGORefreshTableHeaderView.mEGORefreshTableFootView.h     EGORefreshTableFootView.m  以及8张图片并拖入工程 在.pch文件里导入 #import "EGORefreshTableHeaderView.h" #import "EGORefreshTableFootView.h"在.h文件里 UIScrollViewDe

ios 下创建,删除文件夹的方法

NSString *imageDir = [NSString stringWithFormat:@"%@/Caches/%@", NSHomeDirectory(), dirName]; BOOL isDir = NO; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL existed = [fileManager fileExistsAtPath:imageDir isDirectory:&is

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

iOS 同一个workspace下创建多个项目编程

在iOS开发中,相关联的多个项目可能会放在同一个workspace下进行开发,那习惯了一个项目在一个工作空间下的同学该怎么快速开撸呢? 只需要三步而已! 第一步,先用Xcode在目标目录下创建一个workspace文件.见图说话. 第二步,用Xcode打开workspace文件,然后在该workspace下创建多个Project文件. 在创建工程的过程中有个主意点:将新建Project添加的目标和组 都是workspace.如图: 第三步,多个工程间文件互相引用问题:多个工程间的文件引用方法:在

IOS在Document目录下创建文件夹、保存、读取、以及删除文件

1 // 在Documents目录下创建一个名为LaunchImage的文件夹 2 NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"LaunchImage"]; 3 NSLog(@"%@",path); 4 5 NSFileManager *fileManager =

iOS 下的相册与图片处理

iOS 下的相册与图片处理 需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework 的使用 Photos Framework reference Classes PHAdjustmentData /* When a user edits an asset, Photos saves a PHAdjustmentData object along with

ios下(个人公司非企业级)AdHoc在线安装全环境配置

1,环境 客户端开发:MacOs 10.8.5 服务器开发:Centos6.3 64位 2,软件准备 Apache httpd 2.2.27 OpenSSL 0.9.8za 3,客户端准备 Apple的开发者账号大致分如下三类:个人,公司,企业,这一篇我们主要说下个人.公司的ipa在线安装.个人公司级别的AdHoc有这样一个限制:就是在线发布的ipa包只能安装 在添加到Apple账号的Devices列表中(发布IPA之后再添加的设备需要重新打IPA包)的非越狱设备及越狱设备中,而企业级的开发者账

iOS下OpenGL ES 3.0编程入门(一):构建Hello World环境

OpenGL ES简介: OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. OpenGL ES 3.0主要新功能有: 1.渲染管线多重增强,实现先进视觉效果的加速,包括遮挡查询(Occlusion Query).变缓反馈(Transform Feedback)

创建 Android 上使用的自签名证书(Creating self-signed certificates for use on Android)

创建 Android 上使用的自签名证书 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 创建 Android 上使用的自签名证书 Creating self-signed certificat