在苹果手机上开发的软件是用什么方法来进行软件加密防盗版的?
在硬件和软件上分别要实现什么技术呢?
有什么可以参考的书或资料吗?谢谢大家啊
因为我对这方面没有了解,所以希望得到大家的帮助。
这个问题已经找到一些想要的资料,大概的写了一下
在所查找的资料中,大部分人对于IphoneOS所用的保护措施比较赞同。对于Iphone来说,它的硬件和操作系统及部分软件都是苹果公司独自设计与开发的,这样就使得软件保护可以同时从硬件和软件入手。从所周知,软硬件协同保护是最有效的办法。想破解硬件加密是一件很困难的事情,主要原因之一就是可以将安全引擎内置于处理器中,这就意味着,在装有安全引擎的手机处理器上,黑客原本惯用的通过入侵加密信息来盗取资料的手法将完全失效。
大家知道,如果Iphone手机没有经过破解想使用大部分软件必须要付费才可以,这是苹果公司在Iphone出厂的时候已经对手机进行了设置,系统对用户限制了一些功能。从itunes下载的程序是账户绑定的,跟iphone/itouch匹配才能安装。所以,只有破解的Iphone手机才可以随便安装第三方软件,而不用交费。
SDK本身是可以免费下载的,但为了发布软件, 开发人员必须加入iPhone开发者计划,其中有一步需要付款以获得苹果的批准。加入了之后,开发人员们将会得到一个牌照,他们可以用这个牌照将他们编写的软件发布到苹果的 AppStore。 发布软件一共有三种方法: 通过AppStore,通过企业配置仅在企业内部员工间应用,也可通过基于"Ad-hoc"而上载至多达100部iPhones。
这个发布iPhone软件的形式的出现使人们不能根据GPLv3的授权代码发布软件。任何根据GPLv3任何代码的开发者也必须得到GPLv3的授权。同时,开发商在散发布已经由GPLv3授权的应用软件的同时必须提供由苹果公司提供的密匙以允许该软件修改版本的上载。下面详细介绍一下Iphone开发的代码签名。
2.5.1 Iphone数字签名和签名标识
代码签名确保代码的真实以及明确识别代码的来源。在代码运行在一个开发系统以前,以及在代码提交到苹果发布以前,苹果要求所有的的应用程序都必须进行数字签名。另外,苹果在发布每一个应用程序之前都要添加他自己的数字签名。
2.5.1.1 为什么要有代码数字签名
苹果要求所有的iphone应用程序都需要使用苹果提供给已注册的iphone开发者的签名许可进行数字签名。这个签名证明了该应用程序开发者的身份以及确保这个应用程序在签名以后没有被修改或者篡改过。
数字签名使用两种截然不同的方式,即:众所周的公有密钥和私有密钥的算数关系加密术。私有密钥使用在签名的过程中。公有密钥用来验证这个签名的有效性。公有签名被存储在签名证书中,而私有签名被单独的存储,这种证书和算数加密结合的私有密钥被叫做数字标识或者签名标识。
为iphone开发获取签名标识,你需要使用Keychain Access utility里边的CertificateAssistant来创建一个签名许可请求Certificate Signing Request(CSR),你提交这个请求是希望得到使用iphone开发者计划的计划入口的正式许可。当你的请求被正式批准以后,下载这个证书文件,双击这个文件,就可以将其安装到你的keychain(密钥链中),在你使用CertificateAssistant utility生成一个签名许可请求Certificate Signing Request(CSR)的过程中,这些你可能看得不太明显,因为它自动生成了一对共有-私有密钥。它包括发送给苹果的许可请求中的公有密钥(publickey)和存储在你的密钥链(keychain)中的私有密钥(private key)。
当你下载安装签名许可的时候, Keychain Access utility将其与私有密钥关联,以创建签名标识。打开 KeychainAccess utility 点击 Category面板下的My Certificates 以察看许可的关联私有密钥。
当你安装了已签名的应用程序到你的iphone上去的时候,iphone OS将要验证签名以确保该应用程序已签名并在签名以后未被篡改。如果签名无效或者你根本就没有签名,iphone OS将不允许该应用程序运行。
同样,当你提交你的应用程序给苹果审批和部署的时候,首先,你必须用你的签名标识为你的应用程序签名,同时随程序一起提交你的签名证书。(私有密钥不用提交至苹果。)然后苹果验证该程序代码是否来自有效的已注册的开发者。 最后苹果用她自己的签名证书为你的已签名的应用程序签名。然后你的应用程序才能够在iPhone ,iPodTouch上正常的运行。这种机制确保这些设备的拥有者从iTunes上边下载的那些已注册的开发者所编写的应用程序的安全性,并且这些应用程序没有被修改过。
2.5.1.1怎样将Iphone签名标识复制到其他机器
如果你用来开发的机器不只一台(例如,办公电脑和你的家用笔记本电脑),你需要在两台上边都有你的签名标识。因为你从程序门户网站(ProgramPortal)上边下载的签名许可文件不包括你的私有密钥,仅仅将这个签名许可文件复制到你的另一台电脑上是不够的。你需要使用Keychain Access 导出一个个人信息替换文件( Personal Information Exchange),具体操作步骤如下 打开 Keychain Access,选择 文件,导出项,(KeychainAccess-> File-> Export Items)导出许可和私有密钥作为你的个人信息替换文件,将其复制到另一台机器上,双击这个文件将许可和密钥导入到keychain下即可
2.5.1.2保持Iphone私有密钥安全有效
只要你持有签名标识,尤其是你的私有密钥,这个系统将是非常安全的。然而如果有任何未经授权的人使用了你的签名许可和私有密钥,他们可以修改你的应用程序并且可以为这些修改代码申请签名,或者他们也可以以你的身份写他们自己的应用程序。因此你的私有密钥的自身安全是防止你的软件和标识被恶意使用的最基本的手段。
在你获取签名标识和处理代码签名之前,你必须要确定你公司内谁将拥有这个标识,谁使用这个标识,以及如何保证这个标识的安全性。例如,如果这个标识一定是多人使用,你可以将其放置在一台比较安全的电脑的keychain中,并且为keychain分配一个核实用户身份用的密码,或者你也可以将这个密钥放置在一个用户有PIN码的smart卡中。
默认情况下,你的Keychain密码和你的机器登陆密码是相同的,并且只要你登陆到你的机器当中,keychain将保持解锁状态。这就等同于你将你的车钥匙放在了后门旁边的桌子上,并且后门整天都不上锁。如果只有钥匙能开你的车的话,你没有有效的保护你的车钥匙,怎么能保证你的车的安全呢?
为了保证签名标识的安全,以及其他一些keychain下的有价值的秘密信息的安全性,你至少应该采取如下措施:
设置你的keychain在不使用的情况下自动加锁:在 Keychain Accessutility下,选择Edit-> Change Settings for Keychain并且勾选多选框(前两项就可以了)。
为你的Keychain使用一个不同于登陆密码的密码: 在 Keychain Accessutility下,选择Edit-> Change Password 来改变 Keychain的密码。在改变密码对话框中勾选加锁图标来获取密码助手。要确保记住你修改后的密码,并且不要随便写下你的密码。另外,钥保证你的电脑的物理安全,防止未授权的人员使用你的电脑。
像其他重要的数据一样,你最好将签名标识备份到一个安全的地方。你可以将其放到其他机器的keychain中,或者以个人信息替换文件(Personal Information Exchange (.p12) file)的方式存到一张加密的CD或者加密的硬盘镜像中。确认你所使用的密码都是健壮的,并且拥有签名许可的电脑的物理安全(尽量不要允许未信任的人员使用他们)。(点击查看如何实现Iphone代码签名)
2.5.2 Iphone下的IAP
IAP,英文全称In-App Purchase,是指在iPhone App中出现的“软件内付费内容”。如果你的Iphone没有破解,那么你想使用大部分软件的时候,就必须付费来获取软件的使用权。所以这种方法个人感觉是比较不错的。苹果的这种商业模式是值得我们学习借鉴的。
IAP的特点如下:
IAP使得用户无需离开软件,便可无缝升级软件功能或扩充内容。
IAP支持付费后下载,所以可以有效的防止盗版。
开发者无需额外推出试玩版本游戏,直接在免费版本中加入IAP,允许用户付费升级即可,节约开发成本。
开发者可以无限推出某个App的内容扩展,同时保证持续的收入。
IAP的出现形式多种多样,多见于:打开某功能(如Push);下载新游戏地图;解锁软件中的新内容等等。
IAP购买符合Appstore基本付费策略,玩家一次付款后,可以无限制多次下载IAP内容,不会重复扣费。
购买IAP内容所使用的账户必须和下载软件本体的账户一致。
一 了解并解决代码签名问题
绝大多数iPhone Developer/Distribution 的代码签名生成错误是因为证书和Provisioningprofiles没有在开发系统上正确安装引起的。本文描述在开发 iPhone OS应用程序时所需要的文件以及如何安装它们。这个技术说明为“Program User Guide”提供支持,Program UserGuide 可以在 Portal Resources 下的 iPhone Developer Program ProvisioningPortal 找到。如果你对 iPhone 开发刚入门,请先阅读 Program User Guide.
二 需要什么
所有 iPhone 应用程序在iPhone OS设备上运行之前必须用合法的 signing identity进行签名。
为了在自己的iPhone OS设备开发而做应用程序签名,需要:
私钥
iPhone 开发者证书
Development Provisioning profile
上 App Store 需要:
私钥
iPhone Distribution 证书
App Store Distribution Provisioning profile
要用在 Ad Hoc 上需要:
私钥
iPhone Distribution 证书
Ad Hoc Distribution Provisioning profile
私钥是在生成认证签名请求(CSR)时创建的,在CSR提交和通过之后,可以在 iPhone Developer ProgramProvisioning Portal 里创建和下载证书以及provisioning profiles。
注意:为了更好的区分不同的provisioning profile,在创建的时候注意命名,例如 "wild card devprofile", "MyApp Push distribution profile", “Ad Hoc Testersprofile” 等等。
这些东西的作用
Signing identity 由私有加密key和数字证书组成。在iPhone OS开发中,Xcode用私钥来签署程序,这样程序就可以在iPhone OS开发设备上运行或者提交到app store。
公钥包含 iPhone开发者/发布商证书,用来认证已签名的程序。
Provisioning pfofiles用来告知Xcode用哪个证书/私钥组合来签署程序。开发设备也通过它来决定如何认证安装在设备上的程序。
三 证书 - 安装/校验
下载 iPhone Development 证书或者 iPhone Distribution 证书之后,双击下载的 .cer文件启动 Keychain Access并安装证书。如果询问将证书安装到哪,请选择 "login" keychain。
要确定证书是否正确安装,选择 "login" keychain 并且选择 "My Certificates"类别。如果想要部署到你的开发设备,选择以"iPhone DeveloperCertificate"为标题开头的证书。如果要发布程序,选择以"iPhone DistributionCertificate"标题开头的证书。在 Information view 里应该有一个带选中标志的绿圈告诉你证书合法,意思就是WWDR Intermediate Certificate 已经安装在系统里,并且证书已校验。要是看不见绿圈就应该从 iPhoneDeveloper Program Provisioning Portal 下载 WWDR IntermediateCertificate 并且像安装iPhone Developer 或者 DistributionCertificate那样给它装上。选中的证书旁有个小三角,点击它会显示证书关联的私钥。要是没有,看看你是不是在“MyCertificates”类别下。要对程序进行签名必须需要私钥,要是当前确实在"MyCertificates"下并且还是没有小三角,需要作废旧证书并且创建并提交一个新的CSR来创建新的私钥和证书。
注意:如果创建了新私钥或者证书,关联到旧证书的配置文件就失效了,需要重新生成新pfofiles。最好在拷贝新证书之前把旧的从开发机器和设备上删除掉,这样可避免新旧证书/配置文件混淆。这么做不影响已经在appstore里的程序。
警告:安装 iPhone 证书后不要改动默认的 "Use System Defaults" 信任设置。如果信任设置不是'UseSystem Defaults',在生成应用程序的时候会得到一个 CSSMERR_TP_NOT_TRUSTED 签名错误。
四 Provisioning Profiles - 安装/校验
要把从iPhone Developer Program Provisioning Portal下载回来的ProvisioningProfile安装到开发机器,首先需要启动 Xcode然后点击"Window >Organizer"来打开Organizer。把provisioning profile拖到标记为"ProvisioningProfiles"的区域内即可。
如果是为了开发而安装 Provisioning Profile,还需要把它装在开发设备上。在 iPhone OS设备已经插到电脑上的时候,在 Devices 三角下选择设备,然后在Organizer里把开发provisioningprofile拖进去。这就把 Provisioning profile装到 iPhone OS设备里了。
注意:确保安装在开发设备和Mac里的 DevelopmentProvisioning完全相同对成功生成并安装测试程序是非常重要的。
注意:跟 Development Provisioning Profiles不同,App Store DistributionProvisioning Profiles不能安装在iPhone OS设备里。用App Store DistributionProvisioning生成的程序是用来通过 iTunes Connect上传到App Store的。
要告诉 Xcode 使用哪个 Provisioning profile,打开 Xcode 项目,打开 Target buildsettings,滚动到 Code Signing。在 Code Signing 区域有个带小三角的 Code SigningIdentity。确定设置是为任何 iPhone OS 设备,之后在Value列点击弹出菜单并且选择要使用的 ProvisioningProfile。为了开发,建议选择 "iPhone Developer",要发布,建议选择"iPhoneDistribution"。这些都在弹出菜单的"Auto matic Profile Selector"区域里,这样就可以使Xcode来为你找到正确的Provisioning Profile。
注意:要是丢失了 iPhone devloper/Distribution证书的私钥,就无法选择证书关联到的Provisioning Profile。从备份中导入 iPhone developer/Distribution证书的私钥可以解决这个问题。如果丢了或者删了私钥,就得生成一个新的CSR并且下载新的 iPhoneDeveloper/Distribution 证书和Provisioning Profile。
程序的 Bundle Identifier 必须跟Provisioning profiles的Bundle IdentifierAPP ID匹配。要编辑程序的 Bundle Identifier,打开 target's properties settings,在Identifier 栏输入 Bundle Identifier。如果在 App id的bundleidentifier里使用星号通配符,就可以替换为反向DNS格式的字符。
下面有一些可以输入到 Identifier 框的例子。
如果AppID是A1B2C3D4E5.com.domainname.applicationname。输入com.domainname.applicationname作为 Bundle Identifier
AppID是 A1B2C3D4E5.*,输入反向DNS格式的字符串作为 Bundle Identifier。
五 关于 Profiles 和 App IDs
创建 Provisioning Profiles 时可以关联两种类型的 App ID。第一个类型叫做通用AppID(Wildcard App ID)。推荐大多数iPhone OS开发用通用App ID的ProvisioningProfiles,因为这样单个通用App ID可以用来生成和安装大多数程序,包括 iPhone Reference Libary里的示例代码。通用App ID通过在
Identifier 里输入星号创建。星号必须是AppID字符串的最后一个字符。如果使用通用App ID,记着在Xcode项目里输入BundleIdentifier时把星号替换为反向DNS格式。
假设有 App ID ABCDE12345.*:
ABCDE12345是Bundle种子ID(由Apple生成)
*是App ID的Bundle Identifier。在xcode里输入bundleidentifier时需要把星号替换为反向DNS格式。
假设有 App ID: ABCDE12345.com.yourcompany.*
ABCDE12345是Bundle种子ID(由Apple生成)
com.yourcompany.* 是App ID的Bundle Identifier。并且xcode项目里的bundleidentifier必须以'com.yourcompany.'开头,星号可以替换成任意字串。
第二类 App ID 称作固定AppID(Explicit App ID)。这类 APP ID限定了一个provisioningprofile只允许一个程序安装。启用iPhone OS 3.0特性需要固定 App ID,例如 In App Purchase或者App Push Notification 服务。固定ID通过输入指定字串创建。推荐做法是用反向DNS格式。
重要:一个避免将来可能产生问题的提示:修改 yourcompany 为真正的名字。
六 Ad Hoc
为 Ad Hoc发布生成应用程序跟生成App Store程序类似,只是多了两步。第一,需要用 iPhone DeveloperProgram Provisioning Portal 创建一个 Ad Hoc Distribution provisioningProfile并添加发布目标设备的 UDID。第二,创建一个代码签名Entitlementsfile。关于如何创建Entitlements file请阅读 iPhone 开发者指南的 Managing ApplicationEntitlements部分。创建完 Entitlements file并把它添加到 Code SigningEntitlements build settings之后,打开EntitleMents File并且田间或编辑get-task-allo把它设为false。
在硬件和软件上分别要实现什么技术呢?
有什么可以参考的书或资料吗?谢谢大家啊
因为我对这方面没有了解,所以希望得到大家的帮助。
这个问题已经找到一些想要的资料,大概的写了一下
在所查找的资料中,大部分人对于IphoneOS所用的保护措施比较赞同。对于Iphone来说,它的硬件和操作系统及部分软件都是苹果公司独自设计与开发的,这样就使得软件保护可以同时从硬件和软件入手。从所周知,软硬件协同保护是最有效的办法。想破解硬件加密是一件很困难的事情,主要原因之一就是可以将安全引擎内置于处理器中,这就意味着,在装有安全引擎的手机处理器上,黑客原本惯用的通过入侵加密信息来盗取资料的手法将完全失效。
大家知道,如果Iphone手机没有经过破解想使用大部分软件必须要付费才可以,这是苹果公司在Iphone出厂的时候已经对手机进行了设置,系统对用户限制了一些功能。从itunes下载的程序是账户绑定的,跟iphone/itouch匹配才能安装。所以,只有破解的Iphone手机才可以随便安装第三方软件,而不用交费。
SDK本身是可以免费下载的,但为了发布软件, 开发人员必须加入iPhone开发者计划,其中有一步需要付款以获得苹果的批准。加入了之后,开发人员们将会得到一个牌照,他们可以用这个牌照将他们编写的软件发布到苹果的 AppStore。 发布软件一共有三种方法: 通过AppStore,通过企业配置仅在企业内部员工间应用,也可通过基于"Ad-hoc"而上载至多达100部iPhones。
这个发布iPhone软件的形式的出现使人们不能根据GPLv3的授权代码发布软件。任何根据GPLv3任何代码的开发者也必须得到GPLv3的授权。同时,开发商在散发布已经由GPLv3授权的应用软件的同时必须提供由苹果公司提供的密匙以允许该软件修改版本的上载。下面详细介绍一下Iphone开发的代码签名。
2.5.1 Iphone数字签名和签名标识
代码签名确保代码的真实以及明确识别代码的来源。在代码运行在一个开发系统以前,以及在代码提交到苹果发布以前,苹果要求所有的的应用程序都必须进行数字签名。另外,苹果在发布每一个应用程序之前都要添加他自己的数字签名。
2.5.1.1 为什么要有代码数字签名
苹果要求所有的iphone应用程序都需要使用苹果提供给已注册的iphone开发者的签名许可进行数字签名。这个签名证明了该应用程序开发者的身份以及确保这个应用程序在签名以后没有被修改或者篡改过。
数字签名使用两种截然不同的方式,即:众所周的公有密钥和私有密钥的算数关系加密术。私有密钥使用在签名的过程中。公有密钥用来验证这个签名的有效性。公有签名被存储在签名证书中,而私有签名被单独的存储,这种证书和算数加密结合的私有密钥被叫做数字标识或者签名标识。
为iphone开发获取签名标识,你需要使用Keychain Access utility里边的CertificateAssistant来创建一个签名许可请求Certificate Signing Request(CSR),你提交这个请求是希望得到使用iphone开发者计划的计划入口的正式许可。当你的请求被正式批准以后,下载这个证书文件,双击这个文件,就可以将其安装到你的keychain(密钥链中),在你使用CertificateAssistant utility生成一个签名许可请求Certificate Signing Request(CSR)的过程中,这些你可能看得不太明显,因为它自动生成了一对共有-私有密钥。它包括发送给苹果的许可请求中的公有密钥(publickey)和存储在你的密钥链(keychain)中的私有密钥(private key)。
当你下载安装签名许可的时候, Keychain Access utility将其与私有密钥关联,以创建签名标识。打开 KeychainAccess utility 点击 Category面板下的My Certificates 以察看许可的关联私有密钥。
当你安装了已签名的应用程序到你的iphone上去的时候,iphone OS将要验证签名以确保该应用程序已签名并在签名以后未被篡改。如果签名无效或者你根本就没有签名,iphone OS将不允许该应用程序运行。
同样,当你提交你的应用程序给苹果审批和部署的时候,首先,你必须用你的签名标识为你的应用程序签名,同时随程序一起提交你的签名证书。(私有密钥不用提交至苹果。)然后苹果验证该程序代码是否来自有效的已注册的开发者。 最后苹果用她自己的签名证书为你的已签名的应用程序签名。然后你的应用程序才能够在iPhone ,iPodTouch上正常的运行。这种机制确保这些设备的拥有者从iTunes上边下载的那些已注册的开发者所编写的应用程序的安全性,并且这些应用程序没有被修改过。
2.5.1.1怎样将Iphone签名标识复制到其他机器
如果你用来开发的机器不只一台(例如,办公电脑和你的家用笔记本电脑),你需要在两台上边都有你的签名标识。因为你从程序门户网站(ProgramPortal)上边下载的签名许可文件不包括你的私有密钥,仅仅将这个签名许可文件复制到你的另一台电脑上是不够的。你需要使用Keychain Access 导出一个个人信息替换文件( Personal Information Exchange),具体操作步骤如下 打开 Keychain Access,选择 文件,导出项,(KeychainAccess-> File-> Export Items)导出许可和私有密钥作为你的个人信息替换文件,将其复制到另一台机器上,双击这个文件将许可和密钥导入到keychain下即可
2.5.1.2保持Iphone私有密钥安全有效
只要你持有签名标识,尤其是你的私有密钥,这个系统将是非常安全的。然而如果有任何未经授权的人使用了你的签名许可和私有密钥,他们可以修改你的应用程序并且可以为这些修改代码申请签名,或者他们也可以以你的身份写他们自己的应用程序。因此你的私有密钥的自身安全是防止你的软件和标识被恶意使用的最基本的手段。
在你获取签名标识和处理代码签名之前,你必须要确定你公司内谁将拥有这个标识,谁使用这个标识,以及如何保证这个标识的安全性。例如,如果这个标识一定是多人使用,你可以将其放置在一台比较安全的电脑的keychain中,并且为keychain分配一个核实用户身份用的密码,或者你也可以将这个密钥放置在一个用户有PIN码的smart卡中。
默认情况下,你的Keychain密码和你的机器登陆密码是相同的,并且只要你登陆到你的机器当中,keychain将保持解锁状态。这就等同于你将你的车钥匙放在了后门旁边的桌子上,并且后门整天都不上锁。如果只有钥匙能开你的车的话,你没有有效的保护你的车钥匙,怎么能保证你的车的安全呢?
为了保证签名标识的安全,以及其他一些keychain下的有价值的秘密信息的安全性,你至少应该采取如下措施:
设置你的keychain在不使用的情况下自动加锁:在 Keychain Accessutility下,选择Edit-> Change Settings for Keychain并且勾选多选框(前两项就可以了)。
为你的Keychain使用一个不同于登陆密码的密码: 在 Keychain Accessutility下,选择Edit-> Change Password 来改变 Keychain的密码。在改变密码对话框中勾选加锁图标来获取密码助手。要确保记住你修改后的密码,并且不要随便写下你的密码。另外,钥保证你的电脑的物理安全,防止未授权的人员使用你的电脑。
像其他重要的数据一样,你最好将签名标识备份到一个安全的地方。你可以将其放到其他机器的keychain中,或者以个人信息替换文件(Personal Information Exchange (.p12) file)的方式存到一张加密的CD或者加密的硬盘镜像中。确认你所使用的密码都是健壮的,并且拥有签名许可的电脑的物理安全(尽量不要允许未信任的人员使用他们)。(点击查看如何实现Iphone代码签名)
2.5.2 Iphone下的IAP
IAP,英文全称In-App Purchase,是指在iPhone App中出现的“软件内付费内容”。如果你的Iphone没有破解,那么你想使用大部分软件的时候,就必须付费来获取软件的使用权。所以这种方法个人感觉是比较不错的。苹果的这种商业模式是值得我们学习借鉴的。
IAP的特点如下:
IAP使得用户无需离开软件,便可无缝升级软件功能或扩充内容。
IAP支持付费后下载,所以可以有效的防止盗版。
开发者无需额外推出试玩版本游戏,直接在免费版本中加入IAP,允许用户付费升级即可,节约开发成本。
开发者可以无限推出某个App的内容扩展,同时保证持续的收入。
IAP的出现形式多种多样,多见于:打开某功能(如Push);下载新游戏地图;解锁软件中的新内容等等。
IAP购买符合Appstore基本付费策略,玩家一次付款后,可以无限制多次下载IAP内容,不会重复扣费。
购买IAP内容所使用的账户必须和下载软件本体的账户一致。
一 了解并解决代码签名问题
绝大多数iPhone Developer/Distribution 的代码签名生成错误是因为证书和Provisioningprofiles没有在开发系统上正确安装引起的。本文描述在开发 iPhone OS应用程序时所需要的文件以及如何安装它们。这个技术说明为“Program User Guide”提供支持,Program UserGuide 可以在 Portal Resources 下的 iPhone Developer Program ProvisioningPortal 找到。如果你对 iPhone 开发刚入门,请先阅读 Program User Guide.
二 需要什么
所有 iPhone 应用程序在iPhone OS设备上运行之前必须用合法的 signing identity进行签名。
为了在自己的iPhone OS设备开发而做应用程序签名,需要:
私钥
iPhone 开发者证书
Development Provisioning profile
上 App Store 需要:
私钥
iPhone Distribution 证书
App Store Distribution Provisioning profile
要用在 Ad Hoc 上需要:
私钥
iPhone Distribution 证书
Ad Hoc Distribution Provisioning profile
私钥是在生成认证签名请求(CSR)时创建的,在CSR提交和通过之后,可以在 iPhone Developer ProgramProvisioning Portal 里创建和下载证书以及provisioning profiles。
注意:为了更好的区分不同的provisioning profile,在创建的时候注意命名,例如 "wild card devprofile", "MyApp Push distribution profile", “Ad Hoc Testersprofile” 等等。
这些东西的作用
Signing identity 由私有加密key和数字证书组成。在iPhone OS开发中,Xcode用私钥来签署程序,这样程序就可以在iPhone OS开发设备上运行或者提交到app store。
公钥包含 iPhone开发者/发布商证书,用来认证已签名的程序。
Provisioning pfofiles用来告知Xcode用哪个证书/私钥组合来签署程序。开发设备也通过它来决定如何认证安装在设备上的程序。
三 证书 - 安装/校验
下载 iPhone Development 证书或者 iPhone Distribution 证书之后,双击下载的 .cer文件启动 Keychain Access并安装证书。如果询问将证书安装到哪,请选择 "login" keychain。
要确定证书是否正确安装,选择 "login" keychain 并且选择 "My Certificates"类别。如果想要部署到你的开发设备,选择以"iPhone DeveloperCertificate"为标题开头的证书。如果要发布程序,选择以"iPhone DistributionCertificate"标题开头的证书。在 Information view 里应该有一个带选中标志的绿圈告诉你证书合法,意思就是WWDR Intermediate Certificate 已经安装在系统里,并且证书已校验。要是看不见绿圈就应该从 iPhoneDeveloper Program Provisioning Portal 下载 WWDR IntermediateCertificate 并且像安装iPhone Developer 或者 DistributionCertificate那样给它装上。选中的证书旁有个小三角,点击它会显示证书关联的私钥。要是没有,看看你是不是在“MyCertificates”类别下。要对程序进行签名必须需要私钥,要是当前确实在"MyCertificates"下并且还是没有小三角,需要作废旧证书并且创建并提交一个新的CSR来创建新的私钥和证书。
注意:如果创建了新私钥或者证书,关联到旧证书的配置文件就失效了,需要重新生成新pfofiles。最好在拷贝新证书之前把旧的从开发机器和设备上删除掉,这样可避免新旧证书/配置文件混淆。这么做不影响已经在appstore里的程序。
警告:安装 iPhone 证书后不要改动默认的 "Use System Defaults" 信任设置。如果信任设置不是'UseSystem Defaults',在生成应用程序的时候会得到一个 CSSMERR_TP_NOT_TRUSTED 签名错误。
四 Provisioning Profiles - 安装/校验
要把从iPhone Developer Program Provisioning Portal下载回来的ProvisioningProfile安装到开发机器,首先需要启动 Xcode然后点击"Window >Organizer"来打开Organizer。把provisioning profile拖到标记为"ProvisioningProfiles"的区域内即可。
如果是为了开发而安装 Provisioning Profile,还需要把它装在开发设备上。在 iPhone OS设备已经插到电脑上的时候,在 Devices 三角下选择设备,然后在Organizer里把开发provisioningprofile拖进去。这就把 Provisioning profile装到 iPhone OS设备里了。
注意:确保安装在开发设备和Mac里的 DevelopmentProvisioning完全相同对成功生成并安装测试程序是非常重要的。
注意:跟 Development Provisioning Profiles不同,App Store DistributionProvisioning Profiles不能安装在iPhone OS设备里。用App Store DistributionProvisioning生成的程序是用来通过 iTunes Connect上传到App Store的。
要告诉 Xcode 使用哪个 Provisioning profile,打开 Xcode 项目,打开 Target buildsettings,滚动到 Code Signing。在 Code Signing 区域有个带小三角的 Code SigningIdentity。确定设置是为任何 iPhone OS 设备,之后在Value列点击弹出菜单并且选择要使用的 ProvisioningProfile。为了开发,建议选择 "iPhone Developer",要发布,建议选择"iPhoneDistribution"。这些都在弹出菜单的"Auto matic Profile Selector"区域里,这样就可以使Xcode来为你找到正确的Provisioning Profile。
注意:要是丢失了 iPhone devloper/Distribution证书的私钥,就无法选择证书关联到的Provisioning Profile。从备份中导入 iPhone developer/Distribution证书的私钥可以解决这个问题。如果丢了或者删了私钥,就得生成一个新的CSR并且下载新的 iPhoneDeveloper/Distribution 证书和Provisioning Profile。
程序的 Bundle Identifier 必须跟Provisioning profiles的Bundle IdentifierAPP ID匹配。要编辑程序的 Bundle Identifier,打开 target's properties settings,在Identifier 栏输入 Bundle Identifier。如果在 App id的bundleidentifier里使用星号通配符,就可以替换为反向DNS格式的字符。
下面有一些可以输入到 Identifier 框的例子。
如果AppID是A1B2C3D4E5.com.domainname.applicationname。输入com.domainname.applicationname作为 Bundle Identifier
AppID是 A1B2C3D4E5.*,输入反向DNS格式的字符串作为 Bundle Identifier。
五 关于 Profiles 和 App IDs
创建 Provisioning Profiles 时可以关联两种类型的 App ID。第一个类型叫做通用AppID(Wildcard App ID)。推荐大多数iPhone OS开发用通用App ID的ProvisioningProfiles,因为这样单个通用App ID可以用来生成和安装大多数程序,包括 iPhone Reference Libary里的示例代码。通用App ID通过在
假设有 App ID ABCDE12345.*:
ABCDE12345是Bundle种子ID(由Apple生成)
*是App ID的Bundle Identifier。在xcode里输入bundleidentifier时需要把星号替换为反向DNS格式。
假设有 App ID: ABCDE12345.com.yourcompany.*
ABCDE12345是Bundle种子ID(由Apple生成)
com.yourcompany.* 是App ID的Bundle Identifier。并且xcode项目里的bundleidentifier必须以'com.yourcompany.'开头,星号可以替换成任意字串。
第二类 App ID 称作固定AppID(Explicit App ID)。这类 APP ID限定了一个provisioningprofile只允许一个程序安装。启用iPhone OS 3.0特性需要固定 App ID,例如 In App Purchase或者App Push Notification 服务。固定ID通过输入指定字串创建。推荐做法是用反向DNS格式。
重要:一个避免将来可能产生问题的提示:修改 yourcompany 为真正的名字。
六 Ad Hoc
为 Ad Hoc发布生成应用程序跟生成App Store程序类似,只是多了两步。第一,需要用 iPhone DeveloperProgram Provisioning Portal 创建一个 Ad Hoc Distribution provisioningProfile并添加发布目标设备的 UDID。第二,创建一个代码签名Entitlementsfile。关于如何创建Entitlements file请阅读 iPhone 开发者指南的 Managing ApplicationEntitlements部分。创建完 Entitlements file并把它添加到 Code SigningEntitlements build settings之后,打开EntitleMents File并且田间或编辑get-task-allo把它设为false。