ios开发时,在Xcode中添加多个targets进行版本控制

    在ios开发时,我们经常会遇到对同一个app开发多个版本(Pro、Lite、Free)的情况,这里就涉及到xcode里通过添加多个targets来进行版本控制的问题了,下面就简单说明一下:

     点击左侧的工程名称,右侧会出现PROJECT和TARGETS,点击你现在的target,假如叫A,右键弹出菜单中,选择Duplicate,复制一个相同的target,复制的target一般叫A copy,A copy和A的设置(编译条件、源文件、资源文件)完全一样,此时你可以根据需要修改A copy的编译条件和资源文件了;


1、A copy的名称是不是显得不够专业?现在来修改一下:

1)首先修改Xcode左上角的target名称:

点击xcode左上角Run、Stop右边的工程名称,下拉框中选择Manage Schemes,在弹出框中,点击A copy那行,点击一次、再点击一次,就可以修改A copy为你想要的名字了,比如ALite;

2)修改xcode左下方Products下的A copy.app名称:

点击Targets下你刚才改名后的ALite,点击Bulid Setting,搜索Packaging下的Private Headers Folder Path,修改A copy.app/PrivateHeaders为:ALite.app/PrivateHeaders;


2、修改Bundle Identifier和选择不同的证书,让app区分开来

1)新target需要的.plist文件

      新建一个文件夹X,添加X到项目中,添加时选择target为ALite,不要选target A了,因为不是共用的;复制原来target的A-Info.plist到X,修改其名称为ALite-Info.plist,xcode中右键Add File To ...,选择添加到target ALite中;

2)点击target: ALite ->Summary:提示你需要选择plist文件,选择1)中添加的ALite-Info.plist;

3)点击target: ALite ->Summary:设置Bundle Idenfitier;

4)点击target: ALite->Build Settings->Code Signing:选择另外的证书;


3、修改程序名称

     一般说来,多个target的程序名称不同,复制zh-Hans.lproj和en.lproj下的InfoPlist.strings文件到X,xcode中右键Add File To ...,选择添加到target ALite中;然后修改InfoPlist.strings的内容:CFBundleDisplayName="程序名称Lite";

4、2个target到现在就创建好了,你添加资源文件的时候,通过选择添加的target来控制不同版本的内容;再说一下预编译宏的事情:target->Build Setting,搜索:Preprocessor Macros,设置Debug和Release里的预编译宏内容,比如TARGET_VERSION_LITE=1表示lite版本(注意=前后不能右空格,有空格会编译不过),程序中对不同版本这样判断:

#if TARGET_VERSION_LITE ==1

...

#elif TARGET_VERSION_LITE ==2

...

#endif




参考文章:

1、http://blog.163.com/lengfeng_04/blog/static/80470603201273111549529/

XCode 同一Project创建多个target  

由于项目需求,同一项目需要发两个版本,两个版本只有小部分不同,特地研究了一下target,小有了解,把创建target的经过记录在案,方便过后查看,如有疏漏,请网友指正。


创建target有两种方式,

1是通过新建target可以通过File-->New-->Target,然后选择其中一个模板来创建,app类型的target,可以选择Empty Application模板,不过新建的target有自己的AppDelegate和main,这点还没研究好,如何与原来的AppDelegate和main复用

2.另一种方法是通过对原有的target做duplicate,复制一份,目前只研究了如何通过duplicate来新建target,做下记录。

假设原来的target名字为A,我们需要新建一个target B


1. 在原来的target上右键,选择duplicate,Xcode会复制一个名为A copy的target对象,同时生成一个A copy-info.plist和A copy的scheme

2. 改名

a)对A copy target改名,可以直接单击target来修改,改成B

b)A copy-info.plist,默认生成在程序环境根目录,也就是A.xcodeproj的同级目录中,如果想放到里层(比如与A-info.plist放在同级目录),可以先在Xcode删除A copy-info.plist索引,然后拷贝文件到制定目录中,然后更名为B-info.plist,在add到project中。在Project的Build Settings中,修改Info.plist File选项为B-info.plist的目录(相对路径),这样就可以看到Info页了(就是B-info.plist),接着修改ProductName和Bundle identifier,使之成为另一个app。Prefix Header的路径,视具体需求而定是否要修改,如果两个target可以公用同一个Prefix Header,那么就不需要修改这里的路径

c)修改scheme,在调试的Stop按钮边上,我们可以选择本工程中所有的target来做编译,如果不修改,在这里选择出来的名字就是A copy,为了与新建的target统一起来,同样也要修改这里的名字。点击scheme选择区,然后选Manager Scheme,找到A copy,然后改成你需要的名字,比如B


用duplicate的好处是,如果两个target的相同点很多,用duplicate,就可以把相关的设置全部拷贝过来,而不需要做过多的修改


生成一个新的target,一定会与原target有区别,这里可以定义预编译宏,来区分两个版本的不同代码,预编译宏可以在Build Settings中Preprocessor Macros定义,比如在我们新建的target B中定义预编译宏MACRO,然后在代码中通过

#if defined (MACRO)

//target  B需要执行的代码

#else

//target A需要执行的代码

#endif

来区分


其他:Build Phases(各target编译所包含的内容,需要注意的是,如果创建了target B后,再往A里面添加资源或文件,target B中不会自动增加这些资源,需要手动添加)

1.Compile Sources

需要编译的代码文件

2.Link Binary With Libraries

编译所依赖的库

3.Copy Bundle Resources

编译需要的资源

每个target可以根据具体需要增减里面的内容


2、http://kan.weibo.com/con/3550176548481250?_from=text

http://stackoverflow.com/questions/1807377/xcode-multiple-targets-multiple-internationalized-names

同一份代码多个Target,在支持多语言下分别设置其名称的方法

真不好用一个标题来概括这个东西。Xcode 4.2+ 在项目多语言包 xx.lproj 里引入了一个叫 InfoPlist.strings 的文件,可以对同一个 App 在不同系统语言下显示不同的 Display Name。比如:

InfoPlist.strings (English) -

"CFBundleDisplayName" = "English Name";
InfoPlist.strings (Chinese) - "CFBundleDisplayName" = "中文";

在单 Target 下很容易做,多 Target 的时候就需要做一点额外的处理。在项目目录下新建与 Target 同名的文件夹(同名是为了方便区分),然后将 xx.lproj 文件夹 复制 到各个 Target 下面,目录结构会是这个样子:

./Target1/          
en.lproj/InfoPlist.strings          
 zh-Hans.lproj/InfoPlist.strings
./Target2/          
en.lproj/InfoPlist.strings          
 zh-Hans.lproj/InfoPlist.strings

复制后保持项目目录下还有 xx.lproj 文件夹,里面保留 Localizable.strings,因为多语言化一般是通用的,没必要针对每一个 Target 做多语言。复制后的 Target1/xx.lproj 下只有 InfoPlist.strings。然后添加到 Xcode 项目里,打开 Xcode - Views - Utilities (Command+Option+0),在 Target Membership 下针对不同的 Target 把对应文件夹下的 InfoPlist.strings 对应连接起来,Done。


无法加载资源,因为 App Transport Security 策略要求使用安全连接

09-17
<div class="post-text" itemprop="text"> <p>I am facing the Problem when I have updated my Xcode to 7.0 or iOS 9.0. Somehow it started giving me the Titled error</p> <blockquote> <p>"The resource could not be loaded because the App Transport Security policy requires the use of a secure connection"</p> </blockquote> <p>Webservice Method:</p> <pre><code>-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString { NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; [sessionConfiguration setAllowsCellularAccess:YES]; [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]]; NSLog(@"URl %@%@",url,DataString); // Configure the Request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"]; request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding]; request.HTTPMethod = @"Post"; // post the request and handle response NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Handle the Response if(error) { NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]); // Update the View dispatch_async(dispatch_get_main_queue(), ^{ // Hide the Loader [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES]; }); return; } NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL]; for (NSHTTPCookie * cookie in cookies) { NSLog(@"%@=%@", cookie.name, cookie.value); strSessName=cookie.name; strSessVal=cookie.value; } NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; }]; [postDataTask resume]; } </code></pre> <p>The service is Running fine for Xcode earlier versions and iOS previous versions But when I have updated to Xcode 7.0 that is on iOS 9.0, it started to give me the Problem like following when I am calling the above web service method. The Logged Error which I am getting is:</p> <blockquote> <p>Connection failed: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x7fada0f31880 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=<strong>MyServiceURL</strong>, NSErrorFailingURLKey=<strong>MyServiceURL</strong>, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}</p> </blockquote> <p>I have tried Following Questions and answers but did not get any result there, is there any advance idea how I can remove that service call error?</p> <ol> <li><a href="https://stackoverflow.com/questions/32069393/the-resource-could-not-be-loaded-is-ios9">The resource could not be loaded is ios9</a></li> <li><a href="https://stackoverflow.com/q/32427300">App Transport Security Xcode 7 beta 6</a></li> <li><a href="https://stackoverflow.com/a/32609970">https://stackoverflow.com/a/32609970</a></li> </ol> </div> <p>转载于:https://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi</p>
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值