Xcode编译打包依赖等

Xcode中编译相关

编译设置项概要

Build phases主要是用来控制从源文件到可执行文件的整个过程的,所以应该说是面向源文件的,包括编译哪些文件,以及在编译过程中执行一些自定义的脚本什么的。
Build rules 主要是用来控制如何编译某种类型的源文件的,假如说相对某种类型的原文件进行特定的编译,那么就应该在这里进行编辑了。同时这里也会大量的运用一些 xcode 中的环境变量,完整的官方文档在这里:Build Settings Reference
Build settings则是对编译工作的细节进行设定,在这个窗口里可以看见大量的设置选项,从编译到打包再到代码签名都有,这里要注意 settings 的 section 分类,同时一般通过右侧的 inspector 就可以很好的理解选项的意义了。

最后,要说一下我们的工程文件.pbxproj,以上的所有的这些选项都保存在这个文件中。当然也包括 target 的信息,项目所有文件的信息,这个文件是一个文本文件,可以用文本编辑器打开。里头的内容基本是可读性比较强的。基本的思路很面向对象,每个东西都有属性,如果属性是另一个对象,值就是那个对象的一个『引用』,就是一串数字(唯一的)作为表示。每个对象都有这样的引用。

这一段复制自聊聊Xcode 中的编译过程以及编译器

编译顺序

当在workspace中有过个工程,有的工程作为库引用的时候,有的时候我们需要手动的设置编译顺序,在Schemes中设置,如下图

拖动各个工程的Targets进行编译顺序的排序,点击左下角的+号添加新的Target。

参考
[用workspace管理工程,并解决多静态库依赖]

签名打包发布

Configuring Your Xcode Project for Distribution

创建签名证书

在Preferences的Accounts中登录自己的AppleID

Role为Agent的为Apple Developer注册的,并且配置了角色的Agent的账号,只有这个能创建Developer ID certificates。

另外一个Role为User的是普通账号,只要有注册AppleID登录后就会有这个。

点击Manage Certificates

这里的Distribution Certificates为可以用来签名的证书。其中Developer ID开头的证书是用来在App Store外发布用的。Developer ID Installer是对pkg安装包签名用的。

具体各个证书的用途可以看这篇文章

简单说明下

  • AppStore与AppStoreInstaller两个证书,前面的是对要上传AppStore的App进行签名的,后面是对要上传AppStore的App的安装包进行签名的。
  • DeveloperID与DevelopIDInstaller两个证书,前面的是对在AppStore外面发布的App进行签名的,后面的是对在AppStore外面发布的App的安装包进行签名的。

这里的证书与苹果开发者网站上的证书是对应的https://developer.apple.com/account/mac/certificate/,如果在这里创建多一个证书,那么开发者网站上也会出现相应的证书。一些比较久的IOS App的上架教程,在网站上生成证书,实际上在这里生成似乎就够了,操作还简单些。

如果在这里创建了证书,在网站上删除后,这里的证书将不会显示Creator,这里无法删除,可以在KeyChain中把响应的证书删掉。删完后这里的也就没了。

另外还有一点要注意,这里有两个账户,一个是role为Agent的,另一个是role为User的,role为Agent的是我们花钱给苹果注册了开发者后的新账户,可以用来发布应用的。role为User的是我们原本的账户,只可以用来在本地开发。两个账户都属于同一个AppleID。当我们花钱成为开发者后,如果在这里对role为User的账户的证书进行操作,添加一些证书啥的,那么在苹果的开发者中心里面,没有地方给我们删除这个证书,可能需要写mail给苹果才能删除了。参考这个Stack Overflow帖子

这里的证书与Keychain Access里的证书是一一对应的,如图

对应关系可以看Difference between “Mac Developer” and “3rd Party Mac Developer Application”

Code Sign IdentitySigning Identities,指的都是存在Keychain Access里的证书。他们与Xcode里的证书是一一对应的。(应该就是同一个东西吧,只是是显示在Xcode里叫法不一样,实际上是存在Keychain里的)

导出Developer Profile

Developer Profile是一个文件,包含

  • 开发证书(Development certificates)
  • 分发证书(Distribution certificates)
  • 供给证书(Provisioning profiles)

创建完签名用的证书后应当马上导出Developer Profile保存起来以防丢失

Developer Profile包含了应用签名和发布到AppStore需要的证书文件,导出的时候会加密,需要设置密码。

导出步骤参见:

Exporting Your Developer Profile

导出成功弹框:

  • 1个account指的是我的开发者AppleID账号吧
  • 6个code signing identities指的是6个签名用的证书吧,其中role为Agent的账户里面有5个,role为User的账户里面有1个。
  • 4个provisioning profiles指的就是role为Agent的账户里面的4个用来Distribution的证书吧。

在Manage Certificates的弹出窗口中,相应的证书点击右键可以只导出某一证书。

打包

Xcodec菜单中 Product -> Archive对App进行打包。

打包前最好clean一下工程。

在Scheme设置里,可以选择Archive使用Release还是Debug,默认是Release,我们一般也不会有要以Debug来Archive的需求

打包完最好再校验一下才导出:

提供URL

如图,如果要在首次打开时添加一个Show Web Page按钮,可以跳转到App的网页。

好吧,,研究了好一段时间后发现,原来这个不是自己设置的,这个是dmg文件,或者app下载的地址,从哪里下的这个就会跳转到哪里。

错误与注意事项

这里要注意一点,在App Store外发布,打包出来的App,测试的话需要Quarantine,通过将App给自己发邮件,然后通过浏览器下载,再打开。这样Gatekeeper才会起作用。

然后如果失败,出现弹框 identity of the developer cannot be confirmed signed ,如下图

需要查明是什么原因引起的,可能的原因:

  • 没有进行Quarantine

  • 签名不正确,通过命令行可以检查

    1
    $ spctl -a -v App名字.app
  • 你的App引用了不在自己目录里的第三方库,通过打开系统自带的App,Console,输入自己App的名字进行过滤,重试打开App,可以看到Console的输出,再去找具体是哪里的原因,然后去修改Xcode的配置,重新打包前,有可能需要Clean以下,否则配置可能无效。

参考:

Distributing Apps Outside the Mac App Store

What are code signing identities?

打包dmg文件

Mac OS 开发 - 聊聊如何打包dmg文件

我使用的是create-dmg这个项目,安装好后,只要在打包的文件夹下(就是有*.app的文件夹),命令行执行create-dmg xxx.app就可以了。