美文网首页
iOS Xcode Framework 私有pod

iOS Xcode Framework 私有pod

作者: 传说中的汽水枪 | 来源:发表于2018-02-22 09:28 被阅读275次

    环境:
    Mac OS 10.13.3
    Xcode 9.2

    公司需要部门与部门之间的合作,需要部门提供一个SDK(.framework, .a都可以).

    创建RX-iOS github

    1.png

    记得选择 .gitignore 和 license
    创建成功后:https://github.com/xzjxylophone/RX-iOS
    在.gitignore 中添加

    Podfile.lock
    Pods
    .DS_Store
    

    Xcode framework创建

    2.png

    创建成功后显示如下:


    3.png

    给这个SDK添加一个pod:

    platform :ios, '8.0'
    target 'RXSDK'
        pod 'RXCategory'
    inhibit_all_warnings!
    

    现在要添加资源文件和相关的类
    首先添加2个文件夹


    4.png

    在res添加bundle文件


    5.png
    添加完成后,显示如下.
    6.png
    删除RXSDK.bundle下所有的文件,并添加一个图片文件
    7.png

    在src添加相关的类


    8.png
    其中比较重要的文件内容:
    读取framework中bundle资源文件demo,具体是在UIImage+RXSDK.m 中:
    + (UIImage *)rxsdk_imageInBundle:(NSString *)imageName
    {
        NSString *name = [@"Frameworks/RXSDK.framework/RXSDK.bundle" stringByAppendingPathComponent:imageName];
        UIImage *image = [UIImage imageNamed:name];
        return image;
    }
    

    RXSDK.h文件和RXSDKHeader.h文件之间的关系
    在RXSDK.h添加:

    #import "RXSDKHeader.h"
    

    在 RXSDKHeader.h中文件如下:

    #import <UIKit/UIKit.h>
    @interface RXSDK : NSObject
    + (UIView *)rxsdkView;
    @end
    

    注意上面的OC类名与文件名的关系.
    这样别人调用的时候就可以:

    UIView *view = [RXSDK rxsdkView];
    

    修改相关的配置项目

    修改Mach-O Type


    9.png

    修改Build Phases中配置


    10.png
    把第二个红色框中的RXSDKHeader.h拖动到第一个红色框(也就是说你需要把所有需要开发中的.h文件拖到Public中去)

    生成framework文件

    选择任意一个模拟器运行一次(command+B)(动作A)
    选择Generic iOS Device运行一次(command+B)(动作B)


    11.png

    在Products下的RXSDK.framework右击后点击Show in Finder后打开如下的文件夹:


    12.png
    选择任意一个模拟器会生成-iphonesimulator下的sdk文件
    选择Generic iOS Device会生成-iphoneos下的sdk文件
    

    此时显示的都是Debug模式下的sdk文件.
    实际上我们是需要release模式的,因此我们可以通过如下的方式来修改
    选择Edit Scheme(点击选取Device旁边的那个会弹出一个下拉框后选择Edit Scheme)


    13.png

    把红色框中的Debug改成Release后,点击 Close
    重新执行动作A和动作B
    这个时候再Show in Finder得到的文件如下:


    14.png
    以Release开头的文件夹下的2个内容就是我们所需要的

    生成framework

    需要合并这两个文件,合并的命令和方式网上也有,此篇文章是使用脚本的方式完成合并.
    插入一个知识点介绍:


    image.png

    需要合并的是第二个红色框中的文件.把两个目录下的RXSDK文件合并成一个后,替换掉其中任何一个后,就是我们最终需要的framework
    首先我们在


    15.png
    新建一个文件夹 BuildScript
    在BuildScript添加一个sdkAggregate.sh文件
    文件内容如下:
    #!/bin/bash
    # = 前后不能有空格要不然会出错
    echo "run sdkAggregate script begin"
    script_dir=${SRCROOT%/*}
    target_name=${TARGET_NAME}
    # framework的名称
    target_name=RXSDK
    # framework的扩展名
    framework_ext=.framework
    framework_file_name=$target_name$framework_ext
    # 编译的目录
    # /Users/rush.d.xzj/Library/Developer/Xcode/DerivedData/HDRSDK-dhijegzprahyjqhahvwrkuecodnn/Build/Products/Release-iphoneos
    # 去掉最后一个反斜杠后面的内容
    build_dir=${CONFIGURATION_BUILD_DIR%/*}
    # 编译的模式Debug Release
    build_mode=${CONFIGURATION}
    build_framework_path_iphoneos_for_framework=$build_dir/$build_mode-iphoneos/$framework_file_name
    build_framework_merge_path_iphoneos=$build_framework_path_iphoneos_for_framework/$target_name
    build_framework_merge_path_iphonesimulator=$build_dir/$build_mode-iphonesimulator/$framework_file_name/$target_name
    echo $build_dir
    echo $build_mode
    echo $build_framework_merge_path_iphoneos
    echo $build_framework_merge_path_iphonesimulator
    sdk_home_dir=${SRCROOT%/*}
    sdk_mid_build_framework_merge_path_tmp_dir=$sdk_home_dir/tmp
    echo "中间临时产生的目录:$sdk_mid_build_framework_merge_path_tmp_dir"
    # 判断文件夹是否存在:
    if [ ! -d "$sdk_mid_build_framework_merge_path_tmp_dir" ]; then
        echo "dir not found need to mkdir"
        mkdir $sdk_mid_build_framework_merge_path_tmp_dir
    fi
    sdk_mid_build_framework_merge_path_dir=$sdk_mid_build_framework_merge_path_tmp_dir/sdk_mid_build
    echo "中间临时产生的目录:$sdk_mid_build_framework_merge_path_dir"
    # 判断文件夹是否存在:
    if [ ! -d "$sdk_mid_build_framework_merge_path_dir" ]; then
        echo "dir not found need to mkdir"
        mkdir $sdk_mid_build_framework_merge_path_dir
    fi
    sdk_mid_build_framework_merge_path=$sdk_mid_build_framework_merge_path_dir/$target_name
    # 先删除文件
    rm -rf $sdk_mid_build_framework_merge_path
    echo "os需要合并的文件:$build_framework_merge_path_iphoneos"
    echo "simulator需要合并的文件:$build_framework_merge_path_iphonesimulator"
    echo "合并后的文件:$sdk_mid_build_framework_merge_path"
    # 把os的和simulator的合并成一个
    lipo -create "$build_framework_merge_path_iphoneos" "$build_framework_merge_path_iphonesimulator" -output "$sdk_mid_build_framework_merge_path"
    sdk_release_output_framework_path_dir=$sdk_mid_build_framework_merge_path_tmp_dir/sdk_release_output
    echo "中间临时产生的目录:$sdk_release_output_framework_path_dir"
    # 判断文件夹是否存在:
    if [ ! -d "$sdk_release_output_framework_path_dir" ]; then
        echo "dir not found need to mkdir"
        mkdir $sdk_release_output_framework_path_dir
    fi
    sdk_release_output_framework_path=$sdk_release_output_framework_path_dir/$framework_file_name
    echo "framework的生成后的路径:$sdk_release_output_framework_path"
    # 先删除这个framework
    rm -rf $sdk_release_output_framework_path
    # 复制os中的framework到刚刚的framework路径下
    cp -a $build_framework_path_iphoneos_for_framework $sdk_release_output_framework_path
    sdk_release_output_framework_path_file=$sdk_release_output_framework_path/$target_name
    echo "需要被替换的文件路径:$sdk_release_output_framework_path_file"
    # 先删除此文件
    rm -rf $sdk_release_output_framework_path_file
    # 再复制
    cp -a $sdk_mid_build_framework_merge_path $sdk_release_output_framework_path_file
    # TODD: 还需要copy相关文件到相关目录下:
    
    echo "run sdkAggregate script end"
    

    给RXSDK工程添加一个Aggregate的Target
    File->New Target->Cross-platform->Other下面的Aggregate
    命名为:RXSDKBuild


    16.png

    点击第三个红色框中的加号
    添加一个 New Run Script Phase


    17.png
    红色框中输入:
    echo "run xcode script begin"
    script_file_name=sdkAggregate.sh
    script_dir=${SRCROOT%/*}/BuildScript  #  坑爹啊 */
    script_path=$script_dir/$script_file_name
    # 获取目录的相关权限
    chmod +x $script_dir
    # 获取文件的相关权限
    chmod 764 $script_path
    # 调用sh脚本文件
    source $script_path
    echo "run xcode script end"
    

    修改RXSDKBuild的Scheme


    17.png

    把Debug修改成Release


    image.png
    这样每次编译的时候(动作C),会自动合并/生成/copy相关的文件到(注意查看相关的脚本文件):
    image.png

    修改.sh脚本运行的相关结果可以通过如下的方式查看:


    image.png

    创建framework的github的repository

    生成framework的作用就是不想让别人看到我们的代码,因此我们还需要一个git地址,专门放framework文件.
    在git上创建一个repository


    image.png

    git clone 到跟RX-iOS同一个目录下:


    image.png
    image.png
    继续完善.sh脚本在上面的TODD下添加如下的脚本代码
    # 需要copy相关文件到相关目录下, 放到framework的git文件下:
    sdk_parent_path_dir=${script_dir%/*}
    echo "sdk parent path:$sdk_parent_path_dir"
    sdk_path_dir=${sdk_parent_path_dir}/RXSDK-iOS/RXSDK
    echo "sdk path:$sdk_path_dir"
    sdk_framework_file=$sdk_path_dir/$framework_file_name
    echo "sdk framework file:$sdk_framework_file"
    # 先删除此文件
    rm -rf $sdk_framework_file
    # 复制framework文件夹
    cp -a $sdk_release_output_framework_path $sdk_framework_file
    # 最后删除tmp文件夹
    rm -rf $sdk_mid_build_framework_merge_path_tmp_dir
    

    执行动作C后,就会得到这样的:


    image.png

    创建私有仓库

    具体可以参考:
    https://www.jianshu.com/p/ddc2490bff9f
    前半部分.
    此篇文章建立的私有仓库地址是:
    https://github.com/xzjxylophone/RXSpecs

    上传RXSDK到私有仓库中

    对于此篇文章示例工程的RXTmpSDK.podspecs文件如下:

    Pod::Spec.new do |s|
      s.name     = "RXTmpSDK"
      s.version  = "0.2"
      s.license  = "MIT"
      s.summary  = "RXSDK is a framework"
      s.homepage = "https://github.com/xzjxylophone/RXSDK-iOS"
      s.author   = { 'Rush.D.Xzj' => 'xzjxylophone@gmail.com' }
      s.social_media_url = "http://weibo.com/xzjxylophone"
      s.source   = { :git => 'https://github.com/xzjxylophone/RXSDK-iOS.git', :tag => "v#{s.version}" }
      s.description = %{
            RXSDK is a framework.
      }
      s.vendored_frameworks = 'RXSDK/RXSDK.framework'
      s.resource_bundle = {
        'Paramount' => ['RXSDK/RXSDK.framework/RXSDK.bundle/*.*']
    }
      s.source_files = 'RXSDK/RXSDK.framework/Headers/*.h'
      #s.frameworks = 'SystemConfiguration', 'Security', 'CoreGraphics', 'CoreTelephony'
      s.requires_arc = true
      #s.libraries = 'z', 'sqlite3', 'stdc++', 'iconv'
      s.platform = :ios, '8.0'
    end
    

    保存后,cd到RXSDK-iOS 目录下后依次运行---动作D
    这里有一个问题,具体的解决方案看如下的连接中的问题2:
    https://www.jianshu.com/p/3d4d7dc5c6e1

    git add --a
    git commit -m "add"
    git push origin master
    git tag 'v0.2'
    git push --tags
    git push origin master
    

    上面为什么是v0.2,因为我在尝试v0.1的时候有其他地方出错了,所以改成v0.2,记得也需要在.podspecs文件中修改为0.2
    为什么是RXTmpSDK了? 因为在官网上已经有一个RXSDK了~~~~~~~
    添加到自定义的repository中去:
    执行命令:

    pod repo push RXSpecs RXTmpSDK.podspec --verbose --allow-warnings
    

    在写代码的过程中难免会有warning,记得最后一定要加上:
    --allow-warnings
    这样就添加成功了!!!!

    验证我们的pod

    新建一个工程,添加Podfile:


    image.png

    Podfile为什么会有:

    pod 'RXCategory'
    

    因为在我们的RXSDK中需要用到这个.

    pod install一下(动作E)
    在ViewController中添加如下代码:


    image.png

    总结

    至此我们整个流程就全部搞定了.
    以后需要更新framework的话可以按照如下步骤
    1.修改framework中的相关代码
    2.动作A
    3.动作B
    4.动作C
    5.动作D (记得更新相关的tag)
    6.动作E

    步骤2至6也许可以做成一个 jenkins任务~~~~
    这个是以后如果有需要的话,再去研究一下

    欢迎留言与各种讨论.

    相关文章

      网友评论

          本文标题:iOS Xcode Framework 私有pod

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