(p12格式)
第三步根证书的私钥这里是一个坑!因为一个App的推送证书的创建可以和根证书创建的电脑不同,也就是keyChain产生的certSigningRequest
不一样,所以私钥也是不一样的,在这里生成Pem时,注意要使用推送证书的私钥!
操作过程:
-
-
把推送证书(.cer)转换为.pem文件,执行命令:
openssl x509 -in 推送证书.cer -inform der -out 推送证书.pem
-
把推送证书导出的私钥(.p12)文件转化为.pem文件:
openssl pkcs12 -nocerts -out 推送证书私钥.pem -in 推送证书私钥.p12
-
对生成的这两个pem文件再生成一个pem文件,来把证书和私钥整合到一个文件里:
cat 推送证书.pem 推送证书私钥.pem >PHPPush.pem
然后把这个PHPPush.pem给后台基友们,就可以下班啦。
当然测试推送也比较麻烦,需要模拟真实的推送环境,一般需要后台提供帮助,但是遇到一些后台同事,他们有强烈地信仰着鄙视链的话,很鄙视iOS,心里早就称呼你“死前段”多年了,还那么多事……
所以关于调试推送,博主教你自己推自己!不麻烦别人。
只要拷贝这段代码
<?php
// devicetoken
$deviceToken = '你的deviceToken';
// 私钥密码,生成pem的时候输入的
$passphrase = '123456';
// 定制推送内容,有一点的格式要求,详情Apple文档
$message = array(
'body'=>'你收到一个新订单'
);
$body['aps'] = array(
'alert' => $message,
'sound' => 'default',
'badge' => 100,
);
$body['type']=3;
$body['msg_type']=4;
$body['title']='新订单提醒';
$body['msg']='你收到一个新消息';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'push.pem');//记得把生成的push.pem放在和这个php文件同一个目录
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client(
//这里需要特别注意,一个是开发推送的沙箱环境,一个是发布推送的正式环境,deviceToken是不通用的
'ssl://gateway.sandbox.push.apple.com:2195', $err,
//'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
fclose($fp);
?>
将上面的代码复制,保存成push.php
然后根据上面“生成PHP需要的Pem证书”的步骤生成push.pem
两个文件放在同一目录
执行下面的命令
DavidDay$ php push.php
结果为
Connected to APNS
Message successfully delivered
是不是就推送成功了呢?呵呵哒
打包、分发及内测
关于打包是有很多姿势的,每个人都有各自的喜好,大部分规矩的做法都是使用Xcode的一条龙服务的:
这样的做法比较保险,因为archive
只会编译出真机的二进制码,所以不用担心导出的ipa真机装不起。
另一种姿势是使用xcodebuild
工具,纯Shell编译,比较不好处理错误,但是逼格满满啊,想详细了解这种姿势的可以看看官方文档 ,或者参考这位同学的分享
当然嘛,博主作为拖拖派的忠实拥趸,博主打包ipa的时候是这样的:
图6
随时build随时转ipa。
分发内测一般都会使用第三方的平台,fir、蒲公英 都很好呀~
关于提交审核这里,一般archive过去了,证书正确都没问题的,当然还是要检查项目是否调用了私有API,之前用reveal ,提交应用的时候忘了移除,千不该万不该的还是用了Xcode的upload工具,也不报错,在iTunesConnect中构建版本也出现了,只是状态“正在处理”,一般这个状态持续10分钟~2个小时就会通过了,然后博主自信关机下班,想不到第二天构建版本还是“正在处理”,然后猜想是不是iTunes出问题了又怒传了N个包,依然是“正在处理”,后来准备发邮件,打开邮箱,尼玛!
图7
原来调用了私有接口,忘记移除reveal了~,回顾起来这里有三个大坑,
-
- Xcode的上传工具很辣鸡!!很多错误都无法扫描出来,所以切记 使用
Application Loader
,速度快,错误报告也精准。
- iTunesConnect的错误状态几乎没有,一般只有两个状态 “正在处理”、“成功”,所以如果超过两个小时仍然是“正在处理”,那么极有可能包出问题了!
- 记住关注邮件!
打包项目证书选择必须正确 (Xcode7以下 选择项目编译target为Iphone Device 不要连接手机 否则会 ,Xcode7中不需要拔出真机,因为多了一个build only device
的选项)
编译target选错了 报错
ITMS-90530 "Invalid MinimumOSVersion. Apps that only support 64-bit devices must specify a deplyment target of 8.0 or later"
IMTS-90208 "Invalid Bundle. The bundle xxx.app does not support the minimum OS