博客> IOS企业版版本更新以及推送pem的生成
IOS企业版版本更新以及推送pem的生成
2019-09-18 16:57 评论:0 阅读:1766 爱喝玉米粥
IOS企业版版本更新以及推送pem的生成

发布新版本时需要注意的问题:

1.XCODE工程修改版本号。 2.打包后,替换服务器中IPA文件。 3.修改ios_update.php文件,里面的版本号,更新内容。 4.修改push.php中推送的内容。

推送需要准备的东西: 开发P12 、 开发推送证书 推送P12 、发布推送证书

开发推送证书的命令需要的两个文件aps_development.cer、Push.p121.opensslx509-inaps_development.cer-informder-outPushChatCert.pem2.opensslpkcs12-nocerts-outPushChatKey.pem-inPush.p123.catPushChatCert.pemPushChatKey.pem > ck.pem4、telnetgateway.sandbox.push.apple.com 21955. openssls_client-connectgateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem发布推送证书的命令需要的两个文件 aps_production.cer 、Push.p12(和开发的不同)opensslx509-inaps_production.cer-informder-outPushChatCert.pemopensslpkcs12-nocerts-outPushChatKey.pem-inPush.p12catPushChatCert.pemPushChatKey.pem > ck.pemtelnetgateway.push.apple.com 2195 openssls_client-connectgateway.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem推送IOS端代码#pragma mark - 推送设置 // Register for Push Notitications, if running iOS 8

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
    UIUserNotificationSettings settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];
    } else {
    // Register for Push Notifications before iOS 8
    [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
    }} -(void)application:(UIApplication
    )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken{
    NSString
    newToken = [[[NSString stringWithFormat:@"%@",deviceToken] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"nsdata:%@\n 字符串token: %@",deviceToken, newToken);// 获取device token// 上传devicetoken
    [_netUtils requestContentWithUrl:DEVICE_TOKEN para:@{@"appleID": newToken} withSuccessBlock:^(id returnData) {
    NSLog(@"%@",returnData); } withFailureBlock:^(NSError error) {
    NSLog(@"%@",error); }]; } -(void)application:(UIApplication
    )application didFailToRegisterForRemoteNotificationsWithError:(NSError )error{
    NSLog(@"RegistFail%@",error); } -(void)application:(UIApplication
    )application didReceiveRemoteNotification:(NSDictionary )userInfo{
    // 处理推送消息 NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]); if (application.applicationIconBadgeNumber > 0) {
    application.applicationIconBadgeNumber = 0; } } IOS端检查更新代码 -(void)getUpdate:(updateBlock)completonBlock // 检查更新 { __unsafe_unretained NetUtils
    netUtil = self;// 防止循环应用
    [netUtil GetContentWithUrl:UPDATE_URL withSuccessBlock:^(id returnData) {
    if ([returnData[@"verCode"] isEqualToString:kVersion_Coding]) { // 不用更新
    } else{ // 提示更新 UIAlertView testView = [[UIAlertView alloc] bk_initWithTitle:@"有新版本" message:returnData[@"content"]]; [testView bk_addButtonWithTitle:@"取消" handler:^{ }];
    [testView bk_addButtonWithTitle:@"更新" handler:^{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:IPAURL]];
    }]; [testView show];
    } } withFailureBlock:^(NSError
    error) {
    //NSLog(@"%@",error);
    }]; } 服务器端代码: db.php<?phpclassDB{
    public$link; public$error_state; function__construct(){ $dbname = 'rUCqINjvmzQMBxMhDzeb';
    $host = 'sqld.duapp.com';
    $port = 4050;
    $user = 'vcoDM9nG8wswSdMTHj7YYsvV';//用户名(api key) $pwd = 'OrpEsFYYu8nTC3VONGTjQGUjEu3y0EQU';//密码(secret key) $this->link = @mysql_connect("{$host}:{$port}",$user,$pwd,true); if(!$this->link) {
    die("Connect Server Failed: " . mysql_error());
    } /连接成功后立即调用mysql_select_db()选中需要连接的数据库/ if(!mysql_select_db($dbname,$this->link)) {
    die("Select Database Failed: " . mysql_error($this->link));
    }
    mysql_query("SET NAMES 'UTF8'"); } publicfunctiondb_insert($sql){
    $ret = mysql_query($sql,$this->link);
    if(!$ret){
    $this->error_state = 1;
    }
    return$ret; }
    publicfunctiondb_select($sql){
    return db_insert($sql); }
    publicfunctiondb_delete($sql){ return db_insert($sql); }
    //查询后返回数组 publicfunctiondb_array($sql){
    $arr = mysql_query($sql,$this->link);
    $result = array(); while ($arrTemp = @mysql_fetch_assoc($arr)) {
    $result[] = $arrTemp ; }
    return$result;
    } // 关闭连接数据库 publicfunctioncloseDB(){
    mysql_close($this->link); }
    //事物处理 //开始事物 publicfunctiondb_start_substance(){
    mysql_query("BEGIN" ,$this->link); $this->error_state = 0;
    }
    //提交事物/回滚事物 publicfunctiondb_commit_substance(){
    if($this->error_state == 1){
    mysql_query("ROLLBACK",$this->link);
    }else{
    mysql_query("COMMIT",$this->link);
    }
    return$this->error_state;
    } }?> 存储IOS设备的device token

<?php// 查重 require_once"db.php"; $appleID = $_REQUEST['appleID']; if($appleID==""){
exit("kongkong"); } $db_obj = new DB(); $sqlApple = "select from appleDevice where appleID = '$appleID'"; $sqlResult = $db_obj->db_array($sqlApple); if($sqlResult){
exit("exit"); } else{
$sql = "insert into appleDevice (appleID) values ('$appleID') "; $result = $db_obj->db_insert($sql); if($result){
$arr = array('result' => 'success' );
echo json_encode($arr); }else{
$arr = array('result' => 'fail' ); echo json_encode($arr); } } ?>检查更新代码< ?php// http://weixin.jsptz.com/map/app/ipa/location.ipa // ipa 下载地址$arr = array('verName'=>'app','verCode'=>'1.0.10','content'=>'活动详情展示。'); echo json_encode($arr);?> 发布推送的代码<?php// 发布地址:gateway.push.apple.com:2195// 测试通过require_once"db.php"; $db_obj = new DB(); $sql = "select appleID from appleDevice "; $result = $db_obj->db_array($sql); $countArray = count($result); $passphrase = 'zhaojian'; $message = '生产-推送-测试!'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); $fp = stream_socket_client( '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; $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); $payload = json_encode($body); for($i = 0; $i < $countArray; $i++){ $deviceToken = $result[$i]['appleID']; $msg = chr(0) . pack('n', 32) . pack('H
', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result1 = fwrite($fp, $msg, strlen($msg));
if (!$result1){
echo$deviceToken . 'Message not delivered' . PHP_EOL;
} else {
echo$deviceToken . 'Message successfully delivered' . PHP_EOL;
} }
fclose($fp);
?>服务端下载地址代码down.html<scripttype="text/javascript">/ 智能机浏览器版本信息: / var browser = {
versions: function() {
var u = navigator.userAgent, app = navigator.appVersion;
return {//移动终端浏览器版本信息
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
mobile: !!u.match(/AppleWebKit.Mobile./) || !!u.match(/AppleWebKit/), //是否为移动终端
ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1//是否web应该程序,没有头部与底部
};
}(),
language: (navigator.browserLanguage || navigator.language).toLowerCase()
}
if (browser.versions.ios || browser.versions.iPhone || browser.versions.iPad) {
//[removed]='itms-services://?action=download-manifest&url=http://zhangshangxindai.duapp.com/app/ipa/Loan.php'; [removed]="itms-services://?action=download-manifest&url=https://zhangshangxindai.duapp.com/Travel/ios_app/Travel.plist";
}
else if (browser.versions.android) {
[removed]="http://zhangshangxindai.duapp.com/app/apk/zhangshangxindai.apk";
}
[removed] down.html指向plist的地址,plist指向ipa的地址。 plist需要放在支持https的服务器上,down.html、ipa可以放在http/https上

收藏
3
sina weixin mail 回到顶部