最近Xcode和IOS的SDK版本升级都比较频繁,为了最快学习新版本的IOS SDK的新特性和掌握Xcode的新功能,所以本人的开发环境也一直在紧跟最新版本。最新使用的是Xcode4.6版本,IOS SDK6.1。今天在Demo工程的真机调试过程中遇到以下错误:
Could not change executable permissions on the application.弹出的错误对话框如下
![](http://static.oschina.net/uploads/space/2013/0301/223640_7SdZ_120785.png)
因项目的时间和任务分工,自己没有很熟练的掌握Xcode的真机联调的流程和细节,一直在使用现成的开发环境,平时没有遇到过什么关于Xcode调试的问题,今天突然遇到了这个莫名其妙的问题,因提示信息有限,所以上网查找了一下。原因大致是,两个Bundle identifier 相同的App在真机上是无法运行的,解决的办法是将真机上已存在的Bundle identifier重名的App工程删掉,然后重新连接真机运行。
于是按照解决办法,将真机上使用形同Bundle identifier名称的App删除,再次运行新工程,果然一切顺利,真机联调成功。
在Stackoverfolow上有一篇该问题的讨论描述了该问题的由来和解决方案。
Bundle identifier的生成
以名为MyApp的工程为例来简单说明下Bundle identifier的生成过程,使用Xcode新建MyApp工程,如
我们可以看到Bundle Identifier 是一个由Company Identifier+Product Name组成的字符串;点击Next继续直至新建工程完毕,在新工程的Xcode界面中,我们可以看到Bundle Identifier的位置
打开MyApp工程的项目列表,找到其Info.plist文件。Bundle Identifier的位置
我们知道Info.plist是一种XML格式的文本文件,现在我们以源代码方式打开该文件
我们可以看到Bundle Identifier的真是的XML格式如下
<key>CFBundleIdentifier</key>
<string>com.test.app.${PRODUCT_NAME:rfc1034identifier}</string>
此处验证了我们之前提到的Bundle Identifier为string类型的说法。其实Bundle Identifier在IOS SDK中的实际配置文件的表示为
CFBundleIdentifier ,与实际的Bundle Identifier名称是一对key-value组合
。CFBundleIdentifier 作用
根据IOS SDK手册说明,
CFBundleIdentifier在IOS或OS X中标识了唯一的集合(bundle).系统中每个不同的app或程序包都必须有一个唯一的bundle ID。该ID是一个字符串类型,系统通过这个唯一的字符串来标定你的app。例如,系统中的偏好设置可以使用这个字符串标定你得app来指定用户设置的偏好值。加载服务程序(Launch Services)使用这个ID来确定它标定的app是否支持打开某些特殊类型的文件。在IOS中,bundle identifier还用来验证app签名的合法性。
bundle ID字符串必须是一个统一类型标识符(uniform type identifier,简称UTI),并且只能包含"A-Z","a-z","0-9","-","."这些字符。bundle ID字符串应该以反响DNS格式加以组织,如果你得公司域名时Ajax.com,并且你创建的APP的名称为Hello,那么你可以指定字符串"com.Ajax,Hello"作为你的APP的bundle identifier 。
至此,我们亦可以获知Xcode中所创建创建app默认bundle identifier格式的由来。以及Bundle Identifier的用处了。
注:描述于IOS SDK6.1下