Could not change executable permissions on the application.弹出的错误对话框如下 因项目的时间和任务分工,自己没有很熟练的掌握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格式如下此处验证了我们之前提到的Bundle Identifier为string类型的说法。其实Bundle Identifier在IOS SDK中的实际配置文件的表示为 CFBundleIdentifier ,与实际的Bundle Identifier名称是一对key-value组合 。 CFBundleIdentifier 作用CFBundleIdentifier com.test.app.${PRODUCT_NAME:rfc1034identifier}
根据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下