网上太多framework的制作版本了,很多没用了现在给大家带上最新的制作方法。
声明:本制作方法是制作的动态库,支持ios8.0以上的也支持swift 但是appstore的审核机制暂时不支持动态库上传到蒲公英等第三方平台的可以使用,如果想要在appstore上上架的话可以将framework转成静态库本章暂时不做介绍。
1.创建
打开Xcode -> 点击 Create a new Xcode project ->在 ISO 下面Framework & Library ->创建Cocoa Touch Framework ->(这边我创建的名字是FrameworkBuild)
(创建framework后会自带与framework同名的.h文件 不建议删除当头文件多的时候可以都归纳到里面去,import的时候则导一个头文件就可以 了)
#import <UIKit/UIKit.h>
//! Project version number for FrameworkBuild.
FOUNDATION_EXPORT double FrameworkBuildVersionNumber;
//! Project version string for FrameworkBuild.
FOUNDATION_EXPORT const unsigned char FrameworkBuildVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <FrameworkBuild/PublicHeader.h>
#import <FrameworkBuild/HellowWorld.h>
2.创建要封装的文件(这边先弄纯代码文件) 可以在别的地方拉过来也可以自己创建
代码如下:
.h文件
//
// HellowWorld.h
// FrameworkBuild
//
// Created by Clement_Gu on 16/8/26.
// Copyright © 2016年 clement. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface HellowWorld : NSObject
/**
* 这边创建一个暴露在外面的类方法 (方便点也可以创建实例方法)
*/
+(void)alert;
@end
//
// HellowWorld.m
// FrameworkBuild
//
// Created by Clement_Gu on 16/8/26.
// Copyright © 2016年 clement. All rights reserved.
//
#import "HellowWorld.h"
@implementation HellowWorld
/**
* 类方法实现
*/
+(void)alert
{
NSLog(@"Hellow World!");
}
@end
3.暴露将需要跟外界交互的头文件
点解工程文件(蓝色的那个)—> 点击右边的黄色的TARGET文件 ->Build Phases ->headers ->将project下面的头文件(.h文件)拉到public下面(这样可以暴露在外面供外面程序调用)
4.创建合并的运行脚本(因为模拟器和真机的运行机制不同所以会产生两个包 这边用脚本语言将他们合并)
TARGETS - >Build Phases-> 左上角有个+号点击->选择New Run Script Phase->点开最下面新增的Run Script ->在shell下面的框中输入:
set -e
set +u
#避免递归调用这个脚本。
if [[ $SF_MASTER_SCRIPT_RUNNING ]]
then
exit 0
fi
set -u
export SF_MASTER_SCRIPT_RUNNING=1
#常量
SF_TARGET_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
#构建Target
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
then
SF_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi
if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
echo "Please choose iPhone simulator as the build target."
exit 1
fi
IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos
#生成其他(非虚拟机)平台
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION
#复制framework结构的universal folder(先清空)
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"
#把这些架构(architectures)搅碎融合到一起
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"
5.选择TARGET 在模拟器的方式下编译 Command + B
6.点击左边Products 文件夹下的原来红色现在变黑的framework 右击show in finder
有三个文件 1.Debug -iPhoneos 2.Debug - iPhonesimulator 3.Debug - universal 选第三个 看字面意思也知道一个在真机一个在模拟器 一个是合并版的。
7.在工程文件中调用:
1).创建调用工程点击show in finder
将合并版的framework 复制到新建的调用工程源文件的文件夹下
2)TARGET -> General ->Embedded Binaries ->点击+号 ->左下方的add Other... ->找到要导入的framework的文件的位置添加进来就可以了。
说明:这边因为是动态库 所以要Embedded 如果制作framework的时候设置成静态的 就不用了 直接在build Phase 中导入就可以了。
下面附上测试的代码:
//
// ViewController.m
// TheTestFrameWork
//
// Created by Clement_Gu on 16/8/26.
// Copyright © 2016年 clement. All rights reserved.
//
#import "ViewController.h"
//这边导入的是framework自带的头文件因为在头文件里面关联了 也可以直接导入需要的文件
#import <FrameworkBuild/FrameworkBuild.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self buildAllControls];
}
/**
* 创建界面
*/
-(void)buildAllControls
{
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 250, 50)];
[btn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[btn setTitle:@"测试framework是否正常运行" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
//点击事件
-(void)btnClick
{
//调用类方法
[HellowWorld alert];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
总结:之前的bolg中提到过,其实framework是对静态库的进一步封装,这边不需要对图片,Xib进行封装成bundle然后配合.a文件使用,这边framework代劳了。
接下来介绍图片以及xib和storyboard加入方法。
附上:github的例子 https://github.com/ClementGu/DynamicFramewokrkDemo.git