IOS SDK制作

作者: ShawnAlex | 来源:发表于2022-06-30 18:01 被阅读0次

    IOS开发有些时候通过制作SDK进行组件化, 封装化开发很方便, 那么怎么制作一个可用的SDK呢? 直接上干货

    当前环境:
    MacOS 12.3.1
    Xcode13.4.1
    Intel Core i9

    xcodeFileNewProject

    创建

    Frame & LibraryFrameworkNext

    创建Framework

    Product Name 中填写SDK名字 → Next 之后选个自己能找的到的地方保存工程

    填写项目名字

    创建好了最终是这个样子


    项目初始

    先修改Deployment info部署信息, 这个要根据自己的目标工程配置。例如 我加入的目标工程支持到 ios10.0, 不支持iPad, Mac, 那么我创建的SDK也要对应修改

    目标工程
    图片中测试项目是 IOS面试题(设计模式相关) --- 工厂设计模式一个demo , 评论区有对应Demo地址,

    其实自己随便一个项目加进去即可, 留意下版本号对应即可

    修改 Deployment info 修改 Deployment info

    接下来 Command + N创建一个类便于后面调用

    创建类

    例如我这边创建一个SpriteFactory类, 类型是NSObject, 并写入一个实例方法factoryProductSprite

    例子 例子

    建好之后, 在公共文件ProductSprite.h(第一个, 你自己建的那个名字), 引入头文件. 留意下引入文件格式即可

    引入头文件

    接下来我们需要修改一下Build Settings中部分内容

    • TargetsBuild SettingsMach-O TypeStatic Library静态库 (动态库有点区别, 方法在最下面)
    修改 Mach-O Type
    • TargetsBuild SettingsBuild Active Architecture Only 仅构建活跃体系为No

      修改 Build Active Architecture Only
    • Build SettingsEnable Bitcode 启用位代码为 No

      修改 Enable Bitcode
    • Build PhasesHeaders 测试头文件需要移动到Public

      移动前
    移动后
    • Edit SchemeRunInfoBuild ConfigurationRelease
      Build Configuration
    Release

    接下来我们建立个组群, 管理下SDK

    • Targets 点击+OtherAggregate 老版本位置不一样的, 需要留意下
      管理SDK
    建立Aggregate

    建完之后如下, 多了一个这个


    建完Aggregate

    添加framework的脚本文件, Build Phases 点击 + 选择New Run Script Phase

    New Run Script Phase
    之后会这样
    脚本面板

    把这个复制进去

    #!/bin/sh
    #要build的target名
    TARGET_NAME=${PROJECT_NAME}
    if [[ $1 ]]
    then
    TARGET_NAME=$1
    fi
    UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
    
    #创建输出目录,并删除之前的framework文件
    mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
    rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
    
    #分别编译模拟器和真机的Framework
    xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    
    #拷贝framework到univer目录
    cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
    
    lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"
    
    
    #合并framework,输出最终的framework到build目录
    lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
    
    #删除编译之后生成的无关的配置文件
    dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
    for file in ls $dir_path
    do
    if [[ ${file} =~ ".xcconfig" ]]
    then
    rm -f "${dir_path}/${file}"
    fi
    done
    #判断build文件夹是否存在,存在则删除
    if [ -d "${SRCROOT}/build" ]
    then
    rm -rf "${SRCROOT}/build"
    fi
    rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
    #打开合并后的文件夹
    open "${UNIVERSAL_OUTPUT_FOLDER}"
    
    复制脚本文件

    上方选择新加的Targets 选择Any iOS Device运行

    image.png

    由于我们刚才已经写脚本了, 所以会自动生成模拟器真机的SDK, 并且自动弹开, 如下


    image.png

    其他项目如果想使用, 把.framework拖进去或者复制项目再add进去即可

    加入SDK

    加入之后如下, 留意下GeneralFrameworks, Libraries, and Embedded Content这快, 如果没有(老版本), 需要手动加进去.framework

    加入

    在合适地方调用, 引用头文件格式 #import "ProductSprite/ProductSprite.h", 下面写进去对应方法

    调用framework

    运行可看到


    运行结果

    动态库如果正常按上面方式处理会报错, 例如
    TargetsBuild SettingsMach-O TypeDynamic Library

    配置Dynamic Library

    运行时候会这样Crash


    动态库crash

    目标文件: Build Phases点击+, 选择New Copy File Phase

    New Copy File Phase

    点击+, 选择对应动态库加进去, Destination 留意选择Frameworks

    配置Copy File

    修改TargetsBuild SettingsBuild OptionsValidate WorkspaceYes

    image.png
    • Validate Workspace - Yes: 那么在构建版本的过程中将对工作区配置进行验证检查。

    配置完之后再运行, 正常打印


    运行结果

    相关文章

      网友评论

        本文标题:IOS SDK制作

        本文链接:https://www.haomeiwen.com/subject/dmunvrtx.html