当前位置:  编程技术>移动开发
本页文章导读:
    ▪Xcode 4.5.2免证件(iDP)开发        Xcode 4.5.2免证书(iDP)开发 操作系统:os x lion 10.8.2 xcode: 4.5.2 ios:6.0 在没有iDP的情况下,要想将程序放到iPhone上调试,并最终发布IPA用于分享,需要以下几个步骤: 1.自己为自己颁发一个证.........
    ▪ 温故知新-增添登陆界面,增加验证码功能        温故知新--添加登陆界面,增加验证码功能-----------index.aspx-------------------- <body>     <form id="form1" runat="server">     <div>         <table >             <tr>      .........
    ▪ xcode 批改工程的名字       xcode 修改工程的名字现在我们要把工程的名字Test改为MyApp 应该怎么? 把Project Name 改为MyApp 提示是否重新命名,选择ReName 其实到这已经可以了,只不过我们会发现 MyApp 左边的文件夹名.........

[1]Xcode 4.5.2免证件(iDP)开发
    来源: 互联网  发布时间: 2014-02-18
Xcode 4.5.2免证书(iDP)开发

操作系统:os x lion 10.8.2

xcode: 4.5.2

ios:6.0

在没有iDP的情况下,要想将程序放到iPhone上调试,并最终发布IPA用于分享,需要以下几个步骤:
1.自己为自己颁发一个证书用于为生成的程序签名
2.修改工程配置以及Xcode的配置文件和二进制文件以阻止其验证和签名
3.通过自定义生成步骤,用伪造的证书为应用程序签名
4.使用一点小trick来生成IPA文件

 

第一步:创建证书
创建证书的过程比较简单,打开实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。第一个步骤比较重要,必须 要把名称命名为iPhone Developer,将类型设定为代码签名,将"让我覆盖这些默认值"选中。之后的步骤无需更改,一路点击“确定”和“继续”来完成这个向导就可以。

第二步,修改Xcode的配置文件

需要修改配置文件有两个SDKSettings.plist和Info.plist,在Xcode4.5以前这两个文件都是xml格式,而这之后变成了二进制格式,需要用Xcode来编辑这两个文件。

(1)SDKSettings.plist修改

1) 从Finder中进入文件所在目录

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk

2) 找到SDKSettings.plist文件,并鼠标右击Duplicate一份,在同目录下产生SDKSettings copy.plist文件。

3)双击打开SDKSettings copy.plist文件,默认用Xcode,找到DefaultProperties分支,将下面的CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED两个属性改为NO

4)如果需要备份原文件,则将原文件改名为SDKSettings.plist.bak。然后将SDKSettings copy.plist,改名为SDKSettings.plist。

 

(2)修改Info.plist

1) 从Finder中进入文件所在目录

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform

或是从(1)中后退到该目录。

2) 找到Info.plist文件,并鼠标右击Duplicate一份,在同目录下产生Info copy.plist文件。

3)双击打开Info copy.plist文件,默认用Xcode,将全部的XCiPhoneOSCodeSignContext修改成XCCodeSignContext,即将其中的iPhoneOS去掉,Xcode4.5.1有三处分别位于DefaultProperties分支下、RuntimeRequirements->Classes和OverrideProperties分支下。

3)如果需要备份原文件,则将原文件改名为Info.plist.bak。然后将Info copy.plist,改名为Info.plist。

 

第三步,准备自定义的生成后脚本,此步的执行需要联网,打开teminal。

mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements

cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements

curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt

mv gen_entitlements.txt gen_entitlements.py

chmod 777 gen_entitlements.py


第四步,修改工程设置

特别注意:本阶段之前的修改配置文件、准备脚本等,只需要做一次。但本阶段的操作,对每个需要真机调试的工程都要做一遍。

这个步骤的主要作用是支持真机调试,如果不做这个步骤,仍然可以通过步骤5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序进行单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步骤是否正确完成。

(1)禁用Xcode自动的签名操作,将工程配置中所有的Code Signing选项全部设为Don't Code Sign,如图。


(2)添加自定义的生成后脚本,在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本:

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi


第五步,生成IPA文件

正常情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。只能另找他路,先将代码生成为Release目标,然后打开工程的输出文件夹,通常情况下这个目录是:

/Users/你的用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos

这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出现在应用程序那个列表中,然后再把它从iTunes的那个列表中拖出来(比如拖到桌面),哈哈,它就这样变成.ipa了!

此配置只适用在Xcode4.5.2,其他未尝试。

注意一下:沈阳斌子自己用的时候,发现那个脚本不好用,编译不过去,将脚本删除后就好了,如果哪位牛人知道为什么麻烦告诉一下,谢谢了。

参考文章地址:http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2012/11/15/2772388.html

                        http://blog.sina.com.cn/s/blog_00ccd240010181r9.html

2013年第一篇文章,是摘抄,也是祝各位同仁蛇年快乐,工资节节高。

       ------沈阳斌子



    
[2] 温故知新-增添登陆界面,增加验证码功能
    来源: 互联网  发布时间: 2014-02-18
温故知新--添加登陆界面,增加验证码功能

-----------index.aspx--------------------
<body>
    <form id="form1" runat="server">
    <div>
        <table >
            <tr>
                <td>用户名:</td>
                <td><asp:TextBox ID="txtUserName" runat="server"></asp:TextBox> </td>
            </tr>
            <tr>
                <td>密 码:</td>
                <td><asp:TextBox ID="txtPassword" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                <td>数字验证码:</td>
                <td>
                    <asp:TextBox ID="txtYanZheng1" runat="server" Width="61px" Height="19px"></asp:TextBox><asp:Image ID="Image1" runat="server" ImageUrl="~/pic.aspx" onclick="this.src='/blog_article/pic/yzm/.html'+new Date()"/></td>
            </tr>
            <tr>
                <td>  字母验证码:</td>
                <td> 
                    <asp:TextBox ID="txtYanZheng2" runat="server" Width="61px" Height="19px"></asp:TextBox>  <img alt="" src="/blog_article/HandlerPic.ashx" onclick="this.src='/blog_article/HandlerPic/yzm/.ashx'+new Date()" />
                </td>
            </tr>
            <tr>
                <td>  </td>
                <td> 
                    <asp:Button ID="btnLogin" runat="server" Text="登陆" onclick="btnLogin_Click" />
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>


------------index.aspx.cs--------------------------
  public partial class index : System.Web.UI.Page,IRequiresSessionState
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            if (txtUserName.Text != "admin")
            {
                Response.Write("用户名不正确!");
            }
            else if(txtPassword.Text != "111111")
            {
                Response.Write("密码不正确!");
            }
            else if (txtYanZheng1.Text!= Session["YZM"].ToString())
            {
                Response.Write("数字验证码不正确!");
            }
            else if (txtYanZheng2.Text != Session["CheckCode"].ToString())
            {
                Response.Write("字母验证码不正确!");
            }
            else
            {
                Response.Write("登陆成功!");
            }
        }
    }

--------------pic.aspx.cs--------------------------
 protected void Page_Load(object sender, EventArgs e)
        {
            System.Drawing.Image img = new Bitmap(150,60);
            Graphics g = Graphics.FromImage(img);
            g.FillRectangle(new SolidBrush(Color.SkyBlue), 0, 0, 200, 60);
            this.AddPoint(img, 200);
            string code = this.GeneralCode();
            Font font1 = new Font("宋体", 30, FontStyle.Italic);
            g.DrawString(code, font1, Brushes.Tomato,0,0);
            this.Response.Clear();
            MemoryStream ms = new MemoryStream();
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            this.Response.BinaryWrite(ms.ToArray());
            this.Response.Flush();
            this.Response.End();
        }

        private void AddPoint(System.Drawing.Image img, int nums)
        {
            Bitmap b = img as Bitmap;
            Random ran = new Random();
            for (int i = 0; i < nums; i++)
            {
                b.SetPixel(ran.Next(0, img.Width), ran.Next(0, img.Height), Color.Tomato);
            }
        }

        private string GeneralCode()
        {
            Random ran = new Random(DateTime.Now.Millisecond);
            StringBuilder sb = new StringBuilder(6);
            for (int i = 0; i < 6; i++)
            {
                sb.Append(ran.Next(0, 9));
            }
            Session["YZM"] = sb.ToString();
            return sb.ToString();
        }

---------------HandlerPic.ashx--------------------------------
  public class HandlerPic : IHttpHandler, IRequiresSessionState //
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "image/jpeg";
            //建立Bitmap对象,绘图
            Bitmap basemap = new Bitmap(150, 60);
            Graphics graph = Graphics.FromImage(basemap);
            graph.FillRectangle(new SolidBrush(Color.SkyBlue), 0, 0, 160, 60);
            Font font = new Font(FontFamily.GenericSerif, 30, FontStyle.Bold, GraphicsUnit.Pixel);
            Random r = new Random();
            string letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
            string letter;
            StringBuilder sb = new StringBuilder();

            //添加随机的五个字母
            for (int x = 0; x < 5; x++)
            {
                letter = letters.Substring(r.Next(0, letters.Length - 1), 1);
                sb.Append(letter);
                graph.DrawString(letter, font, new SolidBrush(Color.Tomato), x * 20, r.Next(0, 15));
            }

            //混淆背景
            Pen linePen = new Pen(new SolidBrush(Color.Tomato), 2);
            for (int x = 0; x < 6; x++)
                graph.DrawLine(linePen, new Point(r.Next(0, 170), r.Next(0,40)), new Point(r.Next(0, 170), r.Next(0, 40)));

            //将图片保存到输出流中     
            basemap.Save(context.Response.OutputStream, ImageFormat.Gif);
            context.Session["CheckCode"] = sb.ToString();   //如果没有实现IRequiresSessionState,则这里会出错,也无法生成图片
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }


    
[3] xcode 批改工程的名字
    来源: 互联网  发布时间: 2014-02-18
xcode 修改工程的名字

现在我们要把工程的名字Test改为MyApp 应该怎么?


把Project Name 改为MyApp 提示是否重新命名,选择ReName

其实到这已经可以了,只不过我们会发现 MyApp 左边的文件夹名字还是Test,怎么办呢?

-----------------------------------------------

你关闭Xcode,把Test文件夹改为MyApp,你再打开Xcode,你会发现,文件已经丢失。

把工程里的Test文件夹删除,再把改名后的MyApp文件夹拖进工程。

这里的Test文件夹和MyApp文件夹其实还是一个文件夹,MyApp是Test改过名字后的文件夹。

运行下,你会发现报错了,问什么呢?因为工程还是引用的是Test文件夹下的文件,你把Test文件夹改为了MyApp,所以找不到了。

你只需要把引用的文件夹名字改为MyApp就可以了。

右键点击MyApp.xcodeproj,显示包内容,选择project.pbxproj文件打开,搜索Test,把Test替换为MyApp

运行下,会有警告,因为你刚才把.plist文件copy到bundle里了。只需要把它删除即可。

再运行下,没错误,没警告。



1楼masongxinna2013-02-02 21:36good

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3