详解如何一键自动发布ipa

概述

平台:Mac

例子工程:基于Cocos2d-x引擎的项目

事实:就是一组shell脚本和一些工具


我的目录结构

1407219225257025.jpg

一、配置文件config.txt

说明:

1、这是所有配置,供其他脚本使用的一些常量,放这里统一管理

2、我们代码和资源svn目录是分开(这样有好有坏)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#! /bin/sh
 
#根目录
CurrentDir=`dirname $0`
 
#--------------------------------------SVN更新--------------------------------------
#SVN代码目录
SVN_Code=$CurrentDir/../..
 
#SVN资源目录
SVN_Resource=$CurrentDir/resource
 
#要拷贝到的目标目录
Destiny_Dir_Resource=$SVN_Code/project/Game/Resources/resource
 
#--------------------------------------压缩PNG--------------------------------------
CompressTool_Path=$CurrentDir/tool/ImageAlpha.app/Contents/Resources
 
#--------------------------------------资源加密--------------------------------------
#加密工具目录
EncryptTool_Path=$CurrentDir/tool
 
#png加密key
PngEncryptKey=xxxxxxxxxxxxxxxxxxxxx
 
#data加密key
DataEncryptKey=xxxxxxxxxxxxxxxxxxxxxxxx
 
#加密长度
EncryptDataLen=128
 
#--------------------------------------编译ipa--------------------------------------
ProjectRoot_Path=$SVN_Code/project
 
#xcodeproj所在目录
XCodeProject_Path=$ProjectRoot_Path/Game/proj.ios
 
#OutPut目录
TargetOutput_Path=$ProjectRoot_Path/bin/release/Game
 
#Export目录
TargetExport_Path=$CurrentDir/package/ios
 
#签名
IPA_SignIdentiy= "xxxxxxxxxxxxxxxxxxx"
IPA_ProvisionIdentiy= "xxxxxxxxxxxxxxxxxxxxx"
 
#要生成的Target名字
ProjectTargets_Array=( "Game_91"  "Game_kuaiyong"  "Game_pp"  "Game_tongbu" )


二、发布脚本publish_ipa.sh

说明:

1、如果你只想打出ipa,不想上传ftp,那就直接运行这个脚本,然后ipa自动生成在package/ios下

2、可以模块化执行,比如本次你只执行更新svn,但不需要执行资源加密等过程(之前已经弄好过了),那就把一些函数用#注释掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /bin/sh
 
#根目录
RootDir=`dirname $0`
 
#加载配置文件
.  $RootDir/config.txt
 
#加载自动更新SVN脚本
.  $RootDir/script/update_svn.sh
 
#加载拷贝资源脚本
.  $RootDir/script/copy_resouce.sh
 
#加载压缩PNG脚本
.  $RootDir/script/compress_png.sh
 
#加载压缩PNG脚本
.  $RootDir/script/encrypt.sh
 
#lua脚本编译成字节码
.  $RootDir/script/compile_luajit.sh
 
#加载编译工程函数库
.  $RootDir/script/build_ipa.sh
 
function main()
{
     updateSvn
     copyResource
     compressPNG
     encryptPNG
     encryptTableData
     complieLuajit
     buildProject
}
 
main


三、更新svn  script/update_svn.sh

四、拷贝资源 script/copy_resouce.sh

说明:把签出的resource拷贝到Game/Resouece下


五、压缩png script/compress_png.sh

说明:

1、使用的是pngquant,将全色png为256色的png8

2、工具所在目录是tool/ImageAlpha.app

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/sh
 
#压缩纹理
 
Compress_ProcessPath_Resource=$DestinyPath_Resource
 
#工具目录
Compress_ToolPath=$CompressTool_Path
 
#压缩png
function compressPNG()
{
     echo   "-------Start Compress PNG : "  $Compress_ProcessPath_Resource  " ---------------"
     
     cd $Compress_ToolPath
     
     imageNumber=0
     tmpfilename=nill
 
     for  filename in `find $Compress_ProcessPath_Resource -name  "*.png" `
     do
        ./pngquant 256 --ext _tmp.png   $filename
        rm -rf  $filename
        imageNumber=$[imageNumber+1]
     done
 
     echo   "start to rename Procedure!"
 
     for  filename in `find $Compress_ProcessPath_Resource -name  "*.png" `
     do
         tmpfilename=`echo ${filename%*_tmp*}`
         mv $filename  $tmpfilename.png
     done
 
     echo   "-------End Compress PNG with ImageNumber: "   $imageNumber   "Success Finished ! ---------------"
 
     cd $Script_RootDir
}


六、加密png和数据文件 script/encrypt.sh

说明:

1、加密方式是简单的抑或加密

2、可执行文件目录是 tool/EncryptPacker

3、png使用前EncryptDataLen(见config.txt)的长度字节加密,数据文件全部加密

4、如果你要给png加密,需要自己手动修改加载png的源文件代码(cocos2dx的在bool initWithImageFile(const char * strPath, EImageFormat imageType = kFmtPng)等地方)

5、这里给出机密工具( tool/EncryptPacker)的c++代码文件(因为使用的抑或加密,所以加密和解密代码一样的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//
//  main.cpp
//  EncryptPacker
//
//  Created by Blue on 14-6-4.
//  Copyright (c) 2014年 Blue. All rights reserved.
//
 
#include <iostream>
#include <string>
#include <fstream>
 
 
using  namespace  std;
 
const  char * g_pszDesc =  "Usage:\n\t./EncryptPacker inputfile key limitlength\n\nDesc:\n\tinputfile\t\tthe soucre file which will be encrypted(it will be replaced after encrypting)\n\tkey\t\t\t\tthe secret key(at least one character)\n\tlimitlength\t\tthe length of this file'data will be encrypted(0 means full lenth of the file)\n\nExample:\n\t./EncryptPacker a.txt xxxxxxxx 100\n" ;
 
int  main( int  argc,  const  char  * argv[])
{
     if  (argc<4)
     {
         std::cout << g_pszDesc;
         return  0;
     }
     
     /*
     for (int i=1; i<argc; i++)
     {
         cout<<argv[i]<<endl;
     }
     */
     
     const  string strInputFile = argv[1];
     FILE * fp =  fopen (strInputFile.c_str(),  "r" );
     if  (!fp)
     {
         cout<< "read file [" <<strInputFile.c_str()<< "] failed" <<endl;
         return  0;
     }
     
     const  string strKey = argv[2];
     size_t  nKeyLen = strKey.length();
     if  (strKey.empty())
     {
         cout<< "input key" <<endl;
         return  0;
     }
     
     int  nLimitlength =  atoi (argv[3]);
     if  (nLimitlength<0)
     {
         cout<< "limitlength must >= 0" <<endl;
         return  0;
     }
     
     fseek (fp,0,SEEK_END);
     long  lLen =  ftell (fp);
     fseek (fp,0,SEEK_SET);
     unsigned  char * pBuffer =  new  unsigned  char [lLen+1];
     pBuffer[lLen] =  '\0' ;
     fread (pBuffer, sizeof (unsigned  char ), lLen,fp);
     fclose (fp);
     
     if  (nLimitlength>0)
     {
         for ( int  i=0; i<nLimitlength && i<lLen; i++)
         {
             unsigned  char  cTemp = pBuffer[i];
             pBuffer[i] = cTemp^strKey.at(i%nKeyLen);
         }
     }
     else
     {
         for ( int  i=0; i<lLen; i++)
         {
             unsigned  char  cTemp = pBuffer[i];
             pBuffer[i] = cTemp^strKey.at(i%nKeyLen);
         }
     }
     
     
     FILE * wfp =  fopen (strInputFile.c_str(),  "w" );
     fwrite (pBuffer, lLen, 1, fp);
     fclose (wfp);
     
     delete [] pBuffer;
     
     std::cout <<  "Encrypt [" <<strInputFile.c_str()<< "] successfully!\n" ;
     
     return  1;
}


七、加密lua脚本 script/compile_luajit.sh

说明:使用tool/luajit/luajit把lua脚本编译成字节码(不要搞什么自己加密了,这样做好处多多,自行百度)


八、生成ipa并签名 script/build_ipa.sh

九、上传ftp upload_ftp.sh(我还会自动帮你把dYSM文件备份,以备后面查看崩溃堆栈用)


使用方式

一、只打ipa包,不上传ftp

1)那就打开命令行工具cd到publish_package,敲入sh publish_ipa.sh,回车

2)漫长等待后会在package/ios下生成ipa


二、生成ipa并上传ftp

1)那就打开命令行工具cd到publish_package,敲入sh upload_ftp.sh,回车

2)漫长等待后会在ftp你指定的目录下生成一个以今天日期命名的文件夹,里面躺着ipa,如20140804/Game_20140804.ipa和dSYM_20140804.tar(dSYM的压缩包)


最后附上工具套:publish_package.rar


欢迎加入CocoaChina社区参与本帖的学习和讨论。


来源网址:http://www.cocoachina.com/bbs/read.php?tid=218701

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值