美文网首页自留地iOS学习ios实用开发技巧
iOS多个Target的使用(包含pod、widget)

iOS多个Target的使用(包含pod、widget)

作者: 凌云幽雨 | 来源:发表于2017-09-12 18:50 被阅读258次

    背景介绍

    开发过程中,我们会构建很多个版本,主要为了满足不同的场景需求。例如:store版本、beta版本、lite版本、eth版本。如果我们通过证书修改来构建版本,会导致数据错乱。而且不能很好区别不同的环境。所以我们就有了多个Target版本开发的想法。一份代码,多份环境。便于后期的维护以及升级。下面我们就简单介绍一下如何实现。、

    一、复制Target,创建新的Target,修改名称

    我们创建一个项目,默认会创建一个Target,后续我们可以复制多个Target。
    步骤:选择现有的Target,右键->Duplicate->Duplicate only, 就可以创建一个新的Target

    创建新的Target.png

    创建好新的Target,双击即可修改Target名称。同时修改对应的Schemes,
    选择Manage Schemes,然后在目标scheme上门双击(具体是:单击一下,等3s再单击,如果快速双击,是无法进行名字的修改的),之后修改名字。

    修改Target名称.png

    二、复制plist,配置plist

    复制plist,重新命名,然后配置对应的Target


    复制plist.png

    选择对应的Target,Build Settings,搜索info ,在info.plist File修改对应的plist文件


    配置plist.png

    三、配置pods

    每增加一个target 版本,增加一次。

    source 'https://github.com/CocoaPods/Specs.git'
    platform:ios, 9.0
    use_frameworks!
    abstract_target "app_base" do
    #pod 'SVProgressHUD'
    pod 'MJRefresh'
    #用户引导图滑动控件
    pod 'ZWIntroductionViewController'
    #图片缩放控件
    #pod 'VIPhotoView', '~> 0.1'
    # Alamofire 网络库
    pod 'Alamofire', '~> 4.0'
    target "app" do
    end
    target "app_beta" do
    end
    target "app_store" do
    end
    target "app_lite” do
    end
    target "app_b2b” do
    end
    end
    target "app_today_widget" do
    pod 'Alamofire', '~> 4.0'
    pod 'SwiftyJSON'
    end
    target "app_b2b_today_widget" do
    pod 'Alamofire', '~> 4.0'
    pod 'SwiftyJSON'
    end

    四、复制widget,创建widget。

    widget复制创建与target类似,注意一点的是新建的widget是哪个bundle ID的插件,就在对应的ID后面增加后缀。
    不然会出现ID不匹配问题。
    error: Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.
    错误原因: iPhone APP, extension 的bundle ID 不符合苹果的命名规范.其命名规范必须遵循固定的格式.
    例如:target的ID是:com.test.app.lite 对应的widget就是以com.test.app.lite开头。com.test.app.lite.xxx

    五、创建图标,配置图标以及启动界面

    在assets.xcassets创建对应target的图标以及启动页面。然后在对应的target中的General配置

    配置图标以及启动界面.png

    六、创建全局变量区别不同的Target

    >//下面代码可以拿到对应的bundleld
    

    static var appTarget: AppTarget {
    let bundleId = Bundle.main
    .infoDictionary!["CFBundleIdentifier"] as! String
    let target = AppTarget(rawValue: bundleId)
    return target!
    }

    定义对应的bundleld

    enum AppTarget: String {
    case APP_BETA = "com.test.app.beta" //开发
    case APP = "com.test.app.ent" //企业生产

    case APP_STORE = "com.test.app"            //苹果商店
    case APP_LITE = "com.test.app.lite"            //lite版本
    case APP_B2B = "com.test.app.b2b"            //b2b版本
    case APP_TODAY_WIDGET = "com.test.app.today-widget"
    case APP_B2B_TODAY_WIDGET = "com.test.app.b2b.today-widget"
    

    }

    //API环境
    var apiType: APIServerEnvironmentType {
        if SystemConfig.appTarget == AppTarget.APP_BETA {
            //测试环境
            return APIServerEnvironmentType.test
        } else {
            //正式环境
            return APIServerEnvironmentType.pro 
        }
    }
    

    注意事项

    新增文件、资源等,如果有多个Target,添加新文件时要注意勾选多个Target

    结语

    现在就可以针对不同的Target,进行开发。

    相关文章

      网友评论

      • 7933e72ff3db:请问多个环境下的Target需要配置多个不同的bundle id吗?
        凌云幽雨:@yikibug 需要的,因为最终还是会打成不一样的安装包。bundle id就是为了区分程序

      本文标题:iOS多个Target的使用(包含pod、widget)

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