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

背景介绍

开发过程中,我们会构建很多个版本,主要为了满足不同的场景需求。例如: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,进行开发。

posted @ 2020-12-22 16:03  凌云幽雨  阅读(691)  评论(0编辑  收藏  举报