石灰 發表於 2022-9-8 17:03:00

iOS开发各种证书详解

<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5igkm-0-0"><span data-offset-key="bk410-0-0">引言</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6n7ot-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6n7ot-0-0"><span data-offset-key="6n7ot-0-0">关于开发证书配置(Certificates &amp; Identifiers &amp; Provisioning Profiles),相信做iOS开发的同学没少被折腾。对于一个iOS开发小白、半吊子(比如像我自己)抑或老兵,或多或少会有或曾有过以下不详、疑问、疑惑甚至困惑:</span></div>
</div>
<ol class="public-DraftStyleDefault-ol" data-offset-key="7pb5j-0-0">
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="7pb5j-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7pb5j-0-0"><span data-offset-key="7pb5j-0-0">什么是App ID?Explicit/Wildcard App ID有何区别?什么是App Group ID?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="4lrck-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4lrck-0-0"><span data-offset-key="4lrck-0-0">什么是证书(Certificate)?如何申请?有啥用?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="barrd-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="barrd-0-0"><span data-offset-key="barrd-0-0">什么是Key Pair(公钥/私钥)?有啥用?与证书有何关联?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="6du0v-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6du0v-0-0"><span data-offset-key="6du0v-0-0">什么是签名(Signature)?如何签名(CodeSign)?怎样校验(Verify)?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="5nvj9-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5nvj9-0-0"><span data-offset-key="5nvj9-0-0">什么是(Team)Provisioning Profiles?有啥用?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="c1nb3-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c1nb3-0-0"><span data-offset-key="c1nb3-0-0">Xcode如何配置才能使用iOS真机进行开发调试?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="565fb-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="565fb-0-0"><span data-offset-key="565fb-0-0">多台机器如何共享开发者账号或证书?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="cr5n-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="cr5n-0-0"><span data-offset-key="cr5n-0-0">遇到证书配置问题怎么办?</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="5gdvm-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5gdvm-0-0"><span data-offset-key="5gdvm-0-0">Xcode 7免证书调试真机调试</span></div>
</li>
</ol>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="e0rdn-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="e0rdn-0-0"><span data-offset-key="e0rdn-0-0">本文将围绕相关概念做个系统的梳理串烧。 从 Xcode 7 开始支持普通 Apple 账号进行免证书真机调试,详情参考最新官方文档《Launching Your App on Devices》,或参考本文最后一节简介。</span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dnuje-0-0"><span data-offset-key="dnuje-0-0">写在前面</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6pti-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6pti-0-0"><span data-offset-key="6pti-0-0">1.假设你使用过Apple设备(iMac/iPad/iPhone)且 <span data-offset-key="6pti-0-1">注册<span data-offset-key="6pti-0-2">过Apple ID(Apple Account)。 2.假设你或你所在的开发组已加入苹果开发者计划(Enroll in iOS Developer Program to become a <span data-offset-key="6pti-1-0">member</span><span data-offset-key="6pti-2-0">),即已 <span data-offset-key="6pti-2-1">注册<span data-offset-key="6pti-2-2">开发者账号(Apple Developer Account)。</span></span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="5cmjt-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="5cmjt-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5cmjt-0-0"><span data-offset-key="5cmjt-0-0">只有拥有开发者账号,才可以申请开发/发布证书及相关配置授权文件,进而在iOS真机上开发调试Apps或发布到App Store。</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="7uv38-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7uv38-0-0"><span data-offset-key="7uv38-0-0">开发者账号分为Individual和Company/Organization两种类型。如无特别交代,下文基于$99/Year的普通个人开发者(Individual)账号展开。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="dvett-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dvett-0-0"><span data-offset-key="dvett-0-0">3.若要真机调试实践,你必须至少拥有一台装有Mac OS X/Xcode的Mac开发机(iMac or MacBook),其上自带原生的Keychain Access。</span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ffobo-0-0"><span data-offset-key="ffobo-0-0">一.App ID(bundle identifier)</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="c46rb-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c46rb-0-0"><span data-offset-key="c46rb-0-0">App ID即Product ID,用于标识一个或者一组App。 App ID应该和Xcode中的Bundle Identifier是一致(Explicit)的或匹配(Wildcard)的。 App ID字符串通常以 <span data-offset-key="c46rb-0-1">反域名<span data-offset-key="c46rb-0-2">(reverse-domain-name)格式的Company Identifier(Company ID)作为前缀(Prefix/Seed),一般不超过255个ASCII字符。 App ID全名会被追加Application Identifier Prefix(一般为TeamID.),分为两类:</span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="5hmue-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="5hmue-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5hmue-0-0"><span data-offset-key="5hmue-0-0">Explicit App ID:唯一的App ID,用于唯一标识一个应用程序。例如“com.apple.garageband”这个App ID,用于标识Bundle Identifier为“com.apple.garageband”的App。</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="aslji-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="aslji-0-0"><span data-offset-key="aslji-0-0">Wildcard App ID:含有通配符的App ID,用于标识一组应用程序。例如“*”(实际上是Application Identifier Prefix)表示所有应用程序;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”开头(苹果公司)的所有应用程序。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="44mj3-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="44mj3-0-0"><span data-offset-key="44mj3-0-0">用户可在Developer MemberCenter网站上注册(Register)或删除(Delete)已注册的App IDs。 App ID<span data-offset-key="44mj3-0-1">被配置到<span data-offset-key="44mj3-0-2">【XcodeTarget|Info|Bundle Identifier】下;对于Wildcard App ID,只要bundle identifier包含其作为Prefix/Seed即可。</span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ccp4g-0-0"><span data-offset-key="ccp4g-0-0">二.设备(Device)</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="8brfk-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8brfk-0-0"><span data-offset-key="8brfk-0-0">Device就是运行iOS系统用于开发调试App的设备。每台Apple设备使用 <span data-offset-key="8brfk-0-1">UDID<span data-offset-key="8brfk-0-2">来唯一标识。 iOS设备连接Mac后,可通过iTunes-&gt;Summary或者Xcode-&gt;Window-&gt;Devices获取iPhone的UDID(identifier)。 Apple Member Center网站个人账号下的 <span data-offset-key="8brfk-0-3">Devices<span data-offset-key="8brfk-0-4">中包含了注册过的所有可用于开发和测试的设备,普通个人开发账号每年累计最多只能注册 <span data-offset-key="8brfk-0-5">100<span data-offset-key="8brfk-0-6">个设备。</span></span></span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="aciv5-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="aciv5-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="aciv5-0-0"><span data-offset-key="aciv5-0-0">Apps signed by you or your team run only on designated development devices.</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="89ukl-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="89ukl-0-0"><span data-offset-key="89ukl-0-0">Apps run only on the test devices you specify.</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="9pl1p-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9pl1p-0-0"><span data-offset-key="9pl1p-0-0">用户可在网站上注册或启用/禁用(Enable/Disable)已注册的Device。 本文的Devices是指<span data-offset-key="9pl1p-0-1">连接到<span data-offset-key="9pl1p-0-2">Xcode被授权用于开发测试的iOS设备(iPhone/iPad)。</span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="340ta-0-0"><span data-offset-key="340ta-0-0">三.开发证书(Certificates)</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="bif3g-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bif3g-0-0"><span data-offset-key="bif3g-0-0">1.证书的概念<span data-offset-key="bif3g-0-1"> <span data-offset-key="bif3g-0-2">证书<span data-offset-key="bif3g-0-3">是由官发部门开具的证明资格或权力的 <span data-offset-key="bif3g-0-4">证件<span data-offset-key="bif3g-0-5">,它是表明(或帮助断定)事理的一个 <span data-offset-key="bif3g-0-6">凭证<span data-offset-key="bif3g-0-7">。证件或凭证的尾部通常会烙印 <span data-offset-key="bif3g-0-8">公章<span data-offset-key="bif3g-0-9">。 每个中国人一生可能需要70多个证件,含15种身份证明。证件中“必需的”有30到40个。将这些证件按时间顺序铺开,那就是一个天朝子民的一生——持 <span data-offset-key="bif3g-0-10">准生证<span data-offset-key="bif3g-0-11">许可落地,以户籍证明入籍,以身份证认证身份,持结婚证以合法同居,最终以 <span data-offset-key="bif3g-0-12">死亡证<span data-offset-key="bif3g-0-13">明注销。 2.数字证书的概念 <span data-offset-key="bif3g-0-14">数字证书<span data-offset-key="bif3g-0-15">就是互联网通讯中 <span data-offset-key="bif3g-0-16">标志<span data-offset-key="bif3g-0-17">通讯各方 <span data-offset-key="bif3g-0-18">身份信息<span data-offset-key="bif3g-0-19">的一串数字,提供了一种在Internet上验证通信 <span data-offset-key="bif3g-0-20">实体身份<span data-offset-key="bif3g-0-21">的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构—— <span data-offset-key="bif3g-0-22">CA机构<span data-offset-key="bif3g-0-23">,又称为证书授权中心(Certificate Authority)发行的,人们可以在网上用它来识别对方的身份。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="3cg2t-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="3cg2t-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3cg2t-0-0"><span data-offset-key="3cg2t-0-0">数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="94jve-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="94jve-0-0"><span data-offset-key="94jve-0-0">数字证书还有一个重要的特征就是时效性:只在特定的时间段内有效。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="bu862-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bu862-0-0"><span data-offset-key="bu862-0-0">数字证书中的公开密钥(<span data-offset-key="bu862-1-0">公钥</span><span data-offset-key="bu862-2-0">)相当于公章。 某一认证领域内的根证书是CA认证中心给自己颁发的证书,是信任链的<span data-offset-key="bu862-2-1">起始点<span data-offset-key="bu862-2-2">。安装根证书意味着对这个CA认证中心的信任。 为了防止<span data-offset-key="bu862-3-0">GFW</span><span data-offset-key="bu862-4-0">进行中间人攻击(MitM),例如篡改<span data-offset-key="bu862-5-0">github</span><span data-offset-key="bu862-6-0">证书,导致无法访问github网站等问题,可选择不信任<span data-offset-key="bu862-7-0">CNNIC</span><span data-offset-key="bu862-8-0">: </span></span></span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="q7f0-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="q7f0-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="q7f0-0-0"><span data-offset-key="q7f0-0-0">在[钥匙串-系统]中双击<span data-offset-key="q7f0-1-0">CNNIC ROOT</span><span data-offset-key="q7f0-2-0">,在【信任】|【使用此证书时</span></span></div>
</li>
</ul>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="7u38f-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7u38f-0-0"><span data-offset-key="7u38f-0-0"> 在天朝子民的一生中,户籍证明可理解为等效的根证书:有了户籍证明,才能办理身份证;有了上流的身份证,才能办理下游居住证、结婚证、计划生育证、驾驶执照等认证。 3.iOS(开发)证书 iOS证书是用来证明iOS App内容(executable code)的合法性和完整性的<span data-offset-key="7u38f-0-1">数字证书<span data-offset-key="7u38f-0-2">。对于想安装到真机或发布到AppStore的应用程序(App),只有经过<span data-offset-key="7u38f-0-3">签名验证<span data-offset-key="7u38f-0-4">(Signature Validated)才能确保来源可信,并且保证App内容是完整、未经篡改的。 iOS证书分为两类:Development和Production(Distribution)。</span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="3sta5-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="3sta5-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3sta5-0-0"><span data-offset-key="3sta5-0-0">Development证书用来开发和调试应用程序:A <span data-offset-key="3sta5-0-1">development certificate<span data-offset-key="3sta5-0-2"> identifies you, as a team member, in a development provisioning profile that allows apps signed by you to <span data-offset-key="3sta5-0-3">launch <span data-offset-key="3sta5-0-4">on devices.</span></span></span></span></span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="8qdpb-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8qdpb-0-0"><span data-offset-key="8qdpb-0-0">Production主要用来分发应用程序(根据证书种类有不同作用):A <span data-offset-key="8qdpb-0-1">distribution certificate<span data-offset-key="8qdpb-0-2"> identifies your team or organization in a distribution provisioning profile and allows you to <span data-offset-key="8qdpb-0-3">submit <span data-offset-key="8qdpb-0-4">your app to the store. Only a team agent or an admin can create a distribution certificate.</span></span></span></span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="all54-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="all54-0-0"><span data-offset-key="all54-0-0">普通个人开发账号最多可注册iOS Development/Distribution证书各2个,用户可在网站上删除(Revoke)已注册的Certificate。 下文主要针对iOS App开发调试过程中的开发证书(Certificate for Development)。 <span data-offset-key="all54-0-1">4.iOS(开发)证书的根证书<span data-offset-key="all54-0-2"> 那么,iOS开发证书是谁颁发的呢?或者说我们是从哪个CA申请到用于Xcode开发调试App的证书呢? iOS以及Mac OS X系统(在安装Xcode时)将自动安装<span data-offset-key="all54-1-0">AppleWWDRCA.cer</span><span data-offset-key="all54-2-0">这个中间证书(<span data-offset-key="all54-2-1">Intermediate Certificates),<span data-offset-key="all54-2-2">它实际上就是iOS(开发)证书的证书,即<span data-offset-key="all54-2-3">根证书<span data-offset-key="all54-2-4">(Apple Root Certificate)。 AppleWWDRCA(Apple Root CA)类似注册管理户籍的公安机关户政管理机构,AppleWWDRCA.cer之于iOS(开发)证书则好比户籍证之于身份证。 如果Mac Keychain Access证书助理在申请证书时尚未安装过该证书,请先下载安装(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)</span></span></span></span></span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="hbat-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="hbat-0-0"><span data-offset-key="hbat-0-0"> <span data-offset-key="hbat-0-1">5.<span data-offset-key="hbat-0-2">申请证书(CSR:Certificate Signing Request) 可以在缺少证书时通过Xcode Fix Issue自动请求证书,这里通过Keychain<span data-offset-key="hbat-0-3">证书助理<span data-offset-key="hbat-0-4">从证书颁发机构请求证书:填写开发账号邮件和常用名称,勾选【存储到磁盘】。</span></span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="41v3s-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="41v3s-0-0"><span data-offset-key="41v3s-0-0"> keychain将生成一个包含开发者身份信息的<span data-offset-key="41v3s-0-1">CSR<span data-offset-key="41v3s-0-2">(Certificate Signing Request)文件;同时,Keychain Access|Keys中将新增一对Public/Private <span data-offset-key="41v3s-0-3">Key Pair<span data-offset-key="41v3s-0-4">(This signing identity consists of a public-private key pair that Apple issues)。</span></span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="rrv4-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="rrv4-0-0"><span data-offset-key="rrv4-0-0"> <span data-offset-key="rrv4-0-1">private key<span data-offset-key="rrv4-0-2">始终保存在Mac OS的Keychain Access中,用于签名(CodeSign)对外发布的App;<span data-offset-key="rrv4-0-3">public key<span data-offset-key="rrv4-0-4">一般随证书(随Provisioning Profile,随App)散布出去,对App签名进行校验认证。用户必须保护好本地Keychain中的private key,以防伪冒。</span></span></span></span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="t3l8-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="t3l8-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="t3l8-0-0"><span data-offset-key="t3l8-0-0">Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an <span data-offset-key="t3l8-0-1">entirely new<span data-offset-key="t3l8-0-2"> identity to sign code.</span></span></span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="8mnt1-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8mnt1-0-0"><span data-offset-key="8mnt1-0-0">Worse, if someone else has your private key, that person may be able to <span data-offset-key="8mnt1-0-1">impersonate <span data-offset-key="8mnt1-0-2">you.</span></span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="bepdu-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bepdu-0-0"><span data-offset-key="bepdu-0-0">在Apple开发网站上传该CSR文件来添加证书(Upload CSR file to generate your certificate)</span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="avec8-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="avec8-0-0"><span data-offset-key="avec8-0-0"> Apple证书颁发机构WWDRCA<span data-offset-key="avec8-1-0">(Apple Worldwide Developer Relations Certification Authority)</span><span data-offset-key="avec8-2-0">将使用private key对CSR中的public key和一些身份信息进行加密签名生成<span data-offset-key="avec8-2-1">数字证书<span data-offset-key="avec8-2-2">(ios_development.cer)并记录在案(Apple Member Center)</span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="458vh-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="458vh-0-0"><span data-offset-key="458vh-0-0"> 从Apple Member Center网站下载证书到Mac上双击即可安装(当然也可在Xcode中添加开发账号自动同步证书和[生成]配置文件)。证书安装成功后,在KeychainAccess|Keys中展开创建CSR时生成的Key Pair中的<span data-offset-key="458vh-1-0">私钥</span><span data-offset-key="458vh-2-0">前面的箭头,可以查看到包含其对应公钥的证书(Your requested certificate will be the public half of the key pair.);在Keychain Access|Certificates中展开安装的证书(ios_development.cer)前面的箭头,可以看到其对应的私钥。</span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="d0q4b-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d0q4b-0-0"><span data-offset-key="d0q4b-0-0"> Certificate<span data-offset-key="d0q4b-0-1">被配置到<span data-offset-key="d0q4b-0-2">【Xcode Target|Build Settings|Code Signing|Code Signing Identity】下,下拉选择Identities from Profile "..."(一般先配置Provisioning Profile)。以下是Xcode配置示例:</span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="hmib-0-0"><span data-offset-key="hmib-0-0">四.供应配置文件(<span data-offset-key="hmib-1-0">Provisioning Profiles</span><span data-offset-key="hmib-2-0">)</span></span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="7h65k-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7h65k-0-0"><span data-offset-key="7h65k-0-0">1.Provisioning Profile的概念 Provisioning Profile文件包含了上述的所有内容: <span data-offset-key="7h65k-0-1">证书、App ID和设备<span data-offset-key="7h65k-0-2">。</span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6jk87-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6jk87-0-0"><span data-offset-key="6jk87-0-0"> 一个Provisioning Profile对应一个Explicit App ID或Wildcard App ID(一组相同Prefix/Seed的App IDs)。在网站上手动创建一个Provisioning Profile时,需要依次指定App ID(单选)、证书(Certificates,可多选)和设备(Devices,可多选)。用户可在网站上删除(Delete)已注册的Provisioning Profiles。 Provisioning Profile决定Xcode用哪个证书(公钥)/私钥组合(Key Pair/Signing Identity)来签署应用程序(Signing Product),将在应用程序打包时嵌入到.ipa包里。安装应用程序时,Provisioning Profile文件被拷贝到iOS设备中,运行该iOS App的设备也通过它来认证安装的程序。 如果要打包或者在真机上运行一个APP,一般要经历以下三步:</span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="2p9ql-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="2p9ql-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="2p9ql-0-0"><span data-offset-key="2p9ql-0-0">首先,需要指明它的App ID,并且验证Bundle ID是否与其一致;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="9fg3l-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9fg3l-0-0"><span data-offset-key="9fg3l-0-0">其次,需要证书对应的私钥来进行签名,用于标识这个APP是合法、安全、完整的;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="f7r7-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f7r7-0-0"><span data-offset-key="f7r7-0-0">然后,如果是真机调试,需要确认这台设备是否授权运行该APP。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6cf8l-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6cf8l-0-0"><span data-offset-key="6cf8l-0-0">Provisioning Profile把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用。这样,只要在不同的情况下选择不同的Provisioning Profile文件就可以了。 Provisioning Profile也分为Development和Distribution两类,有效期同Certificate一样。Distribution版本的ProvisioningProfile主要用于提交App Store审核,其中不指定开发测试的Devices(0,unlimited)。App ID为Wildcard App ID(*)。App Store审核通过上架后,允许所有iOS设备(Deployment Target)上安装运行该App。 Xcode将全部供应配置文件(包括用户手动下载安装的和Xcode自动创建的Team Provisioning Profile)放在目录<span data-offset-key="6cf8l-1-0">~/Library/MobileDevice/Provisioning Profiles</span><span data-offset-key="6cf8l-2-0">下。 2.Provisioning Profile的构成 以下为典型供应配置文件*.mobileprovision的<span data-offset-key="6cf8l-2-1">构成简析<span data-offset-key="6cf8l-2-2">:</span></span></span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="52dl2-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="52dl2-0-0"><span data-offset-key="52dl2-0-0">(1) <span data-offset-key="52dl2-0-1">Name<span data-offset-key="52dl2-0-2">:该mobileprovision的文件名。 (2) <span data-offset-key="52dl2-0-3">UUID<span data-offset-key="52dl2-0-4">:该mobileprovision文件的真实文件名。 (3) <span data-offset-key="52dl2-0-5">TeamName<span data-offset-key="52dl2-0-6">:Apple ID账号名。 (4) <span data-offset-key="52dl2-0-7">TeamIdentifier<span data-offset-key="52dl2-0-8">:Team Identity。 (5) <span data-offset-key="52dl2-0-9">AppIDName<span data-offset-key="52dl2-0-10">:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。 (6) <span data-offset-key="52dl2-0-11">ApplicationIdentifierPrefix<span data-offset-key="52dl2-0-12">:完整App ID的前缀(TeamIdentifier.*)。 (7) <span data-offset-key="52dl2-0-13">DeveloperCertificates<span data-offset-key="52dl2-0-14">:包含了可以为使用该配置文件应用签名的所有证书&lt;data&gt;&lt;array&gt;。 证书是基于Base64编码,符合PEM(PrivacyEnhanced Mail, RFC 1848)格式的,可使用OpenSSL来处理(opensslx509 -text -in file.pem)。 从DeveloperCertificates提取&lt;data&gt;&lt;/data&gt;之间的内容到文件cert.cer(cert.perm): -----BEGIN CERTIFICATE----- 将&lt;data&gt;&lt;/data&gt;之间的内容拷贝至此 -----END CERTIFICATE-----` Mac下右键QuickLook查看cert.cer(cert.perm),在Keychain Access中右键Get Info查看对应证书ios_development.cer,正常情况(公私钥KeyPair配对)应吻合;Windows下没有足够信息(WWDRCA.cer),无法验证该证书。 如果你用了一个不在这个列表中的证书进行签名,无论这个证书是否有效,这个应用都将CodeSign Fail。 (8) <span data-offset-key="52dl2-0-15">Entitlements<span data-offset-key="52dl2-0-16">键&lt;key&gt;对应的&lt;dict&gt;: <span data-offset-key="52dl2-0-17">keychain-access-groups<span data-offset-key="52dl2-0-18">:$(AppIdentifierPrefix),参见 <span data-offset-key="52dl2-0-19">Code Signing Entitlements<span data-offset-key="52dl2-0-20">(*.entitlements)。 每个应用程序都有一个可以用于安全保存一些如密码、认证等信息的 <span data-offset-key="52dl2-1-0">keychain</span><span data-offset-key="52dl2-2-0">,一般而言自己的程序只能访问自己的keychain。通过对应用签名时的一些设置,还可以利用keychain的方式实现同一开发者签证(就是相同bundle seed)下的不同应用之间共享信息的操作。比如你有一个开发者帐户,并开发了两个不同的应用A和B,然后通过对A和B的keychain access group这个东西指定共用的访问分组,就可以实现共享此keychain中的内容。 <span data-offset-key="52dl2-2-1">application-identifier<span data-offset-key="52dl2-2-2">:带前缀的全名,例如$(AppIdentifierPrefix)com.apple.garageband。 <span data-offset-key="52dl2-2-3">com.apple.security.application-groups<span data-offset-key="52dl2-2-4">:App Group ID(group. com.apple),参见 <span data-offset-key="52dl2-2-5">Code Signing Entitlements<span data-offset-key="52dl2-2-6">(*.entitlements)。 <span data-offset-key="52dl2-2-7">com.apple.developer.team-identifier<span data-offset-key="52dl2-2-8">:同Team Identifier。 (9) <span data-offset-key="52dl2-2-9">ProvisionedDevices<span data-offset-key="52dl2-2-10">:该mobileprovision授权的开发设备的UDID &lt;array&gt;。 Provisioning Profile <span data-offset-key="52dl2-2-11">被配置到<span data-offset-key="52dl2-2-12">【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下,然后在Code Signing Identity下拉可选择Identities from Profile "..."(即Provisioning Profile中包含的Certificates)。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1beg-0-0"><span data-offset-key="1beg-0-0">五.开发组供应配置文件(<span data-offset-key="1beg-1-0">Team Provisioning Profiles</span><span data-offset-key="1beg-2-0">)</span></span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6qfoc-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6qfoc-0-0"><span data-offset-key="6qfoc-0-0">1.Team Provisioning Profile的概念 每个Apple开发者账号都对应一个唯一的 <span data-offset-key="6qfoc-0-1">Team ID,<span data-offset-key="6qfoc-0-2">Xcode3.2.3预发布版本中加入了Team Provisioning Profile这项新功能。 在Xcode中添加Apple Developer Account时,它将与Apple Member Center后台勾兑 <span data-offset-key="6qfoc-0-3">自动生成<span data-offset-key="6qfoc-0-4">iOS Team Provisioning Profile(Managed by Xcode)。</span></span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="1b360-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1b360-0-0"><span data-offset-key="1b360-0-0"> Team Provisioning Profile包含一个为Xcode iOS Wildcard App ID(*)生成的iOS Team Provisioning Profile:*(匹配所有应用程序),账户里所有的Development Certificates和Devices都可以使用它在这个team注册的所有设备上调试所有的应用程序(不管bundle identifier是什么)。同时,它还会为开发者自己创建的Wildcard/Explicit App IDs创建对应的iOS Team Provisioning Profile。</span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="cce1s-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="cce1s-0-0"><span data-offset-key="cce1s-0-0"> 2.Team Provisioning Profile生成/更新时机</span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="3gkjg-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="3gkjg-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3gkjg-0-0"><span data-offset-key="3gkjg-0-0">Add an Apple ID account to Xcode</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="9jfb8-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9jfb8-0-0"><span data-offset-key="9jfb8-0-0">Fix issue "No Provisioning Profiles with a valid signing identity" in Xcode</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="62s3s-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="62s3s-0-0"><span data-offset-key="62s3s-0-0">Assign Your App to a Team in Xcode project settings of General|Identity</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="bhthk-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="bhthk-0-0"><span data-offset-key="bhthk-0-0">Register new device on the apple development website or Xcode detected new device connected</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="cg0vu-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="cg0vu-0-0"><span data-offset-key="cg0vu-0-0">利用Xcode生成和管理的iOS Team Provisioning Profile来进行开发非常方便,可以不需要上网站手动生成下载Provisioning Profile。 Team Provisioning Profile同Provisioning Profile,只不过是由Xcode自动生成的,也<span data-offset-key="cg0vu-0-1">被配置到<span data-offset-key="cg0vu-0-2">【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。</span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="br37h-0-0"><span data-offset-key="br37h-0-0">六.App Group (ID)</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="4shj6-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4shj6-0-0"><span data-offset-key="4shj6-0-0">1.App Group的概念 WWDC14除了发布了OS X v10.10和switf外,iOS 8.0也开始变得更加开放了。说到开放,当然要数应用扩展( <span data-offset-key="4shj6-1-0">App Extension</span><span data-offset-key="4shj6-2-0">)了。顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享。可以将扩展理解为一个轻量级(nimble and lightweight)的分身。 扩展和其Containing App各自拥有自己的沙盒,虽然扩展以插件形式内嵌在Containing App中,但是它们是独立的二进制包,不可以互访彼此的沙盒。为了实现Containing App与扩展的数据共享,苹果在iOS 8中引入了一个新的概念——App Group,它主要用于同一Group下的APP实现数据共享,具体来说是通过以App Group ID标识的共享资源区——App Group Container。 App Group ID同App ID一样,一般不超过255个ASCII字符。用户可在网站上编辑Explicit App IDs的App Group Assignment;可以删除(Delete)已注册的AppGroup (ID)。 2.App Group的配置 Containing App与Extension的Explicit App ID必须Assign到同一App Group下才能实现数据共享,并且Containing App与Extension的App ID命名必须符合规范:</span></span></div>
</div>
<ol class="public-DraftStyleDefault-ol" data-offset-key="c4h3k-0-0">
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="c4h3k-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c4h3k-0-0"><span data-offset-key="c4h3k-0-0">置于同一App Group下的App IDs必须是唯一的(Explicit,not Wildcard)</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="d2fkq-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d2fkq-0-0"><span data-offset-key="d2fkq-0-0">Extension App ID以Containing App ID为Prefix/Seed</span></div>
</li>
</ol>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="6g3nk-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6g3nk-0-0"><span data-offset-key="6g3nk-0-0">假如Garageband这个App ID为“com.apple.garageband”,则支持从语音备忘录导入到Garageband应用的插件的App ID可能形如“com.apple.garageband.<span data-offset-key="6g3nk-0-1">extImportRecording<span data-offset-key="6g3nk-0-2">”。 <span data-offset-key="6g3nk-0-3">App(ex)<span data-offset-key="6g3nk-0-4"> <span data-offset-key="6g3nk-0-5">App Group IDProvisioning ProfileCode Signing Identity<span data-offset-key="6g3nk-0-6"> (Certificate Key Pair)<span data-offset-key="6g3nk-0-7">App ID<span data-offset-key="6g3nk-0-8"> (bundle identifier)<span data-offset-key="6g3nk-0-9">Devices<span data-offset-key="6g3nk-0-10"> (test)<span data-offset-key="6g3nk-0-11">GarageBand<span data-offset-key="6g3nk-0-12">置于同一分组: group.com.apple(1)共用同一证书:ios_development.cer (2)共用证书Key Pair中的Private Key进行CodeSigncom.apple.garageband<span data-offset-key="6g3nk-0-13">授权开发测试设备的UDIDs<span data-offset-key="6g3nk-0-14">GarageBand扩展插件<span data-offset-key="6g3nk-0-15">com.apple.garageband.<span data-offset-key="6g3nk-0-16">extImportRecording<span data-offset-key="6g3nk-0-17"> 关于Provisioning Profile,可以使用自己手动生成的,也可以使用Xcode自动生成的Team Provisioning Profile。 App Group会<span data-offset-key="6g3nk-0-18">被配置到<span data-offset-key="6g3nk-0-19">【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的键com.apple.security.application-groups下,不影响Provisioning Profile生成流程。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dp2e2-0-0"><span data-offset-key="dp2e2-0-0">七.<span data-offset-key="dp2e2-1-0">证书与签名</span><span data-offset-key="dp2e2-2-0">(Certificate&amp; Signature)</span></span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="4pof5-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4pof5-0-0"><span data-offset-key="4pof5-0-0">1.Code Signing Identity</span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu">
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="8t0dj-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8t0dj-0-0"><span data-offset-key="8t0dj-0-0"> Xcode中配置的Code Signing Identity(entitlements、certificate)必须与Provisioning Profile匹配,并且配置的Certificate必须在本机Keychain Access中存在对应Public/Private Key Pair,否则编译会报错。 Xcode所在的Mac设备(系统)使用CA证书(WWDRCA.cer)来判断Code Signing Identity中Certificate的合法性:</span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="5hs2f-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="5hs2f-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5hs2f-0-0"><span data-offset-key="5hs2f-0-0">若用WWDRCA公钥能成功解密出证书并得到公钥(Public Key)和内容摘要(Signature),证明此证书确乃AppleWWDRCA发布,即证书来源可信;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="b339-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="b339-0-0"><span data-offset-key="b339-0-0">再对证书本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此证书未被篡改过,即证书完整。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="adfrf-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="adfrf-0-0"><span data-offset-key="adfrf-0-0">2.Code Signing 每个证书(其实是公钥)对应Key Pair中的<span data-offset-key="adfrf-0-1">私钥<span data-offset-key="adfrf-0-2">会被用来对内容(executable code,resources such as images and nib files aren’t signed)进行数字<span data-offset-key="adfrf-0-3">签名<span data-offset-key="adfrf-0-4">(CodeSign)——使用哈希算法生成内容<span data-offset-key="adfrf-0-5">摘要<span data-offset-key="adfrf-0-6">(digest)。 Xcode使用指定证书配套的私钥进行签名时需要授权,选择【始终允许】后,以后使用该私钥进行签名便不会再弹出授权确认窗口。</span></span></span></span></span></span></span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div>
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">​</div>
</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="ev694-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ev694-0-0"><span data-offset-key="ev694-0-0"> 3.Verify Code Signature with Certificate 上面已经提到,公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。 第一步,App在Mac/iOS真机上启动时,需要对配置的bundle ID、entitlements和certificate与Provisioning Profile进行匹配校验: </span></div>
</div>
<div class="Image-captionContainer" data-size="normal">
<div class="Image-resizerContainer css-ym3v7r" data-size="normal">
<div class="ImageDelete-Container css-xi606m">
<div class="ImageDelete-Wrapper css-1gomreu"><br>
<div class="css-s0x03z">&nbsp;</div>
</div>
</div>
</div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="2bftq-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="2bftq-0-0"><span data-offset-key="2bftq-0-0"> 第二步,iOS/Mac真机上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校验合法后,获取每个开发证书中可信任的公钥对App的可靠性和完整性进行校验。 <span data-offset-key="2bftq-0-1">iOS/Mac设备(系统)使用App Provisioning Profile(Code Signing Identity)中的开发证书来判断App的合法性:</span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="9fd9s-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="9fd9s-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9fd9s-0-0"><span data-offset-key="9fd9s-0-0">若用证书公钥能成功解密出App(executable code)的内容摘要(Signature),证明此App确乃认证开发者发布,即来源可信;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="42fjh-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="42fjh-0-0"><span data-offset-key="42fjh-0-0">再对App(executable code)本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此App(executable code)未被篡改过,即内容完整。</span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="40q6j-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="40q6j-0-0"><span data-offset-key="40q6j-0-0">小结:</span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="a3bfv-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="a3bfv-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a3bfv-0-0"><span data-offset-key="a3bfv-0-0">基于Provisioning Profile校验了CodeSign的一致性;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="aq792-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="aq792-0-0"><span data-offset-key="aq792-0-0">基于Certificate校验App的可靠性和完整性;</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="1kb9m-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1kb9m-0-0"><span data-offset-key="1kb9m-0-0">启动时,真机的device ID(UUID)必须在Provisioning Profile的<span data-offset-key="1kb9m-0-1">ProvisionedDevices<span data-offset-key="1kb9m-0-2">授权之列。</span></span></span></div>
</li>
</ul>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dh1hg-0-0"><span data-offset-key="dh1hg-0-0">八.在多台机器上共享开发账户/证书</span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="d78n-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d78n-0-0"><span data-offset-key="d78n-0-0">1.Xcode导出开发者账号(*.developerprofile)或 <span data-offset-key="d78n-1-0">PKCS12文件(*.p12)</span><span data-offset-key="d78n-2-0"> 进入Xcode Preferences|Accounts:</span></span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="1q0tj-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="1q0tj-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1q0tj-0-0"><span data-offset-key="1q0tj-0-0">选中Apple IDs列表中对应Account的的Email,点击+-之后的☸|Export Accounts,可导出包含account/code signing identity/provisioning profiles信息的*.<span data-offset-key="1q0tj-0-1">developerprofile<span data-offset-key="1q0tj-0-2">(Exporting a Developer Profile)文件供其他机器上的Xcode开发使用(Import该Account)。</span></span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="endt5-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="endt5-0-0"><span data-offset-key="endt5-0-0">选中右下列表中某行Account Name条目|ViewDetails,可以查看Signing Identities和Provisioning Profiles。 </span></div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="2qbf-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="2qbf-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="2qbf-0-0"><span data-offset-key="2qbf-0-0">选中欲导出的Signing Identity条目,点击栏底+之后的☸|Export,必须输入密码,并需授权export key "privateKey" from keychain,将导出<span data-offset-key="2qbf-0-1">Certificates.<span data-offset-key="2qbf-1-0">p12</span><span data-offset-key="2qbf-2-0">。</span></span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="dsoe4-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dsoe4-0-0"><span data-offset-key="dsoe4-0-0">点击左下角的刷新按钮可从Member Center同步该账号下所有的Provisioning Profile到本地。 选中右击列表中某个Provisioning Profile可以【Show in Finder】到[~/Library/MobileDevice/Provisioning\ Profiles]目录,其中Provisioning Profile的真实名称为$(UUID).mobileprovision,名如"2488109f-ff65-442e-9774-fd50bd6bc827.mobileprovision",其中&lt;key&gt;Name&lt;/key&gt;中为Xcode中看到的描述性别名。 2.Keychain Access导出<span data-offset-key="dsoe4-1-0">PKCS12</span><span data-offset-key="dsoe4-2-0">文件(*.<span data-offset-key="dsoe4-3-0">p12</span><span data-offset-key="dsoe4-4-0">) <span data-offset-key="dsoe4-4-1">在Keychain Access|Certificates中选中欲导出的certificate或其下private key,右键Export或者通过菜单File|Export Items导出Certificates.<span data-offset-key="dsoe4-5-0">p12</span><span data-offset-key="dsoe4-6-0">——PKCS12 file holds the<span data-offset-key="dsoe4-6-1"> <span data-offset-key="dsoe4-6-2">private key<span data-offset-key="dsoe4-6-3"> <span data-offset-key="dsoe4-6-4">and certificate。<span data-offset-key="dsoe4-6-5"> 其他Mac机器上双击Certificates.p12(如有密码需输入密码)即可安装该共享证书。有了共享证书之后,在开发者网站上将欲调试的iOS设备注册到该开发者账号名下,并下载对应证书授权了iOS调试设备的Provisioning Profile文件,方可在iOS真机设备上开发调试。</span></span></span></span></span></span></span></span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d96s8-0-0"><span data-offset-key="d96s8-0-0">九.<span data-offset-key="d96s8-1-0">证书配置常见错误</span></span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="4s8i2-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4s8i2-0-0"><span data-offset-key="4s8i2-0-0">1.no such provisioning profile was found Xcode Target|Genera|Identity Team下提示"Your build settings specify a provisioning profile with the UUID "xxx",howerver, no such provisioning profile was found." Xcode Target|BuildSettings|Code Signing|当前配置的指定UDID的provisioning profile在本地不存在,此时需要更改Provisioning Profile。必要时手动去网站下载或重新生成Provisioning Profile或直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)! 2.No identities from profile Build Settings|CodeSigning的Provisioning Profile中选择了本地安装的provisioning profile之后,Code Signing Identity中下拉提示 <span data-offset-key="4s8i2-1-0">No identities from profile “…”</span><span data-offset-key="4s8i2-2-0">or No identities from keychain. Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在( <span data-offset-key="4s8i2-3-0">No identities are available</span><span data-offset-key="4s8i2-4-0">)或不一致(KeyPair中的Private Key丢失),此时需去网站检查ProvisioningProfile中的App ID-Certificate-Device配置是否正确。如果是别人提供的共享账号(*.developerprofile)或共享证书(*.p12),请确保导出了对应Key Pair中的Private Key。必要时也直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)。 3.Code Signing Entitlements file do not match profile " <span data-offset-key="4s8i2-5-0">Invalid application-identifier Entitlement</span><span data-offset-key="4s8i2-6-0">" or "Code Signing Entitlements file do not match those specified in your provisioning profile.(0xE8008016)." <span data-offset-key="4s8i2-6-1">(1)<span data-offset-key="4s8i2-6-2">检查对应版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”键值是否与ProvisioningProfile中的Entitlements项相吻合(后者一般为前者的Prefix/Seed)。 <span data-offset-key="4s8i2-6-3">(2)也可以将<span data-offset-key="4s8i2-6-4">Build Settings|Code Signing的Provisioning Profile中对应版本(Debug)的Entitlements置空。 4.Xcode配置反应有时候不那么及时,可刷新、重置相关配置项开关(若有)或重启Xcode试试。</span></span></span></span></span></span></span></span></div>
</div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="av2ts-0-0"><span data-offset-key="av2ts-0-0">十. <span data-offset-key="av2ts-1-0">Xcode7 免证书真机调试</span></span></div>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="barme-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="barme-0-0"><span data-offset-key="barme-0-0">在 Xcode 7 中,苹果改变了自己在许可权限上的策略:</span></div>
</div>
<ol class="public-DraftStyleDefault-ol" data-offset-key="3hi7q-0-0">
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="3hi7q-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="3hi7q-0-0"><span data-offset-key="3hi7q-0-0">此前 Xcode 只开放给注册开发者下载,现在 Xcode 7 改变了这种惯有的做法,无需注册开发者账号,仅使用普通的Apple ID就能下载和上手体验。</span></div>
</li>
<li class="Editable-styled public-DraftStyleDefault-orderedListItem public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cdno3" data-offset-key="9pj34-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9pj34-0-0"><span data-offset-key="9pj34-0-0">此前开发者需每年支付99美元的费用成为注册开发者才能在 iPhone/iPad 真机上运行调试APP,苹果新的开发者计划则放宽要求,无需购买,只要你感兴趣同样可以在设备上测试app。——<span data-offset-key="9pj34-1-0">Developers would be able to test apps on devices without</span><span data-offset-key="9pj34-2-0"> a paid Apple developer account in Xcode 7</span><span data-offset-key="9pj34-3-0">.</span></span></div>
</li>
</ol>
<div class="Editable-unstyled" data-block="true" data-editor="cdno3" data-offset-key="5ja63-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5ja63-0-0"><span data-offset-key="5ja63-0-0">所谓“免证书”真机调试,并不是真的不需要证书,Xcode真机调试原有的证书配置体系仍在——All iOS, tvOS, and watchOS apps<span data-offset-key="5ja63-0-1">must be<span data-offset-key="5ja63-0-2"> code signed and provisioned to launch on a device. 所以,上文啰嗦几千字还是有点用的。 自 Xcode7 开始,原来基于付费开发者账号及自助生成证书及配置文件的繁琐过程被苹果简化,Xcode将针对任何普通账号<span data-offset-key="5ja63-0-3">自动<span data-offset-key="5ja63-0-4">为联调真机生成所需相关的证书及配置文件。当你打算向 App Store 提交发布应用,才需要付费。 第一步:进入 Xcode Preferences|Accounts,添加自己的 Apple ID 账号。 第二步:Build Settings|Code Signing 下的 Provisioning Profile 选择 <span data-offset-key="5ja63-0-5">Automatic<span data-offset-key="5ja63-0-6">,Code Signing Identity 选择 Automatic 下的<span data-offset-key="5ja63-0-7">iOS Developer<span data-offset-key="5ja63-0-8">。 第三步:General 配置 Bundle identifier,Team 下拉选择苹果Member Center自动为你的账号生成的Personal Team ID。 自己的账号在调试公司或其他第三方APP代码时,若填写 Bundle identifier 为他人账号注册的 APP ID(例如苹果相机应用 com.apple.camera),会报错: No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “com.apple.camera” were found. 即使编译通过了,可能运行时APP自身与服务器校验也可能会报签名错误,肿么办??? Her skill:此时,可以在他人原有App ID基础上添加后缀(例如com.apple.camera.<span data-offset-key="5ja63-0-9">extension<span data-offset-key="5ja63-0-10">),配置成应用的衍生插件(相当于置于同一 <span data-offset-key="5ja63-1-0">App Group</span><span data-offset-key="5ja63-2-0"> 下)就可以快乐的玩耍了。 如果启动APP时,Xcode报错“<span data-offset-key="5ja63-3-0">process launch failed: Security</span><span data-offset-key="5ja63-4-0">”或iPhone报错【<span data-offset-key="5ja63-5-0">不受信任的开发者</span><span data-offset-key="5ja63-6-0">】,此时需要到iPhone通用配置中的描述文件(最新系统中可能叫设备管理)中,在描述文件(开发商应用)中选择对应的描述文件(你的Apple ID)点击 <span data-offset-key="5ja63-6-1">信任 <span data-offset-key="5ja63-6-2">或 <span data-offset-key="5ja63-6-3">验证 <span data-offset-key="5ja63-6-4">即可。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
</div><br><br>
来源:https://www.cnblogs.com/gddg/p/16670107.html
頁: [1]
查看完整版本: iOS开发各种证书详解