请问如何在win环境下免费使用xcode for win7?还有就是求点击按钮进入另一个界面的代码

点击按钮跳到页面底部代码 求教高手 急!!!_百度知道
点击按钮跳到页面底部代码 求教高手 急!!!
);&lt&).Redirect(&#&alert('&;成功'/alert('&成功');script&/ 这是在后台写的 怎么时间一点弹出框的确定
就会自动跳到页面底部?Rscript& 就在这个弹出的框中 一点确定 就自动跳到页面的底部 怎么实现,&quot? 我只知道用锚点可以做 锚点在哪加;script& &script&gt
提问者采纳
打开动作面板,用选择工具点选按钮把现在的帧起个名字,添加脚本,比如叫1,把你要跳到的帧起名为2 如果不会起名字
再说具体点吧 on(release){gotoAndplay(x) 在哪里加? 这跳到的地方该怎么写?
其他类似问题
为您推荐:
其他2条回答
button&IsSure():function IsSure(){
var mes=confirm(&&quot有确定和取消功能的函数
comfirm(“提示信息”);
if(mes==true){您确定要**吗;type=&quot?&shanchu&&);
else{ }}&input id=&/ value=&删 除& onclick=&就一个参数即提示信息 有返回值 true或false 用法为如下在js中
&a id='1' href=&#1&&...&/a&&script&alert('陈功');document.getElementID('1').click&/script&
大哥 不对啊 是不是哪块写错了啊
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请问如何在win环境下免费使用Xcode?还有就是求点击按钮进入另一个界面的代码_百度知道
请问如何在win环境下免费使用Xcode?还有就是求点击按钮进入另一个界面的代码
xcode是mac的软件开发系统,不能在win环境中运行如果想要使用的话可以使用虚拟机或者双系统如果你是win系统可用QT做界面设计,简单明了,不用代码编写按钮
你说的QT可以做天气软件吗
我不知道你想做什么软件,我们去年用Qt Creator做了一个媒体播放器,Qt Creator有免费版可以在网上下载。我吧我们学校的教程私信给你,但请不要外传,谢谢。
其他类似问题
为您推荐:
xcode的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Scintilla控件在Win32环境上的使用(二)_svn跟apache傻瓜式集成和手动集成_xcodebuild跟xcrun实现自动打包iOS应用程序__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
Scintilla控件在Win32环境上的使用(二)
svn跟apache傻瓜式集成和手动集成
xcodebuild跟xcrun实现自动打包iOS应用程序
Scintilla控件在Win32环境上的使用(二)
Scintilla控件在Win32环境下的使用(二)这节的目标就是写出语法高亮,代码折叠这两个效果。
还是首先给大家发个效果图看一下:
主要参考文档:
/superanyi/archive//2008632.html
/superanyi/archive//2008636.html
当然官方文档是必不可少的。
其实有了第一节的工作,如果你玩过vim,那么接下来的工作有点类似于配置.vimrc文件了。
只不过比配置vimrc文件麻烦的是我们要自己确定发送消息的时机。
让Scintilla支持语法高亮
有了前面的SendEditor控制函数,我们就可以配置语法高亮了,下面这段代码可以使我们的Scintilla控件显示C++语法高亮代码:
const char* g_szKeywords=
"asm auto bool break case catch char class const "
"const_cast continue default delete do double "
"dynamic_cast else enum explicit extern false finally "
"float for friend goto if inline int long mutable "
"namespace new operator private protected public "
"register reinterpret_cast register return short signed "
"sizeof static static_cast struct switch template "
"this throw true try typedef typeid typename "
"union unsigned using virtual void volatile "
"wchar_t while";
SendEditor(SCI_SETLEXER, SCLEX_CPP); //C++语法解析
SendEditor(SCI_SETKEYWORDS, 0, (sptr_t)g_szKeywords);//设置关键字// 下面设置各种语法元素前景色
SendEditor(SCI_STYLESETFORE, SCE_C_WORD, 0x00FF0000);
SendEditor(SCI_STYLESETFORE, SCE_C_STRING, 0x); //字符串
SendEditor(SCI_STYLESETFORE, SCE_C_CHARACTER, 0x); //字符
SendEditor(SCI_STYLESETFORE, SCE_C_PREPROCESSOR, 0x);//预编译开关
SendEditor(SCI_STYLESETFORE, SCE_C_COMMENT, 0x);//块注释
SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTLINE, 0x);//行注释
SendEditor(SCI_STYLESETFORE, SCE_C_COMMENTDOC, 0x);//文档注释(/**开头)上面这段代码自己在c下面还得改一改。在第一篇里面自己定义的SendEditor函数是有四个参数的。所以我在传递参数的时候也必须满足4个参数。
所以所有关于SendEditor的函数就变成了类似下面这样:
SendEditor(ptr,SCI_SETLEXER, SCLEX_CPP, 0);
//C++语法解析
语法解析只负责把代码拆分开,至于哪些是关键字,还得我们来指定。
要支持语法高亮,要做三件事:
一、选定语法解析器设置关键字
语法解析器用于把一大段代码分解成一个个的单词(token),另外还用于代码折叠的控制(后面会说到)。
选定语法解析器的命令是SCI_SETLEXER,如:
SendEditor(SCI_SETLEXER, SCLEX_CPP);
除了SCLEX_CPP以外,还有SCLEX_HTML、SCLEX_PERL、SCLEX_SQL、SCLEX_VB等一大堆,定 义在SciLexer.h里。现代的IDE应该可以定位SCLEX_CPP定义,它周围的SCLEX_XXX就是其它的语法解析器。
另外,也可以用SCI_SETLEXERLANGUAGE命令,如:
SendEditor(SCI_SETLEXERLANGUAGE, 0, (sptr_t)"cpp");
SCI_SETLEXERLANGUAGE接受的是一个字符串参数,这个字符串定义于代码解析器源代码(src\lex*.cxx) 最后面LexerModule开头的那行代码,那里的第三个参数就是。
二、设置关键字
语法解析只负责把代码拆分开,至于哪些是关键字,还得我们来指定。
这种方式带来了些许的灵活性,比如我们要高亮一种自定义的语言,这种语言的风格与C++类似(如Java、C#、php等),我们也 可以选定SCLEX_CPP作为语法解析器,然后定义自己的关键字。(所以不需要把各种解析器都编译进DLL文件里)
设置关键字的命令是SCI_SETKEYWORDS。它的wParam用于指定关键字种类,可以是0~8即9种类型,这样我们可以做 更细致的区分,如把关键字for if和int bool区分显示。lParam指定关键字,以空格分隔。
三、设置文本元素对应的字体风格
即字体、前景色、背景色、斜体粗体等
设置字体风格的命令以SCI_STYLE作为前缀,这组命令比较多,为了不浪费篇幅,偶这里只列举几个,其它的可以参考这里
(http://scintilla.sourceforge.net/ScintillaDoc.html#StyleDefinition)
SCI_STYLESETBACK(int styleNumber, int colour) //设置背景色
SCI_STYLESETFORE(int styleNumber, int colour) //设置前景色
SCI_STYLESETFONT(int styleNumber, char *fontName) //设置字体
SCI_STYLESETSIZE(int styleNumber, int sizeInPoints)//设置字号
SCI_STYLESETBOLD(int styleNumber, bool bold) //设置粗体
SCI_STYLESETBACK(int styleNumber, int colour) //设置背景色
SCI_STYLESETFORE(int styleNumber, int colour) //设置前景色
SCI_STYLESETFONT(int styleNumber, char *fontName) //设置字体
SCI_STYLESETSIZE(int styleNumber, int sizeInPoints)//设置字号
SCI_STYLESETBOLD(int styleNumber, bool bold) //设置粗体
这里的styleNumber是指文本元素,如关键字、行号、控制字串等。前面代码中的SCE_C_XXXX是C++解析器分解出的 语法相关的元素。另外还有
STYLE_DEFAULT(默认)
STYLE_LINENUMBER(行号)
STYLE_BRACELIGHT(括号匹 配)
STYLE_BRACEBAD(括号失配)
STYLE_CONTROLCHAR(控制字符)
STYLE_INDENTGUIDE(缩进线)
STYLE_CALLTIP(调用提示)
SCI_STYLECLEARALL //把所有文本元素设置成与STYLE_DEFAULT相同的风格
Scintilla文档建议的顺序是先向STYLE_DEFAULT设置一些通用风格,然后再用SCI_STYLECLEARALL 把所有元素风格重置成与STYLE_DEFAULT一致,最后单独设置其它元素。
加上当前行高亮功能:
SendEditor(SCI_SETCARETLINEVISIBLE, TRUE);
SendEditor(SCI_SETCARETLINEBACK, 0xb0ffff);把TAB宽度由默认的8改为4(依个人习惯~~) SendEditor(SCI_SETTABWIDTH, 4);
让Scintilla实现代码折叠
页边(Margins)和标记(Markers)
代码折叠是现代IDE和代码编辑器的必备功能,如果现在推出一个不支持折叠的编辑器,那是要被BS地~~。为了不被BS,很有必要先“研究”一下Scintilla的页边(Margins)和标记(Markers)功能。
页 边(Margins):页边是位于文本显示区左边的一竖条区域,它可以用于显示行号、书签、断点标记等东东。Scintilla最多可以有5个页边(从左 到右的编号为0~4),每个页边可以使用SCI_SETMARGINTYPEN命令确定是用于显示行号还是符号。我们可以用 SCI_SETMARGINWIDTHN命令控制一个页边的宽度,如果设置为0,则表示不显示该页边。默认是只显示宽度为16的1号页边。
标 记(Markers):标记,不用说也知道是用来标记文本位置(确切地说,是文本行)的。我们可以使用32种标记(编号0~31),我们可以自由决定这 32种标记的意义,如标记0用来表示断点、标记1~10表示书签、标记20表示语法错误行等等。不过,如果编辑器要支持代码折叠功能,我们得把标记 25~31留出来,把这7个标记作为代码折叠专用标记(后面还会讲到)。
告诉页边显示哪些标记
当页边不是设定为显示行号时(由SCI_SETMARGINTYPEN命令设置),那么它就会显示标记。刚才说过Scintilla有32种标记,一般来说不会让一个页边来显示所有的标记,而是只显示部分标记。
在一个页边里可以显示哪几种标记由SCI_SETMARGINMASKN命令设置,它的参数是一个32位掩码(mask)值,掩码值的第n位为1时表示该页边可显示n号标记。
所有页边相关的命令以SCI_SETMARGIN或SCI_GETMARGIN作为前缀,如:
SCI_SETMARGINTYPEN(int margin, int type)
设置页边显示行号还是符号,type可以是SC_MARGIN_SYMBOL或SC_MARGIN_NUMBER
SCI_SETMARGINWIDTHN(int margin, int pixelWidth)
设置页边宽度
SCI_SETMARGINMASKN(int margin, int mask)
设置页边掩码
SCI_SETMARGINSENSITIVEN(int margin, bool sensitive)
设置页边是否接受鼠标点击事件
所有标记相关的命令以SCI_MARKER作为前缀,如:
SCI_MARKERADD(int line, int markerNumber)
在指定行加入一个markerNumber号标记
SCI_MARKERDEFINE(int markerNumber, int markerSymbols)
定义markerNumber号标记的样式
SCI_MARKERDELETE(int line, int markerNumber) 在指定行上的删除markerNumber号标记
SCI_MARKERDELETEALL(int markerNumber) 删除文本中所有markerNumber号标记
SCI_MARKERSETFORE(int markerNumber, int colour) 为markerNumber号标记指定前景色
SCI_MARKERSETBACK(int markerNumber, int colour) 为markerNumber号标记指定背景色
// 先写10行文本上去
for(int i=0; i&10; i++)
SendEditor(ptr,SCI_APPENDTEXT, 12, (sptr_t)"hello world\n");
// 1号页边,宽度为20,显示行号
SendEditor(ptr,SCI_SETMARGINTYPEN,1, SC_MARGIN_NUMBER);
SendEditor(ptr,SCI_SETMARGINWIDTHN,1, 20);
for(int i=0; i&10; i++)
// 前10行分别加入0~2号标记
SendEditor(ptr,SCI_MARKERADD, i, i%3);
// 设置标记的前景色
SendEditor(ptr,SCI_MARKERSETFORE,0,0x0000ff);//0-红色
SendEditor(ptr,SCI_MARKERSETFORE,1,0x00ff00);//1-绿色
SendEditor(ptr,SCI_MARKERSETFORE,2,0xff0000);//2-蓝色
如果你不喜欢这些圆圈,可以用SCI_MARKERDEFINE命令改变标记的样式,可选的有:
SC_MARK_CIRCLE, SC_MARK_ROUNDRECT, SC_MARK_ARROW, SC_MARK_SMALLRECT,
SC_MARK_SHORTARROW, SC_MARK_EMPTY, SC_MARK_ARROWDOWN, SC_MARK_MINUS,
SC_MARK_PLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_TCORNER, SC_MARK_BOXPLUS,
SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUS, SC_MARK_BOXMINUSCONNECTED,
SC_MARK_LCORNERCURVE, SC_MARK_TCORNERCURVE, SC_MARK_CIRCLEPLUS,
SC_MARK_CIRCLEPLUSCONNECTED, SC_MARK_CIRCLEMINUS, SC_MARK_CIRCLEMINUSCONNECTED,
SC_MARK_BACKGROUND, SC_MARK_DOTDOTDOT, SC_MARK_ARROWS, SC_MARK_PIXMAP,
SC_MARK_FULLRECT, SC_MARK_LEFTRECT, SC_MARK_CHARACTER
默认是SC_MARK_CIRCLE,小圆圈。你可以试试其它的。(注意SC_MARK_CHARACTER比较特殊,它和一个ASCII码加起来决定标记显示为一个对应的ASCII字符)
有了这些基础,我们可以动手为Scintilla加入代码折叠功能了...
前面曾说过当编辑器有代码折叠功能时,25号到31号这7个标记是作为代码折叠专用标记的。在scintilla.h中,我们可以找到它们的定义:
#define SC_MARKNUM_FOLDEREND 25
//折叠状态(多级中间)
#define SC_MARKNUM_FOLDEROPENMID 26
//展开状态(多级中间)
#define SC_MARKNUM_FOLDERMIDTAIL 27
//被折叠代码块尾部(多级中间)
#define SC_MARKNUM_FOLDERTAIL 28
//被折叠代码块尾部
#define SC_MARKNUM_FOLDERSUB 29
//被折叠的代码块
#define SC_MARKNUM_FOLDER 30
//折叠状态
#define SC_MARKNUM_FOLDEROPEN 31 //展开状态
显示这些标记的掩码是0xFE000000,同样头文件里已经定义好了
#define SC_MASK_FOLDERS 0xFE000000
要加入代码折叠功能,还有一个最最关键的事情,就是要得到语法解析器(Lexer)的支持,上面的这些标记都是由语法解析器自动添加删除的。一般来说,只要用下面这条命令就可以了让语法解析器支持代码折叠了:
SendEditor(SCI_SETPROPERTY,(sptr_t)"fold",(sptr_t)"1");
然后设置一下折叠属性样式:
SendEditor(ptr,SCI_SETPROPERTY,(sptr_t)"fold",(sptr_t)"1");
SendEditor(ptr,SCI_SETMARGINTYPEN, MARGIN_FOLD_INDEX, SC_MARGIN_SYMBOL);//页边类型
SendEditor(ptr,SCI_SETMARGINMASKN, MARGIN_FOLD_INDEX, SC_MASK_FOLDERS); //页边掩码
SendEditor(ptr,SCI_SETMARGINWIDTHN, MARGIN_FOLD_INDEX, 11); //页边宽度
SendEditor(ptr,SCI_SETMARGINSENSITIVEN, MARGIN_FOLD_INDEX, TRUE); //响应鼠标消息
// 折叠标签样式
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND,
SC_MARK_CIRCLEPLUSCONNECTED);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);
SendEditor(ptr,SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);
// 折叠标签颜色
SendEditor(ptr,SCI_MARKERSETBACK, SC_MARKNUM_FOLDERSUB, 0xa0a0a0);
SendEditor(ptr,SCI_MARKERSETBACK, SC_MARKNUM_FOLDERMIDTAIL, 0xa0a0a0);
SendEditor(ptr,SCI_MARKERSETBACK, SC_MARKNUM_FOLDERTAIL, 0xa0a0a0);
SendEditor(ptr,SCI_SETFOLDFLAGS, 16|4, 0); //如果折叠就在折叠行的上下各画一条横线
当然还有最最关键的一步是什么时候要知道什么时候折叠。
我们在点击页边的时候(这里我用了自己的方法,根据margin页码数目来判断的)
#define MARGIN_FOLD_INDEX 2
if(lpnmhdr-&hwndFrom==hwndScintilla)
switch(lpnmhdr-&code)
case SCN_MARGINCLICK:
if (notify-&margin == MARGIN_FOLD_INDEX)
line_number = SendEditor(ptr,SCI_LINEFROMPOSITION,notify-&position,0);
SendEditor(ptr,SCI_TOGGLEFOLD, line_number,0);
}好啦。这样一来我们就实现了代码高亮和代码折叠这两个功能了。
如果想继续深入学习更多scintilla的功能的话,就只能啃读官方文档了。
svn跟apache傻瓜式集成和手动集成
svn和apache傻瓜式集成和手动集成1.傻瓜式实现:
用SVN可视化服务器喽.去下个最新的VisualSVN
,也就是SVN服务器和apache服务器都已经集成好的东西.不用再去看那么一堆堆的贴子.一跳NEXT安装使用.就可以轻松+HAPPY的完成svn服务器的搭建.
重要的是.visulSVN这东西商家脑子有问题:服务器是免费的,客户端是收费的.(用的就是你方便的服务器 - -,真傻.客户端我们有TortoiesSVN
嘛~).安好后,用这东西新建个仓库.
OK了.加开Brows-&https://127.0.0.1/svn/仓库名/
一切就这么简单!
2.人工手动,就是麻烦: - -
参考:http://www.blogjava.net/hadeslee/archive//185788.html
下面的请注意着点看:不然会晕的.
1,apache_2.2.x-win32-x86-no_ssl.msi
2,svn-1.6.x-setup.exe
依然TortoiseSVN
首先要建立一个数据仓库,我们假设建在E盘.
我们先在E盘下面建立一个目录叫svnroot,然后在svnroot下面再建立一个我们专门放我们工程的目录,比如叫MyProject.
于是我们在E盘下面就有了这个一个文件夹:E:\svnroot\MyProject
,然后我们用svnadmin的命令,使这个文件夹变成我们的数据仓库,命令如下:svnadmin create E:\svnroot\MyProject(其实完全可以用tortoiseSVN的create Repositry,用工具干麻不用.我这种小菜,以应用为王~)
如果运行成功的话,什么也没有输出,这个时候,我们再来到MyProject文件夹下面,我们会发现多了几个文件夹和文件,我们打开conf
文件夹,然后再打开svnserve.conf
件,找到如下行
# password-db =
然后把它前面的#去掉,表示MyProject是需要密码验证的.但是我们密码设在哪里呢,这个时候我们再打开conf文件夹下面的
passwd文件,用文本编辑器打开,在[users]下面加上我们需要启动的人员的用户和密码,比如
这个的话,我们就启动了两个用户,一个叫hadeslee,密码是hadeslee1234,一个叫tom,密码是123456.然后我们保存passwd
文件.然后,我们再建一个文件,叫access.auth
,这个文件是设置访问权限的,里面内容如下:
[MyProject:/]
[MyProject:/module1]
##svn结束,开始apache配置##
首先来到Subersion的安装目录,进入它的bin目录,我们会发现如下两个文件:
mod_authz_svn.so
mod_dav_svn.so
我们把这两个文件复制一下,粘帖到apache的安装目录下的modules文件中,然后我们再打开apache安装目录下的conf文件夹,打开httpd.conf文件.增加如下两行:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
注意,由于dav_svn需要dav_module的支持,所以要确保下面这一行没有被注释,并且保证在dav_svn之前加载:
LoadModule dav_module modules/mod_dav.so
然后模块的设置就完成了,下面我们要设置SVN的目录,以使我们的apache能知道访问不同的URL的时候,它去哪里寻找这个URL所对应的SVN目录.
在httpd.conf
文件中,增加如下内容:
&Location /svn/MyProject&
SVNPath E:/svnroot/MyProject
AuthzSVNAccessFile E:/svnroot/MyProject/conf/access.auth
Satisfy Any
Require valid-user
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile
E:/svnroot/MyProject/conf/users.auth
Require valid-user
&/Location&
添加完上面这些,我们会发现access.auth
是我们刚才新建的,可是users.auth
我们并没有新建啊.怎么就把它加进去了.不要急,现在我们就来生成users.auth
进入apache的安装目录的bin文件夹,输入如下命令:D:\Program Files\Apache Group\Apache2\bin&htpasswd -c -b users.auth bacon 123
Automatically using MD5 format.
Adding password for user hadeslee
D:\Program Files\Apache Group\Apache2\bin&
我们就会发现在bin目录生成了users.auth,我们可以看到,hadeslee用户名已经被添加进去了,密码是用MD5加密过的.然后我们还要增加用户呢,可以用如下方法:D:\Program Files\Apache Group\Apache2\bin&htpasswd -b users.auth admin 123
Automatically using MD5 format.
Adding password for user tom
D:\Program Files\Apache Group\Apache2\bin&
只是在生成密码的时候,小了一个c的参数,因为c表示重新生成一个这样的文件,我们第一次的时候是要加的,后面我们要添加用户的时候,就不用这个c了.然后打开users.auth
,会发现两个用户都已经在里面了,这个时候,我们把users.auth
移到E:/svnroot/MyProject/conf/
里面去,使我们上面的设置生效.
xcodebuild跟xcrun实现自动打包iOS应用程序
xcodebuild和xcrun实现自动打包iOS应用程序引用
随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各种不便。
随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各种不便。自动化打包背景介绍1、背景随着ios程序发布的渠道逐渐的增多,为每个渠道打包也成为特别耗费时间和体力的一项技术活了,而这一般大多数都是由rd来完成的。这样就占用了 rd很多的开发时间,何不把这些东西写成一个自动化的脚本,然后交给qa 或是 pm来完成这个打包过程了。经过一番调研发现网上这种脚本还是很少的,不过xcode 提供了shell编译工具 xcodebuild 和 ipa打包工具xcrun ,这就有理由让我们利用这两个工具写一个自动化的打包脚本来提高我们的工作效率和自动化程度。2、ios程序包格式、渠道包格式1) 产生多渠道的原因及多渠道带来的打包问题:随着iphone、ipad、itouch等手持设备火热销售,而它们上面的应用也随之火爆了起来,而随之而来的就是以上设备被越狱后就可以在越狱的设备上直接运行ipa程序包 而不用通过appstore去下载,这样一来国内就产生了众多的专门为越狱手机而开设的渠道提供ipa程序包的下载。随着越来越多的渠道,推广时为各个渠道打包就成了一项比较耗费时间和精力的技术活了,因此我们必须寻找一种自动化的方式 让打包变得高效简单。2) Ios程序包分为appstore二进制文件跟渠道包两种格式appstore二进制文件:通过xcode工具可以生成一个.app格式的二进制文件。渠道包:格式为.ipa格式,在没有自动化打包工具之前都是利用xcode来生成相应的渠道包,而且每次只能生成一个渠道包,每次打包之前都得手动该渠道ID,带来的问题就是耗费时间、效率低下、容易出错、增加风险。3、传统的ios打包方式利用xcode 打包1) appstore 二进制程序包打开你的项目,进入“Edit Project Settings”,进入Configuration页面,选中Release点击下面的Duplicate,复制一个新的配置项出来,命名为 Distribution。然后进入Build页面,顶上的Configuration下拉框选中Distribution,下面的Code Signing Identity里面的Any iPhone OS Device后面对应的值选中你的那个Distribution的证书。然后点击“Build”–& “Build” 就可以编译程序了编译成功后,你就可以在相应的build目录下看到一个.app的二进制文件。2) 渠道ipa包根据以上步骤同样配置好Distribution 证书 ,然后点击 “Build”–& “Build and Archive” 就可以编译程序了。接着打开“Window”?”Organizer” 左边栏中选择”ARCHIVED APPLICATIONS” 然后再右侧列表中选中刚才编译的程序包 再点击右侧右边顶部的”Share”按钮 保存到磁盘即可。就会生成一个.ipa的文件 即为渠道包。注意:以上运行设备必须选择“Deveice“4、传统的打包带来的问题耗费时间、耗费体力、效率低下、只能依赖RD来完成、容易出错、发布风险比较高、QA回归确认比较困难、 不智能化。自动化打包具体实现C/C++ Code复制内容到剪贴板
xcodebuild[-project][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]...
xcodebuild[-version[-sdk |]]
xcodebuild[-showsdks]
xcodebuild[-find ][-sdk |]
xcodebuild[-list]
1、xcodebuild 介绍:也可以在终端输入:xcodebuild –help 或 –h查看具体的选项显示xcodebuildversion:xcodebuild –version显示当前系统安装的sdk:xcodebuild –showsdks显示当前目录下project Information:xcodebuild –list需要注意的是:执行以上命令时必须把位置定位在ios项目文件的根目录下 否则会提示找不相关命令的。2、xcrun 介绍:此工具主要用于将app文件打包成ipa格式的程序包。(主要用于已越狱手机)。具体用法如下:其中:-v 对应的是app文件的绝对相对路径 –o 对应ipa文件的路径跟文件名 –sign对应的是 发布证书中对应的公司名或是个人名
–embed 对应的是发布证书文件注意如果对应的Distribution 配置中已经配置好了相关证书信息的话 –sign 和 –embed可以忽略3、具体方案a) 从源程序一次性打出所有渠道的ipa包 跟appstore的二进制包为了让自动化脚本执行一次把所有的渠道包都打好,所以必须有一个配置文件用来存储所有的渠道名跟渠道号,而项目文件中也应该有个对应存储当前渠道号的文件,每次程序都从这个存放渠道号的文件中读取渠道号即可,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号的文件为当前循环的最新渠道号,让后逐个打包。注:具体事例见附录b) 提供一个ipa格式的母包 从母包生成其它所有的渠道包跟 appstore 包qa的一些疑问,如何确保所有的渠道包就是他们验证过的那份代码呢?的确,以上代码每次都是重新对程序进行打包,可qa往往测试验证的只有一个包,如果个个去验证无意中之中又增加了qa的工作量哈!!而且风险也不可控。因此基于上面的问题我们想出了一下办法:qa只验证一个程序包(即母包)如果这个包通过验证 我们就通过母包去生成其它渠道的包,这样一来qa也不用确认那么多的渠道包了,风险也得到了有效的控制。可能你会问:用一个包生成其他的包可行么??原因是这样的:因为每个渠道只是渠道号发生变化,而其他的内容又不会发生变化,而我们的渠道号又是存储在sourceid.dat这个文件中的,所以只要改变母包中的sourceid.dat文件的内容即可,而ipa包又是同zip格式进行压缩,所以基本思路就是通过zip先对母包进行解压,然后改变sourceid.dat的内容 最后再用zip进行压缩成相应的渠道包即可。Ipa包的目录:注:具体事例见附录一些问题当有些shell命令在mac的终端中运行不通过时,请确保你的shell脚本是在mac环境下编写的而不是同xp等其他环境中copy过来的。因为mac跟xp的编码是不一样所以会有问题。总结:通过从母包打出其他渠道的包这种方法:得到以下好处i.
降低了rd的工作量,一起qa的工作量。ii.
让测试发布程序时的风险得到了控制。iii. 提高了打包发布工作效率。(几十个包 只需短短的几分钟)。iv. 提高了自动化。v. 不依赖mac 以及xcode环境 直接在linux 下即可完成 从母包生成其它包附录利用xcode环境一次生成所有包的shell 脚本代码:C/C++ Code复制内容到剪贴板#!/bin/sh
xcodebuild clean -configuration Distribution
//clean项目
distDir="/Users/xxxx/dist"
releaseDir="build/Distribution-iphoneos"
version="1_0_0"
rm -rdf "$distDir"
mkdir "$distDir"
for line in $(cat data.dat)
//读取所有渠道号data.dat文件
ipafilename=`echo $line|cut -f1 -d':'` //渠道名
sourceid=`echo $line|cut -f2 -d':'`
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="youtargename"
//项目名称(xcode左边列表中显示的项目名称)
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
echo "$sourceid" & sourceid.dat
echo "sourceid.dat: "
cat sourceid.dat
rm -rdf "$releaseDir"
ipapath="${distDir}/${targetName}_${version}_from_${sourceid}.ipa"
echo "***开始build app文件***"
xcodebuild -target "$targetName" -configuration Distribution
-sdk iphoneos build
appfile="${releaseDir}/${targetName}.app"
if [ $sourceid == "appstore" ]
cd $releaseDir
zip -r "${targetName}_${ipafilename}_${version}.zip" "${targetName}.app"
mv "${targetName}_${ipafilename}.zip" $distDir 2& /dev/null
echo "***开始打ipa渠道包****"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipapath" --sign "iPhone Distribution:xxxxxx"
注:以上的data.dat文件为存放渠道号列表的文件 其格式为:3g:1001b 即 (渠道名:渠道号) sourceid.dat 为项目文件中存放渠道号的文件(内容只有一个渠道号)。当然了上面脚本只是说明了下如何利用xcodebuild 和 xcrun 进行打包 以及自动打包的一个逻辑,shell脚本好的同学可以自由发挥哈。。。从ipa格式的母包生成其它渠道包的shell脚本实例:复制内容到剪贴板#!/bin/sh
sourceipaname="母包名.ipa"
appname=”app文件名.app”
//加压后Pauload目录项.app文件名需要根据自己的项目修改
distDir="/Users/lxxx/Qa"
//打包后文件存储目录
version="1.0.0"
rm -rdf "$distDir "
mkdir "$distDir" unzip $sourceipaname
//解压母包文件
for line in $(cat data.dat)
//读取渠道号文件并进行循环
ipafilename=`echo $line|cut -f1 -d':'`
sourceid=`echo $line|cut -f2 -d':'`
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="ipa包名"
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
cd Payload
cd $appname
echo "replace sourceid.dat before: "
cat sourceid.dat
echo "$sourceid" & sourceid.dat
echo "replace sourceid.dat after: "
cat sourceid.dat
if [ $sourceid == "appstroe" ]
zip -r "${targetName}_${version}_from_${sourceid}.zip" $appname //appstore二进制文件
mv "${targetName}_${version}_from_${sourceid}.zip" $distDir
zip -r "${targetName}_${version}_from_${sourceid}.ipa" Payload
//打成其他渠道的包
mv "${targetName}_${version}_from_${sourceid}.ipa" $distDir
done rm -rdf Payload
注:以上data.dat也是用来存储所有渠道号的,sourceipaname就是通过qa验证的母包,appname为ipa包加压后Payload 目录下的app文件名并且以上所有文件必须与脚本文件保持在同一目录下以及在mac环境中执行。扩展阅读:/qq/archive//2077323.html原文:http://stblog./?p=1295
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 xcode win7 的文章

 

随机推荐