美文网首页iOS程序开发iOS上架资料
IOS企业版版本更新以及推送pem的生成

IOS企业版版本更新以及推送pem的生成

作者: Miss_chalk | 来源:发表于2015-03-12 10:56 被阅读3413次

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

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

    推送需要准备的东西:

    开发P12 、 开发推送证书
    推送P12 、发布推送证书

    开发推送证书的命令

    需要的两个文件aps_development.cer、Push.p12

    1.openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
    2.openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
    3.cat PushChatCert.pem PushChatKey.pem > ck.pem
    4、telnet gateway.sandbox.push.apple.com 2195
    5. openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
    

    发布推送证书的命令

    需要的两个文件 aps_production.cer 、Push.p12(和开发的不同)

    openssl x509 -in aps_production.cer  -inform der -out PushChatCert.pem
    openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
    cat PushChatCert.pem PushChatKey.pem > ck.pem
    telnet gateway.push.apple.com 2195 
    openssl s_client -connect gateway.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

    
    <?php
    
    class DB{
        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'");
        }
      
        public function db_insert($sql)
        {
            $ret = mysql_query($sql,$this->link);
            if(!$ret){
                $this->error_state = 1;
            }
            return $ret;
        }
        
        
        public function db_select($sql)
        {   
            return db_insert($sql);
        }
      
        public function db_delete($sql)
        {
            return db_insert($sql);
        }
      
        //查询后返回数组
        public function db_array($sql)
        {
            $arr = mysql_query($sql,$this->link);
            $result = array();
            while ($arrTemp = @mysql_fetch_assoc($arr)) {
                $result[] = $arrTemp ;
            }
            return $result;     
        }
      
      // 关闭连接数据库
        public function closeDB()
        {
            mysql_close($this->link);
        }
      
      
        //事物处理 
        //开始事物
        public function db_start_substance()
        {
            mysql_query("BEGIN" ,$this->link);
            $this->error_state = 0;
        }
        //提交事物/回滚事物
        public function db_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

    
            <script type="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) {
                    //window.location='itms-services://?action=download-manifest&url=http://zhangshangxindai.duapp.com/app/ipa/Loan.php';
                    window.location="itms-services://?action=download-manifest&url=https://zhangshangxindai.duapp.com/Travel/ios_app/Travel.plist";         
                }
                else if (browser.versions.android) {
                    window.location="http://zhangshangxindai.duapp.com/app/apk/zhangshangxindai.apk";
                }
     
            </script>
    
    

    down.html指向plist的地址,plist指向ipa的地址。
    plist需要放在支持https的服务器上,down.html、ipa可以放在http/https上

    参考:

    http://blog.csdn.net/IOS_CaoMuJieBing/article/details/18043557
    http://blog.csdn.net/showhilllee/article/details/8631734

    相关文章

      网友评论

      本文标题:IOS企业版版本更新以及推送pem的生成

      本文链接:https://www.haomeiwen.com/subject/tolbxttx.html