MFramework 0.0.4

MFramework 0.0.4

melody5417 维护。



  • melody5417

iOS SDK 从开发到发布

本文将记录 iOS SDK 从开发到发布的具体流程和经验总结。本文主要以图片形式展示,代码可在 github链接 下载。

创建 SDK 工程

创建 Cocoa Touch Framework: MFramework

创建 MFramework project

更改工程设置

  • 更改为 Info -> development target 到目标系统版本

  • 确认 Target -> Build Settings -> Mach-O Type 为 Dynamic

  • 更改为 Target -> Build Settings -> Build Active Architchture Only 为 NO

  • 更改为 Target -> Build Settings -> Bitcode 为 NO

    配置工程信息

配置公共头文件

  • 添加测试代码 公开头文件

  • 将测试类的头文件 .h 设置为 public 公开头文件

  • 在 MFramework.h 文件中引入所有公开的头文件 公开头文件

创建 Demo 工程

创建 Demo 工程 并集成 MFramework

  • 如图创建 Demo 工程。

  • 配置 Demo 工程,关闭 bitcode。

  • 将 MFramework 的 .project 拖入 Demo 工程中。

  • 在 Target -> Build Phases 配置 Dependencies 添加 MFramework。

  • 在 Target -> Build Phases 配置 Linked Frameworks 和 Embedded Binaries 添加 MFramework。

    创建MDemo project

验证

  • 调用 MFramework 的测试代码,console 打印如预期。

创建MDemo project

本地打包 手动发布

  • 更改 Edit scheme -> Run -> Build Configuration 为 Release 公开头文件

创建 Cross-platform 的 Aggregate,执行 build 脚本,通过 lipo 命令将之前构建好的 模拟器架构的 SDK 产物真机架构的 SDK 产物 合成 适用于真机和模拟器的 SDK 产物

  • 创建 Cross-platform 的 Aggregate 创建target 创建aggregate 6-3 创建aggregate 预览

  • 修改配置,添加依赖和构建脚本 6-3 创建aggregate 预览 6-4 设置 target dependencies 6-5 创建build 脚本 6-5_2 创建build 脚本

  • 脚本代码

     TARGET_NAME=${PROJECT_NAME}
     OUTPUT_DIR=${SRCROOT}/Products/${TARGET_NAME}.framework
     DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework
     SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework
     
     if [ -d "${OUTPUT_DIR}" ]
     then
     rm -rf "${OUTPUT_DIR}"
     fi
     
     mkdir -p "${OUTPUT_DIR}"
     cp -R "${DEVICE_DIR}/" "${OUTPUT_DIR}/"
     
     lipo -create "${DEVICE_DIR}/${TARGET_NAME}" "${SIMULATOR_DIR}/${TARGET_NAME}" -output "${OUTPUT_DIR}/${TARGET_NAME}"
     
     open "${SRCROOT}/Products"
    
  • 构建MFramework的模拟器产物 6-6 build 模拟器版本的framework

  • 构建MFramework的真机产物 6-6 build build镇机的framework

  • 构建MFrameworkCommon,通过构建脚本会产生 支持模拟器和真机的SDK产物6-7 build aggregate 6-8 适用真机及模拟器的framework

  • MDemo工工程集成SDK产物MFramework.framework,添加 Embedded Binaries 和 Linked Frameworks. 6-9 framework集成到demo

持续构建 自动发布

每次发布都手动打包,不仅繁琐,耗时费力,还容易出现遗漏甚至错误。下面介绍如何实现持续构建和自动发布。在workspace根目录创建构建脚本build.sh,通过命令行运行sudo ./build.sh,则会在workspace根目录下创建result文件夹并生成目标产物。利用如蓝盾等持续构建平台,可以实现持续构建,自动发布和自动归档的完美操作。

  • 目标产物预览 7-1framework自动构建预览

  • 脚本代码

# 环境变量
#version=$MajorVersion"."$MinorVersion"."$FixVersion"."$BuildNo
#shortVersion=$MajorVersion"."$MinorVersion"."$FixVersion
version=2.3.4.5
shortVersion=2.3.4

xcworkspace="DevFramework"
scheme="MFramework"
configuration="Release"

WORKSPACE=`pwd`
RESULT_DIR=$WORKSPACE/result

# 清理工作区
rm -r ~/Library/Developer/Xcode/Archives/`date +%Y-%m-%d`/$scheme\ *.xcarchive
xcodebuild clean -workspace $xcworkspace.xcworkspace -scheme $scheme -configuration $configuration

# 更新版本号
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $version" $scheme/$scheme/Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $shortVersion" $scheme/$scheme/Info.plist

# 分别编译真机和模拟器的 framework
xcodebuild -workspace $xcworkspace.xcworkspace -scheme $scheme -configuration $configuration ONLY_ACTIVE_ARCH=NO -sdk iphoneos BUILD_DIR="$RESULT_DIR" BUILD_ROOT="${BUILD_ROOT}" clean build
if ! [ $? = 0 ] ;then
    echo "xcodebuild iphoneos fail"
    exit 1
fi

xcodebuild -workspace $xcworkspace.xcworkspace -scheme $scheme -configuration $configuration ONLY_ACTIVE_ARCH=NO -sdk iphonesimulator BUILD_DIR="$RESULT_DIR" BUILD_ROOT="${BUILD_ROOT}" clean build
if ! [ $? = 0 ] ;then
    echo "xcodebuild iphonesimulator fail"
    exit 1
fi

# 合并 framework,输出适用真机和模拟器的 framework 到 result 目录
cp -R "$RESULT_DIR/${configuration}-iphoneos/${scheme}.framework/" "$RESULT_DIR/${scheme}_${version}.framework/"
lipo -create "$RESULT_DIR/$configuration-iphonesimulator/${scheme}.framework/${scheme}" "$RESULT_DIR/${configuration}-iphoneos/${scheme}.framework/${scheme}" -output "$RESULT_DIR/${scheme}_${version}.framework/${scheme}"
if ! [ $? = 0 ] ;then
    echo "lipo create framework fail"
    exit 1
fi

版本号设置

Framework必须配置版本号,这样方便用户(SDK使用者)接入合适的目标版本,也有利于后期问题定位和开发维护。建议版本号格式为 主版本.特性版本.修正版本.持续构建build号,具体配置方法可以参考[持续构建 自动发布]。

上架 App Store

为了让用户(SDK使用者)可以进行模拟器和真机的开发调试,上述步骤生成的 SDK 包含了4个架构:i386 x86_64 armv7 arm64。其中 i386 x86_64 是Mac处理器的指令集,运行模拟器的架构,在提交 App Store 时需要移除。

8-1开发版本

8-2appstore版本

# TARGET 代表framework的名字

cd TARGET.framework # 跳转到 framework 目录

lipo -archs TARGET   # 查看framework支持的架构

lipo TARGET -thin armv7 -output TARGET_armv7 # 输出 armv7 架构

lipo TARGET -thin arm64 -output TARGET_arm64 # 输出 arm64 架构

lipo -create TARGET_armv7 TARGET_arm64 -output TARGET # 合并 armv7 和 arm64 架构

这个脚本也可以放到 build.sh 中,这样可以一次构建同时出 开发版 和 发布版,避免了手动操作可能引入的问题,同时实现持续构建 自动归档。

交付 List

这是在实际交付时后补的章节,因为 交付 List 真的非常重要。在我实际开发 SDK 交付给用户(SDK调用方)时,由于交付流程 手动操作比较多,很容易引入遗漏甚至错误。比如说 具体交付哪些文件,文件是否为最新版本,怎么样接入SDK等。

基于此,最后我 将 SDK 的开发,测试和交付都集中到蓝盾统一管理。主要操作是将上述几个步骤的操作统一到 build.sh 脚本构建,产物具体包括:

* SDK 的 Dev 版本
* SDK 的 Store 版本
* Demo 工程源码
* 接入手册文档
* 版本历史文档

这样能确保 开发,测试和交付三方 代码功能的一致性,交付文档的完整性以及持续构建和自动归档。

结语

看到这里,iOS SDK 开发到发布的基本流程都已走通。当然,SDK 的开发工作远不止这些,更多的挑战和经验还需要各位大佬总结和分享,哈哈,就先到这里了~