iOS App 研发的最后冲刺:内测与部署 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fir.im Rio
fir.im 平台更新日志
快速获取 UDID
1 - 3 分钟发布应用
同时支持 iOS 和 Android
灵活设置应用权限
实时查看应用动态消息
自定义显示历史版本
随时了解应用下载情况
如果你也喜欢简单快速又美观的工具平台,就用 fir.im 吧!
BugHD
Imshaha
V2EX    fir.im

iOS App 研发的最后冲刺:内测与部署

  •  
  •   Imshaha 2015-08-12 10:46:24 +08:00 3322 次点击
    这是一个创建于 3784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当开发者历经磨难、披荆斩棘,完成了一个iOS项目后,最后的临门一脚就是应用的内测、部署。那么,在这最后的射门动作中,都有哪些地方需要开发者注意?有哪些方式能够更好地帮助我们进行iOS应用的发布部署?

    本文针对iOS App开发的最后阶段来详解如何在真机上进行调试,将App发送给其他测试人员进行内测,以及内测完成后如何将App上传至App Store进行应用审核,针对苹果账号的类型、真机调试、打包与崩溃收集进行深度剖析。

    苹果账号的类型

    苹果开发者计划分为个人、公司、企业和教育开发者四个类型。个人开发者证书费用为$99一年,该账号在App Store销售者只能显示个人的ID。并且,个人账号只能有一个开发者,100个苹果的iOS设备UDID测试。
    1.png
    公司开发者费用为$99一年,该账号在App Store销售者可以显示类似Studios,或者自定义的团队名称。公司账号可以允许多个开发者协作开发,比个人多一些帐号管理的设置,可以设置多个Apple ID,分4种管理级别权限,100个苹果的iOS设备UDID测试。但是,申请时需要填写公司的邓白氏编码(D-U-N-S),D-U-N-S邓白氏码可以在 苹果官方网站免费申请

    企业开发者账号费用为$299一年, 该账号开发应用不能发布到App Store,只能企业内部应用,苹果的iOS设备UDID数量不限制。企业账号适合不希望上线App Store,但是需要企业内部,比如1000人的iOS设备都部署。

    2.png

    特别需要注意的是,其他渠道提供的所谓的企业证书实际上是与他人共用一张企业证书,苹果会侦测到这种情况,并进行封号处理。封号后,包括已经使用该证书安装了的App都会无法继续使用。

    这些开发者账号的申请都需要一个重要的条件,那就是有一张支持Visa或MasterCard的信用卡。

    真机调试

    使用真机调试,必须要使用开发者证书,以及正确填写App ID,配置好Provision Profile,具体流程如下:

    1. 安装调试证书
    2. 填写 App ID
    3. 根据 App ID 填写 provision profile ,并下载安装到 Xcode
    4. 真机调试运行

    怎样申请开发者证书?

    需要下列几步:
    1.请求CSR文件

    • 打开钥匙串访问, 从证书颁发机构请求证书

    3.png
    4.png

    • 填写电子邮件地址,常用名称,勾选存储到磁盘,最后保存CSR文件到指定位
      5.png

    • 最后保存CSR文件到指定位置
      6.png

    2.创建调试证书

    • 选择CSR文件 7.png
    • 点击Download下载,双击安装到钥匙串匙串

    8.png

    • 双击安装

    可以看到钥匙串中有了我们刚安装的证书,左侧有个三角,点击展开可以看到证书私钥,如果没有私钥,则证书是不可用的,一般这种情况是你在开发者网站上下载了其他Mac上制作的证书,可以从这台Mac导出证书安装到自己的电脑上。

    9.png

    创建AppID

    1. 填写AppID Name
    10.png
    2. 支持推送、Game Center等功能的话不能创建含有通配符*的AppID,所以这里我们选择Explicit App ID
    11.png
    3. 勾选需要的服务,然后Continue
    12.png

    添加设备

    1. 填写设备名称、设备UDID
    13.png
    2. Register
    14.png

    注意:最多添加100台设备

    创建Provisioning Profile

    15.png
    16.png

    • iOS App Development:真机调试Profile(需要选择iOS设备,只有包含的设备可以真机调试)
    • App Store:上传到AppStore商店Profile
    • In House:企业内发布Profile(所有设备可以安装)
    • Ad Hoc:Ad Hoc Profile(需要选择iOS设备,除了只有包含的设备可以安装外与AppStore、Inhouse版本基本没有区别)

    1. 选择AppID
    17.png
    2. 选择证书
    18.png
    3. 选择设备(只有Development、AdHoc需要选择设备)
    19.png
    4. 填写Profile Name
    20.png
    5. 点击Download下载,双击安装到Xcode

    XCode打包

    Configurations

    默认Configurations包含两个配置,Debug、Release,可以看到Build Setting里好多配置都区分了Debug、Release,可以根据不同的情况配置不同的选项,最常用的就是根据真机调试、打包发布,分别在Debug、Release选择合适的证书、Profile。

    21.png

    个人认为,现在的Xcode不用再Duplicate Release配置来建立专门打包AppStore或者Adhoc或其它的Configuration,因为感觉并不会方便多少,只是省去了选择证书,但是你还是设置Archive选项。
    22.png
    一般来说,Adhoc、AppStore\Inhouse,二者用的都是同一个证书,只是Profile不同而已,简单的选择一下Profile,是不是更省事一些呢。

    指令集

    先说一下iOS设备的指令集:

    • arm64:

    iPhone 5s, iPhone 6, iPhone6 Plus;

    iPad Air, iPad Air 2;

    iPad Mini 2, iPad Mini 3;

    • armv7s:

    iPhone 5, iPhone 5c;

    iPad 4;

    • armv7:

    iPhone 3GS, iPhone 4, iPhone 4S;

    iPad, iPad 2, iPad 3, iPad Mini;

    • armv6:

    iPhone, iPhone 3G;

    23.png

    • Architectures
      该编译选项指定了工程支持哪些指令集,如果支持的指令集数目有多个,就会编译出包含多个指令集二进制包,造成最终编译的包很大。

    • Valid Architectures
      该编译项指定可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集。

    如上图所示,Architectures 支持的指令集为 armv7、arm64、Valid Architectures 支持的指令集为armv7、armv7s、arm64,这时只会生成一个 armv7、arm64 指令集的二进制包。

    • Build Active Architecture Only 该编译项用于设置是否只编译当前使用的设备对应的arm指令集。通常情况下,该编译选项在Debug模式都设成YES,Release模式都设成NO。该选项起作用的条件有两个,必须同时满足才会起作用:

    注意:许多用户可能会发现自己的应用安装不了,这时候可以看看自己的App支持的指令集,遇到过几个用户的指令集只支持arm64,这样的App在设备不是arm64的情况下是安装不了的。

    Code Signing

    24.png

    上图中Code Signing Identity包含的Debug和Release两项,其中,Debug指选择真机调试证书,Release指选择发布证书(AdHoc、AppStore/Inhouse打包都使用发布证书)。而在 Provisioning Profile中,无论真机调试,还是发布App,选择的Profile的App ID要与项目工程的BundleId匹配。

    注意:Provisioning Profile的Release这里选择的Profile,并不一定就是签名ipa用的Profile,后面会讲到。

    导出ipa

    导出ipa首先需要选择ipa版本,导出App Store/AdHoc/企业版ipa,然后点击Next。如果Xcode 没有登录企业开发者账号,选择导出企业版ipa的时候会提示添加企业开发者账号到xcode。

    选择证书
    25.png
    这里就是上面说的在工程选择的证书、profile可能并不是签名用的,关键在这里,这里会显示已经添加到Xcode的开发者账号对应的证书列表,可以选择签名用的证书。如果跟工程设置的证书一致,并且Profile匹配,则会根据工程配置的证书、Profile来签名导出。如果跟工程配置的证书不一致,则会根据选择的证书自动查找匹配的Profile来签名导出ipa。
    26.png
    这里会显示导出的ipa用的是哪一个证书、Profile签名的,Profile旁边那个箭头并不是选择Profile,然后在Finder中显示当前Profile。 所以导出的最后一步,尽量确认一下签名的证书、Profile是不是自己指定的。

    内测分发ipa文件

    内测分发ipa文件给测试人员主要有3种方法:

    1. 使用iTunes将iPa同步到手机中;
    2. 使用itms-services协议进行下载分发;
    3. 使用第三方工具进行下载分发。

    请注意,无论使用何种形式分发,内测的人数限制,以及App的UDID限制始终是存在的。如果想新增加测试人员,开发者仍然需要将UDID写入Provision Profile,重新生成ipa文件进行分发。

    使用iTunes进行内测分发

    使用iTunes进行分发比较麻烦,需要测试用户使用数据线连接装有iTunes的电脑上,先将ipa文件添加到iTunes,再将iTunes的App同步到手机上。由于国内用户对iTunes熟悉程度不高,故不推荐大家使用这种方式进行内测分发。

    使用itms-services协议进行下载分发

    相比iTunes的分发方式,使用itms-service 分发的最大好处是测试用户无需使用数据线,只需打开Safari中访问包含itms-service连接的页面,单击连接后即可下载IPA文件。

    itms-services的原理是itms-services指向一个plist文件,这个plist文件包含了ipa文件下载的地址,iOS设备的Safari会自动将plist中指定的ipa文件下载安装到本地。

    itms-services的麻烦之处就是开发者需要自己搭建一个服务器,之后苹果在iOS 7.1 以后安装ipa,写入ipa地址的plist文件的存放地址必须是一个https的地址.

    itms的结构参考如下

    <a href="itms-services://?action=download-manifest&url=https://xxx/test.plist">安装IOS BetaV1.0 </a> 

    plist 的结构参考如下

    <?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"><dict> <key>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string><![CDATA[http://fir.im/xxxxxx]]></string> </dict> <dict> <key>kind</key> <string>display-image</string> <key>needs-shine</key> <integer>0</integer> <key>url</key> <string><![CDATA[http://fir.im/xxx]]></string> </dict> <dict> <key>kind</key> <string>full-size-image</string> <key>needs-shine</key> <true/> <key>url</key> <string><![CDATA[http://fir.im/xxx]]></string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>im.fir</string> <key>bundle-version</key> <string><![CDATA[1.3.0]]></string> <key>kind</key> <string>software</string> <key>title</key> <string><![CDATA[Fir plist Demo]]></string> </dict> </dict> </array> </dict></plist> 

    我们可以看到,虽然说用户比较方便,但对开发者而言需要写很多东西,还得搭建服务器,上OpenSSL等,比较麻烦。

    使用第三方工具进行内测分发

    为了避免开发者使用itms-services而带来的额外工作量,可以使用第三方工具如 fir.im ,将ipa快速地进行内测分发。


    本文作者 fir.im 工程师 纪承,首发于 [CSDN技术公开课] ,演讲PPT>>下载地址

    13 条回复    2019-07-03 16:48:49 +08:00
    Missdong
        1
    Missdong  
       2015-08-12 10:56:26 +08:00
    这么长的干货,我觉得还是回复下比较好~
    code4life
        2
    code4life  
       2015-08-12 11:03:24 +08:00
    适合新手的干活~
    Imshaha
        3
    Imshaha  
    OP
       2015-08-12 11:13:10 +08:00
    @code4life 加油(^ω^)
    roys
    4
    roys  
       2015-08-12 11:25:06 +08:00
    最近在学IOS mark 给自己留着
    Imshaha
        5
    Imshaha  
    OP
       2015-08-12 11:33:15 +08:00
    @roys http://www.v2ex.com/t/212139#reply2 看这个是否对你有用
    pH
        6
    pH  
       2015-08-12 12:50:11 +08:00
    歪楼来了,头像是谁-.-
    Imshaha
        7
    Imshaha  
    OP
       2015-08-12 12:57:04 +08:00
    @pH 是我,是我,还是我 ~
    inmyfree
        8
    inmyfree  
       2015-08-12 13:18:18 +08:00
    @Imshaha 敲晕拖走。。。。
    beimenjun
        9
    beimenjun  
    PRO
       2015-08-12 13:24:08 +08:00
    有空的话回复下这个帖子 /t/212637
    nellace
        10
    nellace  
       2015-08-12 15:39:38 +08:00
    这个帖子算是比较详细的了,不错
    nellace
        11
    nellace  
       2015-08-12 15:40:48 +08:00
    话说看到你是fir的,以前经常在你那打测试包
    walter
        12
    walter  
       2016-12-07 15:57:06 +08:00
    plist 文件不是这个就是那个链接吗?
    yalin
        13
    yalin  
       2019-07-03 16:48:49 +08:00
    plist 文件中 ipa 链接必须是无状态的吧?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2467 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 05:46 PVG 13:46 LAX 21:46 JFK 00:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86