2013年4月30日星期二

Python中的module, library, package


Python中的module的简介

module,中文翻译为:模块
Python中的module,说白了,就是Python文件,而python文件一般后缀为py,所以就是你的xxx.py而已。

library简介

library,中文翻译为:库,也常称为:库文件
之所以此处不说是Python中的library,那是因为,本身library这个词,一般都是针对其他的编译型语言,比如C,C#等语言来说的。
常见的C/C#等语言中的library,一般指的就是:
静态的库文件:xxx.a
动态的库文件:xxx.dll

Python中的Package的简介

package,中文翻译为:包
Python中的package,可以简单的理解为,一组的module,一堆(相关的)module组合而成的;

Python中module和library之间的区别

对于library和module,说白了,都是提供了一定的功能供别人调用。
从这方面来说,也可以理解为:
Python中library等价于module;
只不过,Python中,很少说library,正常的话,都是说module;
所以,简而言之:
  • library多数都是指的是C,C#等语言中的库,库文件;
  • Python中,很少用library这个词;
  • Python中的“库”,“库文件”的叫法,叫做module,模块;
  • 不论你是Python的初学者还是高手,个人建议,都还是继续沿用,官方的,通用的叫法,使用 module这个词,而不要使用用library这个词; 
可以简单理解为:
  • module:单个的模块,一般是单个(偶尔为多个)python文件;
  • package:多个相关的module的组合。肯定是多个,相关的,Python文件的组合;package是用来把相关的模块组织在一起,成为一个整体的;


6.4. Packages
Package 是一组 modules ; Packages 机制使用 “dotted module names” 来结构化组织 Python 模块. 例如模块名 A.B 表示package A 中的模块 B. 就像 module 机制是用来分离不同代码文件中的全局变量名一样, Package机制是用来分离多个module名.

  1. package目录下的 __init__.py 文件用来向 python解析器声明这个目录包含的是一个 package 而不是普通的目录; 这用来防止目录名中含有逗号的情形。 最简单的, 放一个空 __init__.py 文件也行, 但是可以把 package 初始化代码放到 __init__.py 中或者设置 __all__ 变量, 后面会有详细描述.

  2. 用户可以从 package 中导入单个模块, 例如:

  3.     import sound.effects.echo

  4. 将导入子模块 sound.effects.echo, 需要注意的是,需要通过他的全名访问它内部的符号:

  5.     sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

  6. 另一种导入子模块方式:
  7.     from sound.effects import echo
  8. 这样也可以导入子模块 echo, 并其可以不用 package 前缀来访问, 因此可如下调用他的内部符号:
  9.     echo.echofilter(input, output, delay=0.7, atten=4)
  10. 还有一种导入方法,直接就可以导入子模块中的函数或变量:
  11.     from sound.effects.echo import echofilter
  12. 这时可以直接调用子模块 echo 中的 echofilter() 函数:
  13.     echofilter(input, output, delay=0.7, atten=4)
  14. 注意使用 from package import item 这种方式时, 该 item 得是该package的子模块 (或 subpackage) 或是在该package中定义的其他名字, 比如函数, 类 或变量
  15.     1. import 语句首先确定该符号是否在package中定义过;
  16.     2. 若没有,则假定该符号是一个模块名并尝试去加载; 
  17.     3. 如果加载失败,则最后抛出一个 ImportError 异常.

  18. 不同的是,在使用 import item.subitem.subsubitem 这种语法时, 除了最末的项外,之前的项都得是package;最末项可以是一个模块或者package,但不能是类,函数  变量.
  1. 6.4.1. Importing * From a Package
  2. 理想情况下,使用 from sound.effects import * 将导入package 下所有的子模块.但实际上这会导致许多的副作用,因此 python 中采用了另一种方法:
  3.    用户显式指定 package 的子模块索引. 则 import 语句使用以下规则:
  4.       如果一个package 的 __init__.py 中定义了 __all__ 列表, 则 __all__ 中指定的所有模块将
  5.          被导入( 调用 from package import * 时). 因此 package开发者负责维护这个列表. 
  6.          当然开发也可决定不支持这种方式. 例如文件 sounds/effects/__init__.py 包含以下代码:
  7.          __all__ = ["echo", "surround", "reverse"]     
  8.          这意味着 from sound.effects import * 将导入在上面指定的那三个模块.

  9.       如果 __init__.py 中未定义 __all__ 变量, 则语句:
  10.          from sound.effects import * 
  11.       不会导入其下的子模块,而只保证该 package ( 为 sound.effects )导入到当前namespace中,并执行了 __init__.py 中的初始化代码,然后导入该 package 中定义的任何符号(在 __init__.py 中定义),包括之前用 import package.module 方式指定的模块. 看以下代码:
  12.         import sound.effects.echo
  13.         import sound.effects.surround
  14.         from sound.effects import *
  15. 这个例子中,模块 echo 和 surround 被导入当前 namespace.

  16. 记住,使用 from Package import 这种导入方法没有任何错误, 这是提倡的一种方式.


  1. 6.4.2. package 内部引用
  2.   package内部的子模块经常需要互相引用. 例如, 模块 surround 要使用 echo 模块. 实际上由于需要经常使用这种引用,  import 语句被设计为首先查找所属package,然后再查找标准模块搜索路径. 因此在 surround 模块中用 import echo 或 from echo import echofilter 来进行引用. 如果要导入的模块在当前package中没有找到, import 语句会在顶级的package 中查找该名字的模块.

  3. 当多个package被组织成结构化的 subpackages (就像上面例子中的 sound package ), 你可使用绝对绝对引用来引用相邻package中的子模块. 例如, 模块 sound.filters.vocoder 需要使用 sound.effects 包中的echo 模块, 就可以使用 from sound.effects import echo 来引用.

  4. 自Python 2.5开始, 除了用上面提到的显式相对导入外, 你还可以用 from module import name 形式的显式相对导入语句. 还可以用 . 开头的显式相对导入形式来指定是当前 package 还是父一级package.
  5. 例如,你可以使用:
  6.     from . import echo
  7.     from .. import formats
  8.     from ..filters import equalizer
  9. 注意,显式和隐式的路径都基于当前模块而言. 因为 main 模块的名字永远是 "__main__", 所以在Python应用程序中的 main 模块中需要一直使用绝对导入.

  10. 6.4.3Packages in Multiple Directories
  11. Packages 支持另一个特殊属性, __path__. 它被初始化为一个列表,每个元素为一个含有  __init__.py 的目录路径. 该变量可以修改,但会影响到该package中此后模块和子模块搜索.

  12. 这个特性较少使用, 它可用来对扩展某个package 中的模块集.

2013年4月29日星期一

vi 用法


vi分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),
  各模式的功能区分如下:
  1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。
  2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。
  3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。
  不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。
  vi的基本操作
  进入vi
  在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:
  $ vi testfile
  有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。
  初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,
  转换入Insert后再说。切换至Insert mode编辑文件在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。
  这时候您就可以开始输入文字了。
  i: 插入,从目前光标所在之处插入所输入的文字。
  a: 增加,目前光标所在的下一个字开始输入文字。
  o: 插入新的一行,从行首开始输入文字。

  Insert的切换→Command mode,按Esc键
  您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,
  就要按ESC键转换回Command mode,再删除文字。
  离开vi及存文件
  在Command mode下,可按冒号“:”键入入Last line mode,例如:
  :w filename (输入“w filename”,将文章存入指定的文件名filename)
  :wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)
  :q! (输入“q!”,强制离开并放弃编辑的文件)

2013年4月26日星期五

viewcontroller 的view调用



上面两端code的区别就是


    _cGroupListVC.view.hidden = YES;

调用的位置不一样

当调用viewcontroller的view时,viewcontroller 会开始调用 viewdidload,但这时候viewdidload里面 需要的data 还没有设置

1、要么保证 viewcontroller的view调用都放在最后
2、要么就写update方法,单独更新data

Mac 上配置 Pydev + Eclipse


用了一段时间的Python IDLE, 感觉不是很好用,所以尝试配置PyDev+Eclipse,因为在Eclipse下开发实在是太方便了,而且GAE、Django在Eclipse下开发也很方便,简直是一举多得,因此自己也不再一直坚持用vim了。废话不多,直接讲一下步骤吧~

  1. Download Python (go to http://python.org/getit/) 目前主流还很少用Python3版本开发,建议还是用的2.7.3 。
  2. Download Eclipse (go to http://www.eclipse.org/downloads/) ,我安装的是这个
    Eclipse Classic 4.2
    版本。
  3. 安装Eclipse,只需解压到你的工作环境即可,双击运行Eclipse,如果一开始运行失败,那么恭喜你,你需要先查看一下你的MAC OS下的java版本是不是过旧了。进入终端(Terminal)输入java -version。如果版本过旧,在Software Update下检查更新
  4. 打开Eclipse,在"Help"->"Install New Software"->"Add"⋯⋯如下图:
  5. http://pydev.org/download.html 上有URLs for PyDev as Eclipse plugin。

    
    6.点“ok”后,如下图勾选PyDev,然后就一直“next”->"finish"。
    7.如果出现如下error:Unable to read repository at http://pydev.org/updates/content.jar. 那么恭喜你,你的网络估计不给力无法下载安装PyDev.
    如果网速不给力的话,可能需要等一段时间,当安装好的时候,会提示重启eclipse。

    8.在MAC下需要手动配置interpreter,在menu"Eclipse"->"Preference"下"New", 
        interpreter Name:Python2.7
        interpreter Executable:/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7

    9. ok,接下去可以写python喽~
   10.新建poject,设置interpreter为python2.7:

     写个hello world吧~




windows 
在 Eclipse 菜单栏中,选择File > New > Pydev > Project…,在窗口中选择PyDev Project,有三种项目可以创建,选择PyDev Project。
点击Next,输入项目名,选择相应的项目类型,以及所使用的Python语法版本和Python解释器。
创建成功后,进入透视图,右击src图标,选择New->Pydev Package,创建一个新的包。系统将自动生成__init__.py 文件,该文件不包含任何内容。再右键单击创建的包,选择 New->Pydev Module,创建你一个新的Python模块,单击Finish。
这样我们就可以开始创建第一个.py文件了。




2013年4月25日星期四

iOS企业版IDP的申请及发布



企业版IDP,即iOS Development Enterprise Program。注意是$299/Year那种,并不是$99/Year的那种。
这种方式的IDP其最大的好处在于:可以发布“In House”应用。
不好处在于:不能发布AppStore应用

这种应用使用一种叫做“In House Distribution Provisioning Profile”的文件进行发布,不能发布到Apple Shop进行销售,也不需要经过Apple的评审。你可以把“In House”应用通过任何方式发布给你的企业员工、用户及其他你认可的任何人,尤其适合于企业应用的开发。
网上关于个人版/公司版IDP申请流程,以及将应用发布到苹果商店的介绍有很多,但关于企业版IDP以及In House应用的讨论非常之少(尤其国内)。下面,笔者将对这两方面的问题进行一个全面细致的介绍。
1、申请Apple ID
这个步骤就不说了。
2、申请邓白氏编码
邓氏编码是美国联邦政府推荐使用的企业机构编码。可以看成是美国版的“组织机构代码”,只不过已经得到了联合国、澳大利亚政府、欧盟及美国政府的承认,成为了全球企业标准。
苹果公司需要邓氏编码才能申请IDP企业版。这倒不是对国内企业的歧视,而是出于的美国商业习惯。在美国所有的采购合同和商业合同中,都会要求供应商提供一个DUNS(邓氏编码),否则对方可能不会跟你签合同。因为所有的美国企业都使用D&B公司的数据库,这样才能保证所有企业编码不会重复。
申请邓氏编码在D&B公司的网站即可:
中文网站“华夏邓白氏”:
在网站上提交注册申请后,等待1-2天,对方人员会跟你联系(Email)。
原来以为申请会很麻烦(交流上),但实际上是由华夏邓白氏的中籍文员跟你联系的。
邓白氏注册服务有几个版本,收费情况也不一样。笔者一开始收到的邮件是“实地核实”的版本,报价15200/2年。
后来经与北京苹果联系,只需要购买最基本的“标准版”即可,报价8600元/2年, 有网友说2000-3000元/年,现在看来是不可能了 ,在这个物价飞涨的年代:-(。
联系时一定要强调是购买标准版服务(最便宜),否则你可能会花冤枉钱。
收到邮件后,把申请表、协议打印出来,填好并加盖公章,然后加上企业营业执照副本、扫描为电子的,发给对方邮箱。
其实还有一个就是汇款水单(小票),需要发送给对方。这一步其实可以省略。笔者申请时并没有email汇款水单 ,只要对方确认汇款到帐即可。
大约5-7天后,对方发来第2封邮件,告诉你贵公司的编码。此外还可以在网站上安装一个邓白氏电子标识——在网页上嵌入指定脚本,则会在页面上显示一个D&B图标,点击图标自动链接到D&B的网站并呈现你们公司的电子注册信息。
3、申请IDP企业版
登录苹果开发者网站iOS Dev Center,申请Apple Developer Program,只不过这次选择的是iOS Enterprise Program链接(在页面底部)。
点击Apply Now,下一页Continue,下一页选择“Use an existing Apple ID”,Continue。
下一页,输入你的Apple ID、密码登录。
后面就是确认注册协议和填写你的公司资料了(英文)。内容最好同邓氏的一样,否则对方会打电话来确认,需要更改。
填写完公司资料,还要填写委托人联系资料。注意委托人应该有代表公司签字的授权(公司认可,他们会在电话里确认)。
提交资料后,可以在邮箱里收到苹果的邮件,内容大概是感谢你提交了申请,申请的编号是多少,公司名称、邮箱地址等等,如果你想看评审流程,可以登录Member Center。
接下来就是等待苹果的电话了。
这个过程大概要2-3天,对方会安排懂中文的人员来电话,如果没什么问题,接下来(电话之后几分钟)会收到苹果的第2封邮件,大意是要你点击邮件中的链接,查看一个协议(我不知道这个协议和第1个协议有什么不同,反正我直接点同意了)。
协议同意后,显示一个页面,大意是你所申请的国家不支持在线购买苹果产品(在线支付),需要你下载一个pdf的purchase form:
将它打印出来,根据要求填好,然后传真给苹果。
注意,国内信用卡支持美元支付的一般是Visa卡(如招行)和Master卡(如交行),一定要找那种卡上印有“Visa”或”Master”标志的信用卡。
Cvc2 code是指信用卡背面的那串数字(7位)的末3位。
信用卡地址写申请信用卡时登记的地址。
因为公司的传真机无法发送国际传真,我将purchase form扫描后发给了亚洲苹果     chinadev@asia.apple.com, 请其转交给 Billing 团队。
亚洲苹果几分钟后自动回复了一封邮件,并在信中附了一个业务流水号: Follow-Up: 149653 xxx
下次再给亚洲苹果联系时,可以附上这个业务流水号。
然后3-5个工作日后,约早上6点多收到扣费成功短信(信用卡提供的功能)。登录邮箱后,果然收到了苹果的2封email,1封是发票,上面有你的发票号码,单位报账的时候把这封邮件内容打印出来就可以了。另1封是激活邮件,告诉你现在你的idp帐号已经生效了,你点击那个“login now”按钮可以登录到member center,这时可以看到你的developer program overview的状态已经改变。同时,Peoples中会包含一个成员,这个成员就是你注册IDP时所绑定的开发者帐号(Apple ID),同时也是该IDP的Team Admin或Agent。
4、制作iOS 开发者证书
4.1 在本机生成证书请求CSR
打开“钥匙串”应用程序,修改偏好设置如下图所示:
选择菜单“钥匙串访问 -> 证书助理-> 从证书颁发机构求证书”.
注意,如果此时密钥中的某个私钥处于选中状态,则菜单会变为“钥匙串访问->证书助理->用<私钥>从证书颁发机构求证书”,这样制作出来的CSR是无效的。
输入你的email地址和名字。确保email地址和名字与你注册为iOS开发者时登记的相一致。
勾选Saved to Disk(保存到磁盘)及Let me specify key pair information(指定密钥对信息,这个是自自己更改密钥的特性的一些信息,也可以使用默认的,就是不勾选密钥对信息),然后点Continue。
当选择了Let me specify key pair之后,会要求你指定文件保存位置。接下来按下图所示指定密钥对信息:
Continue,即生成了CSR文件。一旦生成CSR,在“登录”钥匙串中会生成一对密钥对(一个私钥,一个公钥)。你可以在钥匙串的密钥栏中查看。
4.2 提交CSR文件
用企业版IDP绑定的Apple ID( 跟制作CSR时要求输的的可能不一致,这里是注册企业版时绑定的iOS开发者帐号,即Agent)登录iOS Provision Portal 。
点击“Certificates-> Development” 中的 “Add Certificate”按钮。
接下来点击最下面的“Choose file”按钮,选择所生成的CSR文件,然后点 “Submit”。如果密钥长度未设置未2048,Portal会拒绝CSR。
提交CSR后,Team管理员(Agent)会收到一封提醒邮件,主题为 Certificate Request Requires Your Approval,提示你需要去同意该CSR。此时Agent需要登录Portal去同意该CSR。但实际上,Agent也可能根本不需要去点“同意”,Portal几秒钟后就自动同意了——笔者遇到的情况就是这样的。
4.3 下载并安装开发者证书
如果机器上未安装WWDR证书,请点击 “Certificate-> Distribution”中的链接“Saved Linked File to Downloads” ,以下载WWDR证书,并通过双击WWDR证书进行安装。
在“Certificate -> Development”中, 在Your Certificate下会列出当前有效的开发者证书。 点击“Download”,即可下载到本机。下载后双击,即可安装到本机。 可以在钥匙串“证书”一栏中查看到导入的开发证书。
 Team 成员只能下载自己的iOS开发证书。Team管理员有权下载所有成员的公有证书。苹果不接受CSR中的私钥。私钥仅对创建者有效,并且必须存储在系统钥匙串里。
4.4   保存私钥并迁移到其他系统
如果你在多台电脑上进行开发或者重装系统,那么把私钥存储在安全的地方是件很重要的事情。如果没有私钥,你无法在Xcode中签名代码并进行真机调试。
钥匙串在生成CSR时,就会在“登录”钥匙串中创建一个私钥。该私钥和你的用户帐号绑定,如果重装OS导致该私钥遗失,则该私钥无法再次生成。如果你想在多台电脑上开发和调试,你必须将私钥导入到每一台机器上:
在钥匙串访问程序中,选择登录钥匙串的“密钥”。可以看到有许多密钥对,选择与你的开发者证书相对应的私钥(还记得创建CSR时要你输入的邮箱地址和名字吗?那个名字会显示在私钥的名字上)。然后选择菜单“文件->导出项目…”,将私钥保存为.p12格式(Personal Information Exchange)。当提示输入密码时,设置一个密码并记住它,它会在导入.p12文件时使用。现住,你可以把.p12文件拷贝到其他机器上并双击它进行安装,这时会提示你输入导出私钥时设置的密码。
5、设备IDs
所谓设备ID(device ID又称UDID)是Apple 设备上的40位16进制码,每台Apple设备的device ID都是唯一的,Apple以此来识别不同的iOS设备。
我们通过在Provision Portal中录入设备的device ID,可以允许开发者在指定真实设备上进行调试。在Provision Portal中最多允许输入100个device ID。
因此,录入device ID是后续制作Provision Profile的必需步骤(而Provision Profile又是真机调试的必需步骤)。
5.1 获取device ID
两种获取device ID的方式:
把Apple 设备(iPhone,iPod)连接电脑,打开Xcode的Orgnizer:
把Apple 设备(iPhone,iPod)连接电脑,打开iTunes:
那个40位16进制的数字就是device ID。
5.2 添加单个device ID
以Team管理员登录Provision Portal,点击Devices页面中的“Add Device”按钮,在其中输入:
Device Name:设备名称,输入一个描述该设备的名字。
UDID:即device ID。
点击提交即可。
6、创建App ID
App ID是识别不同应用程序的唯一编码。如果你的程序要连接Apple Push Notification服务(一种push通知),需要用到App ID。如果应用程序之间要共享钥匙串数据,也会用到App ID。总之,App ID在iOS设备上大量被使用。在这里App ID的最大用处是制作真机调试用的Provision Profile(它需要提供一个App ID)。
一个App ID有两部分构成:一个10位字符的Bundle Seed ID前缀,这个Bundle Seed ID由Apple分配,全球唯一,保证不会重复;一个Bundle Identifier后缀,这个Bundle Identifier由Team管理员指派,Apple建议用反域名规则命名这个Bundle Identifier。例如: 8E549T7128.com.apple.AddressBook.
如果你写了一系列应用程序,它们共用相同的钥匙串(如共用密码),或者根本就不使用钥匙串访问,你可以只创建一个App ID,所有的应用程序都使用以星号结尾的App ID。这个星号就是通配符,只能用于App ID最后一个字符。例如,这个App ID可以是: R2T24EVAEE.com.domainname.* 或者 R2T24EVAEE.*
6.1 创建App ID
以Agent或Team 管理员登录Provision Portal,点击“App ID”页面中的“New App ID”按钮。
App ID Name:给这个App ID一个名字。如果存在多个App ID,每个App ID需要一个易于识别的名称。
App ID:如前面所述,Bundle Seed ID是Apple分配的,其实这里只需要你输入Bundle Identifier。可以使用统配符*。
7、制作开发者Provision Profile
拥有了开发者证书(Development Certificate),只是表明你有权利在电脑上进行开发,在模拟器上运行程序,但你还不能在iPhone上运行你开发的程序。其实如果你只是在模拟器上调试程序的话,要不要开发者证书都无所谓,因为证书只是用来代码签名(Code Sign)的,如果在模拟器上跑的话,你可以选择不签名(don’t code sign)。
如果要在真机上调试就不一样了。它需要一个Provision Profile,没有这个Provision Profile,苹果设备无法安装运行你开发的程序。这个Provision Profile中记录了一些信息:开发者证书、开发者Apple ID、一系列设备ID(开发者可以使用哪几部设备进行调试)。
7.1 创建开发者Provision Profile
以Agent登录Provision Portal,在“Provisioning->Development”,点击“New Profile”按钮。
Profile Name:输入Profile的名字,随意。
Certificate: 选择开发者证书。
App ID:选择一个App ID。
Devices:设备ID列表。
点击“Submit”,即会生成Development Provisioning Profile。
7.2 安装Development Provision Profile
所有Team成员都可以下载Development Provision Profile。但只有Profile中记录了设备ID的设备以及iOS开发者证书所指定的开发者能够使用这个Profile。
在Portal的“Provisioning->Development”,点击某个profile右边的“download”按钮。下载profile后,将下载到的文件拖拽到桌面Dock面板的Xcode图标上(或者直接拖到Xcode的Orgnizer中)。这会将profile文件拷贝到~/Library/MobileDevice/Provisioning Profiles目录。
7.3 签名并调试
在Xcode中打开工程,选中 Target,打开info窗口,在Build面板中找到“Code Signing Identify”,打开并点击下面的“Any iOS Device” :
在弹出菜单菜单中选择你的签名,该签名应当和一个灰色的Profile对应。这个Profile就是我们前面安装的Development Provision Profile。例如,我们在7.1中创建的Profile 的Profile Name为My First Development Provisioning Profile,那么我们选择的签名就是位于“My First Development Provisioning Profile”(显示为灰色)下面的Team Leader的开发证书。也就是说“My First Development Provisioning Profile”中绑定的开发证书是Team Leader签名的。
在Properties面板(其实就是info.plist中的内容),根据你的App ID设置你的Bundle Identifier。如果你的App ID是A1B2C3D4E5.com.domainname.applicationname( 我们在前面创建的App ID),那么Bundle Identifier可以是com.domainname.applicationname 。如果App ID使用了通配符,比如A1B2C3D4E5.com.domainname.* ,则Bundle Identifier可以是com.domainname.<任意字符>。
点击项目窗口左上角的下拉框,选择“ Device | Debug ”,然后点击“Build and Debug”按钮,编译并在真机上运行程序。
8、发布应用程序
发布应用程序需要使用发布证书(Distribution Certificate)。发布证书的制作,跟制作开发者证书的步骤是一样的,只不过使用的是Provision Portal的“Certificates->Distribution”功能。
把制作号的发布证书下载、安装到本机。
但是发布用的Provision Profile稍有不同。 企业版IDP只有两种发布方式:In House和Ad Hoc。两种Profile制作步骤稍有区别。 用In House方式发布是企业版IDP真正区别于其他版本的IDP所在。我们重点介绍In House方式的发布。
8.1 制作In House 方式的Destribution Provision Profile
以Team Admin登录Provision Portal,打开“Provisioning Distribution”页面。
Distribution Method:发布方式,选择In House。
Profile Name:Profile名称,用于区别多个Profile。
Distribution Certificate:选择要在Profile中绑定的发布证书。
App ID:指定一个已有的AppID。
Devices(optional):要绑定的device ID。由于In House方式可以在任何Apple 设备上发布,所以不需要设定Devices,这一项为空。
点击“Submit”,生成Profile。将Profile下载到本地进行安装。方法:把Profile文件拖拽到Dock上的Xcode图标。
8.2 制作Ad Hoc方式的Distribution Provision Profile
以Admin或Agent登录Provision Portal。 打开“Provisioning Distribution”页面。
与In House方式大同小异,只不过发布方式选择Ad Hoc,同在Devices(optional)栏勾选要绑定的device ID,最多可选择100个。
点击“Submit”,生成Profile。将Profile下载到本地进行安装。
8.3 编译In House发布版本
打开你的工程。在工程的info窗口的Configuration面板,从Configuration列表中选择Release,点击“Duplicate”按钮,将复制出来的Configuration改名为Distribution。
打开Target的Info窗口,在Build面板,将Configuration修改为Distribution:
点击“Any iOS Device”,在弹出菜单中选择对应Profile下对应的发布证书,这个Profile应该就是前面6.1中制作并安装的In House 方式制作的Distribution Provision Profile(还记得Profile Name吗?):
切换到Properties面板,在Identifier栏输入Bundle Identifier。该Bundle Identifier应根据App ID填写。
在工程窗口,选择当前配置为Distribution:
点击“File->New File”菜单,然后选择“Code Signing->Entitlements”:
打开Entitlements.plist,反选“get-task-allow”,保存。 该选项允许其他进程(比如调试器)附加到你的程序,当然,在发布阶段,这个选项应当设置为false。
注意,根据Apple的文档,iOS 4.0/Xcode3.2.3之后创建的Entitlements文件不再包括get-task-allow选项——默认情况下,如果Entitlements中没有get-task-allow选项,则不允许附加进程(即无法调试)。
在调试配置下运行时,你不需要Entitlements文件,因此是允许附加进程的(可以进行调试)。但是有时候,你已经有了一个Entitlements文件(比如你已经运行过Distribution配置),如果你再次运行Debug配置,则程序无法启动,因为get-task-allow默认为false(iOS 4.0及Xcode3.2.3以后)。这种情况下,请手动添加一个boolean类型的get-task-allow键,并设置为false。
再次打开Target的Build设置面板。在“Code Signing Entitlements”中,输入Entitlements.plist的文件名。
点击“Build”编译。注意:你需要准备一个57*57像素的图标,iPhone和iPod会在主屏上显示该图标。
选中工程文件夹Products下面的.app文件,然后点击Action下拉菜单中的Reveal in Finder。
8.4 制作安装包
iPhone应用程序的安装文件主要有两种:.ipa格式和.app格式。前者是以.ipa为后缀名的文件(已经包含了ProvisionProfile文件),后者实际是以.app为后缀的文件夹(不包含ProvisionProfile文件)。因此,前者可以直接发布给用户进行安装,而后者需要和ProvisionProfile文件打包在一起进行发布。
8.4.1 制作ipa包
当把.app文件安装到iTunes的资料库之后,应用程序就是以.ipa的方式存在了。在“资料库->应用程序”中选中这个应用程序图标,右键,选择“在Finder中显示”,然后就可以在Finder中把这个.ipa文件拷贝出来了。.ipa文件即可用后面的方法进行安装。
8.4.2 制作rar/zip包
把编译后的.app文件和ProvisionProfile文件一起压缩为rar/zip文件,即可发送给其他人进行安装,或者发布到网络上以供下载。注意,不要使用Mac自带的归档工具。因为windows使用ANSI编码而Mac使用Unicode编码,二者互不兼容,这样使用归档工具压缩出来的rar/zip包无法在windows下解开。你可以使用开源的压缩工具keka:
keka能制作在windows下兼容的压缩包。解压缩后的文件可用后面介绍的2种方法之一进行安装。如果一种方法不能安装,可换用另一种方法。
8.5 安装应用程序
Ad Hoc或In House发布的应用程序,可以将.app与Provision Profile文件打包在一起发送给用户。用户可以用两种方式安装:使用iTunes,或者使用iPhone配置使用工具。
8.5.1 使用iTunes
用户将压缩包中的.app和Provision Profile文件拖到iTunes的“资料库->应用程序”下,然后和iPhone/iPod进行同步。
8.5.2 使用iPhone配置实用工具
iPhone配置工具是完全免费的,你可以从这里下载:
安装后会在“应用程序/实用工具”中生成一个快捷方式“iPhone配置实用工具”。
同样,将iPhone/iPod连上电脑,打开“iPhone配置实用工具”,将.app和Provision Profile文件拖放到“iPhone配置实用工具”的“资料库->应用程序”下,然后选中你的iPhone/iPod,在右边“安装或删除应用程序列表”中,点击某个应用程序右边的“安装”按钮进行安装。
9、问题及错误
如果Xcode出现Code sign错误:
Code Sign Errors: profile doesn’t match any valid certificate/private key pair in the default keychain
同时在Organizer中出现下列提示:
A valid signing identity matching this profile could not be found in your keychain
则需要把钥匙串中的所有证书和密钥删除,然后重新请求证书、修复provision profile、下载并安装,一般可以得到解决。