iOS In House方式发布

    这两天In House签名的时候,提示SSL证书过期了。又折腾了一把iOS In House方式发布。这里开一篇文章记录一下过去折腾In House的经过,未来再修改也更新在这里。

    最早在12年的时候,我们写了一个重签名的shell脚本

IPA="xxx.ipa"
APPNAME="xxx.app"
PROVISION="embedded.mobileprovision"
CERTIFICATE="xxx" #must be in keychain, such as"iPhone Distribution: Tencent Co.,Ltd"

rm -rf Payload
rm -rf resigned.ipa

unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature Payload/*.app/CodeResources

# replace the provision
rm -rf Payload/*.app/embedded.mobileprovision
cp "$PROVISION" Payload/$APPNAME/embedded.mobileprovision

# sign with the new certificate
/usr/bin/codesign -f -s "$CERTIFICATE" --resource-rules Payload/*.app/ResourceRules.plist --entitlements game.plist Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload
rm -rf Payload

    中间随着iOS版本升级和XCode升级,间或小修改细节。每次XCode升级,必须下载安装对应的command line tools


    iOS 7.1更新之后,苹果做了一个大的调整,通过Safari安装的时候,会提示“无法安装应用程序 因为证书无效”。stackoverflow上看到必须把plist放到https服务器上,最简单的就是丢到dropbox之类的云存储上,但是国内访问可能会受限制。我就在我们内网服务器(apache)上自己生成了一下ssl证书,让服务器支持https访问,下面是详细步骤。

1. 加载ssl动态库;打开conf/httpd.conf,去掉LoadModule ssl_module modules/mod_ssl.so前的注释即可;

2. 配置ssl;打开httpd-ssl.conf,我的配置示例如下:

SSLSessionCache "shmcb:logs/ssl.scache(512000)"
Listen 442 #端口,为了防止端口冲突,我改成了442
<VirtualHost _default_:442>
    # General setup for the virtual host
    DocumentRoot "D:/programs/xampp-win32-1.8.1-VC9/htdocs"#服务器根目录
    ServerName 192.168.1.221#服务器名,必须是ip地址或域名
    ServerAdmin webmaster@localhost#这个是邮箱地址,可以随意填
    ErrorLog "logs/error.log"
    <IfModule log_config_module>
        CustomLog "logs/access.log" combined
    </IfModule>
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/server.crt"#之后生成的证书的路径
    SSLCertificateKeyFile "conf/ssl.key/server.key"#之后生成的密钥的路径
</VirtualHost>

3. 打开cmd,到.../apache/bin目录,运行以下命令生成服务器的私钥

openssl genrsa -out server.key 1024

4. 生成签署申请,Common Name必须是服务器ip或域名,其余都可以为空

openssl req -new -out server.csr -key server.key -config ..\conf\httpd-ssl.cnf

5. 生成CA私钥

openssl genrsa -out ca.key 1024

6. 生成CA证书,Common Name必须是服务器ip或域名,其余都可以为空;为免过期,有效期我设为了10年

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config ..\conf\httpd-ssl.cnf
7. 在当前目录创建目录demoCA,在里面创建1. 空目录newcerts,2. 空文件index.txt, 3,文件serial,用文本编辑器打开,填01;

8. 用CA为服务器签署证书

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config ..\conf\openssl.cnf
9. 将server.crt复制到目录conf/ssl.crt/,将server.key复制到目录conf/ssl.key/。

10. 重启apache,然后可以在浏览器输入https://localhost:442测试。

11. 修改html文件中的plist链接

itms-services://?action=download-manifest&url=https://192.168.1.221:442/down/dev/xxx.plist
然后,应该就可以在手机浏览器上在线安装了。


    update 2014.12.24

    中间有一段时间我没有做过In House发布,此间我的Mac升级到了10.10,Xcode升级到了6.1.1。前天签名的时候提示“--resource-rules has been deprecated in max os x >= 10.10”,签完名放到服务器上,在线安装的时候,最后一刻提示“无法下载应用程序 此时无法安装xxx”。

技术分享

在签名的脚本里把--resource-rules那里注释掉也不行。后来在stackoverflow上看到如下的解决方案,经过测试是可以的:

    点工程 > Targets > Select your target > Build Settings > Code Signing Resource Rules Path

    添加 $(SDKROOT)/ResourceRules.plist

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。