首页 文章 精选 留言 我的

精选列表

搜索[企业级],共10000篇文章
优秀的个人博客,低调大师

《企业级ios应用开发实战》一3.1 Objective-C的C语言特性

3.1 Objective-C的C语言特性 Objective-C源自C,它是C语言特性和Smalltalk语法的集合。从20世纪80年代开始,Objective-C对C语言进行了大量的扩展,直至30年后的今天,Objective-C已经发展成为当下最流行的编程语言之一。Objective-C全面支持C99标准。对于C这种程序员早已熟知熟悉的经典语言,作者在此并不准备多做介绍,你可以阅读大学计算机课程中使用的C语言教程,或者Dave Mark编写的经典专著《Learn C on the Mac》。本章只简单介绍Objective-C中一些主要的C语言特性,比如Objective-C支持的C语言数据类型、常量/变量和函数、条件和循环等,以及Objective-C的一些非C语言特性(面向对象特性)。 3.1.1 一个简单的 Hello World 了解一种新语言是从一个最简单的程序开始,Hello World程序无疑是最简单的,让我们从它开始。打开Xcode,使用菜单“New Project”打开新建项目向导,在项目模板中选择“Mac OS X →Application→Command Line Utility→Foundation Tool”,并可以将项目命名为HelloWorld。为了能更清晰地了解Objective-C这门语言,我们特意选择了最简单的命令行项目,这种类型的项目并不能在iPhone上运行,它是在Mac命令终端环境中运行的。要知道,原本Objective-C就是用来设计Mac程序的,后来才扩展使用到iPhone程序。因此,我们避免了使用Cocoa框架带来的一些复杂性。Xcode为我们生成了一系列文件,打开其中HelloWorld.m,查看Xcode自动产生的代码如下所示: #import <Foundation/Foundation.h> int main (int argc, const char argv[]) { pool = [[NSAutoreleasePool alloc] init]; //插入代码 NSLog(@"Hello, World!"); [pool drain]; return 0; } 整个代码包括注释不超过10行。然而对于从未接触过这门语言的人来说,可以从中学习到许多东西。 3.1.2 Objetive-C是另一种C C语言作为传统的计算机教学语言,对许多接受过大学理工科教育的人来说,并不陌生。从上面的代码中,我们看到了许多C语言的特征,比如语句用分号结束,程序开头同样需要导入头文件,还有一模一样的main函数作为程序的入口,等等。实际上,Objective-C完全兼容标准C,它同样采用gcc编译器,可以在Objective-C程序中随意嵌入C代码。对于许多推崇标准C的iPhone程序员来说,他们更倾向于使用C代码而不是Objective-C代码来写iOS应用程序。因此,虽然Hello World是一个Objective-C程序,但是我们却可以把它变成C程序,将代码修改为: #include <stdio.h> int main (int argc, const char argv[]) { printf("Hello World"); return 0; } 编译运行程序,黑黑的控制台窗口输出了同样的文字内容。两段代码的区别仅在于:HelloWorld的C语言版没有使用任何框架,而Objective-C版本则使用了Foundation框架。同C一样,Objective-C源代码也分成了两部分:接口和实现。Objective-C的接口文件采用.h作为后缀名;实现文件的后缀则采用.m,而不是.c(C)或者.cc(C++)。 3.1.3 数据类型 在第2章的Cocoa框架介绍中,提到过Foundation框架是Cocoa框架的基本框架之一(见图2-2 Cocoa框架)。而Foundation框架中就定义了数量众多的数据类型和底层类,例如NSString、NSArray、NSEnumerator和NSNumber。我们不可能全部介绍它们,整个Foundation框架定义了上百个类。但我们会讨论其中最有用的一些。前面讨论的HelloWorld程序是很重要的,起码对于这一章来说。因为我们后面学习的代码都会基于这个main函数,只需在这个函数中加入少量的代码,程序就可以运行。1.C基本数据类型由于Objective-C和C兼容,C语言中的5种基本类型:char、int、float、double、void在Objective-C中仍然可用,并且这些基本类型可以使用的修饰符unsigned、signed、short、long进行修饰。2.C复合类型C语言中的复合类型:数组、指针、结构、联合、枚举仍然得到了支持。此外,Objective-C中特有的几种复合类型,就是id、SEL、nil和NULL。id是指向任意对象的指针,类似C语言中的void*。这里的任意对象是指Objective-C中任何继承自NSObject类的实例。在Cocoa中,NSObject是所有类的根类。所以,可以用id指向任何类型的Objective-C对象。选择器SEL实际上被定义为const char*,在Objective-C中,用它来指向任何方法的定义,等同于C语言中的函数指针。要创建SEL类型有两种方式,一种是使用@selector()关键字,并在括号中传递一个方法签名作为参数,通过这种方式你可以调用一个Objective-C对象的指定方法: [object performSelector:@selecotr(doSomething)]; 另一种就是通过NSSelectorFromString()函数,把方法签名以字符串的方式作为参数传递,这种方式类似于Objective-C的反射(关于选择器,后面还会介绍)。nil和NULL都代表了空指针。nil用于Objective-C对象,而NULL则用于指针类型,并且二者不可互换。任何Objective-C对象都是NSObject类的子类,它们都可以用id来指向,因此可以使用nil指针来初始化为空。而C指针类型指向的数据是结构体,而不是对象,因此不能用nil指针初始化为空,但可以用NULL指针初始化为空。此外,NSNull用于指向集合对象,表示集合为空,没有任何有效的对象。3.布尔类型由于C没有布尔类型,你可以使用C++中的BOOL类型。但Objective-C提供了自己的布尔类型BOOL,它提供了两个表示真和假的名义值:YES和NO,类似于True和False。让人奇怪的是,它虽然属于Cocoa,却没有使用NS作为前缀(如后所述)。然而使用BOOL类型时要小心,否则可能会导致出人意料的事情发生。因为BOOL的定义其实是带符号字符,占1个字节的存储空间。我们实际上可以把一个字节的数据放到BOOL中去,如果把一个超过1字节的整数(如short或int)放进去,那么只有低位字节会被放进BOOL中去。在其他语言中,0定义为假,非0定义为真。而在Objective-C中不同,1定义为YES,0定义为NO。0和1以外的数据即不是YES,也不是NO。例如,我们习惯于这样的语句: if(isNotEquals(a,b)==YES){// 如果a,b不相等 ... }else{// 如果a,b相等 ... } isNotEquals (a,b)是一个函数,无论它的返回结果是什么,在if的条件表达式中,它首先会被转换为BOOL类型。但是即使isNotEquals (a,b)函数真的被定义为BOOL类型,它也不一定只返回YES和NO(1和0)。原因如前面所述,如果在isNotEquals函数中返回其他类型,比如int,仍然可以正常转换为BOOL,Objective-C并不会检查出错误。实际上,在isNotEquals函数中很可能是这样返回的: return a-b; 如果a和b相等,那么返回的实际是NO,即0。如果a为4,b为3,则返回的是1,即YES。这都没有什么问题。但如果a为5,b为2,那么实际上返回的这个布尔值即不是YES,也不是NO,而是整型3。那么接下来的if语句中,3自然不等于YES(YES=1),你会发现程序的结果是a与b相等。问题是,你觉得5和2应该相等吗?解决问题的方式有两种,要么你要确保每一个BOOL值返回的除了YES和NO外不能有其他值,比如上面的返回语句应该修改为: Return a-b!=0; 要么,在条件表达式中,永远只和NO进行比较,而不要和YES进行比较,比如: If(isNotEquals(a,b)==NO){// 如果a,b相等 ... }else{// 如果a,b不相等 ... } 喜欢使用哪种方式,完全由你个人的喜好来定。4.NS结构体Cocoa的Foundation框架中定义了大量的结构体,如NSRange、NSPoint、NSSize等,这些结构体统一用NS作为前缀,在后面的章节中你还会见到一些其他的NS结构体。下面介绍一些有用的NS结构体。(1)NSRangeNSRange的定义是: typedef struct _NSRange{ unsigned int location; unsigned int length; }NSRange; 它有两个有用的成员,location表示范围从哪个数字开始,默认为0,length表示范围的大小,默认值是NSNotFound,表示不存在的范围。比如: NSRange range={3,6}; 这个语句用C语言的风格创建了一个NSRange变量,这个NSRange表示了从3开始、总长度为6的数值范围。或者用给结构成员赋值的方式初始化NSRange: NSRange range; range.location=3; range.length=6; 但是Cocoa还为所有的结构提供了便利函数NSMakeXXX: NSRange range=NSMakeRange(3,6); 可以很方便地创建一个NSRange。(2)NSPoint、NSSize和NSRect结构体可能是最方便表述几何图形的数据类型了,比如NSPoint、NSSize和NSRect。这3个结构体构成了一个二维平面中最基本的数据类型。NSPoint表示物体在二维坐标中的x位置和y位置: typedef struct _NSPoint{ float x; float y; }NSPoint; NSSize用于表示一个形状的大小,任何占据一定二维空间的形状,总是离不开宽和高这两个属性: typedef struct _NSSize{ float width; float height; }NSSize; NSRect用于表示一个矩形,它由矩形的坐标位置和大小共同构成,很显然位置可以用NSPoint表示,而大小就用NSSize表示: typedef struct _NSRect{ NSPoint origin; NSSize size; }NSRect; 5.NS类既然Objective-C是“面向对象的C”,那么除了对C的基本数据类型进行全面支持外,当然也对这些类型进行了面向对象的封装和扩展。Cocoa框架把所有的类都加了“NS”前缀——来自于Cocoa前身NextSTEP的缩写,以显示和Core Foundation类的区别(以CF为前缀),比如NSString、NSNumber、NSArray、NSDictionary。本书中会大量使用这些NS类。与C语言寥寥数种的基本数据类型不同,NS类家族可谓种类繁多,本书不可能逐一讨论。在此,我们将只介绍几种最常用的NS类。(1)NSString和NSMutableString在HelloWorld程序中有一个打印语句:NSLog(@"Hello, World!");其中@"Hello, World!"就是一个字符串,即NSString。注意,使用@和双引号来括住字符串,而不是像C++一样只使用双引号来括住字符串,这样就是一个NSString类型的字符串常量。NSString有许多封装的特性,比如统计字符串的长度,将自身与其他字符串进行比较,方便地将自身转换为整数或浮点数。出于性能上的考虑,你不能改变NSString的值,比如在NSString对象中临时插入其他字符或者删除某些内容,这跟Java语言中的String类型是一样的。当然当你确实需要这样做的时候,可以使用NSString的可变版本,NSMutableString。后者和前者几乎一模一样,除了可以对其储存的字符串进行改变操作。创建一个NSMutableString可以用以下代码: NSMutableString mutableStr=[NSMutableString stringWithString:@”Following me”]; 现在,我们可以任意替换其中的字符内容: NSRange range={10,2}; [mutableStr replaceCharactersInRange:range withString:@”you”]; 于是,这个字符串的内容变成了“Following you”。如果想把这个字符串中的“me”删除,可以用NSString的deleteCharatersInRange方法: [ mutableStr deleteCharactersInRange:range]; 当然NSMutableString类最常用的方法还是appendString方法,在字符串的末尾加上另一个字符串: -(void) appendString:(NSString)nsstring; (2)NSNumberNSNumber用于处理所有与数字相关的数据类型,从整型到浮点型的数据,也包括前面提到的BOOL类型。我们可以通过一系列的方法把基本数据类型包装为NSNumber: +(NSNumber) numberWithChar:(char)value; +(NSNumber) numberWithInt:(int)value; +(NSNumber) numberWithFloat:(float)value; +(NSNumber) numberWithBool:(BOOL)value; 类似的方法还有很多,包括各种unsigned和long型数据的版本,我们不能一一列举。创建了NSNumber对象之后,我们就可以把它存储到NSArray和NSDictionary集合中去,而此前这两种集合对象是无法存放基本类型数据的。当我们从集合中把NSNumber取出来后,又可以通过以下方法将其还原为原来的基本类型: -(char)charValue; -(int)intValue; -(float)floatValue; -(BOOL)boolValue; ... 很显然,这些方法是和创建NSNumber的方法一一对应的。(3)NSArray和NSMutableArrayNSArray与C语言中的数组是类似的,但是它还封装了很多C数组不具备的特性。比如,它不需要像数组一样,随时随地都需要程序员对数组下标越界进行检查和判断。它其实更像Java语言中的ArrayList。但是正如前面提到过的,NSArray只能存储Objective-C对象,而不能存放基本数据类型,如int、float、char、struct、enum等。提示:NSDictionary也有同样的限制。此外,NSArray也不能存放空值nil,因为nil用作NSArray的结束符。NSArray的最后一个元素永远是nil对象。NSArray有一个便利的创建方法,可以一次性创建一个包括了许多元素的NSArray对象,如下所示: NSArray array=[NSArray arrayWithObjects:@”one”,@”two”,@”three”,nil]; 这个方法提供了数目不定的参数作为其初始的创建时就包含的元素。牢记前面的两个限制:1)其元素只能是对象;2)最终要以一个nil结束。要获得NSArray的元素数目很容易,访问其count属性即可。使用以下方法访问指定索引的对象: -(id)objectAtIndex:(unsigned int)index; 如果索引大于数组元素中的个数,Cocoa会抛出NSRangeException异常。然而,NSArray是不可变的对象数组,一旦创建就不可能增加和删除其中包含的对象——当然对象自身还是可以改变的。但是数组的元素个数不会改变,其中的元素也不能替换。如果你需要一个在创建后仍然可以任意增加和删除元素的数组,可以使用NSArray的可变版本NSMutableArray。通过类方法arrayWithCapacity和arrayWithArray来创建一个可变数组: +(id)arrayWithCapacity:(unsigned)numItems; +(id)arrayWithArray:(NSArray)array; ... 创建NSMutableArray的类方法有很多,但最常见的是这两个。创建之后就可以用addObject方法从数组末尾添加对象: -(void)addObject:(id)anObject; 同样,获取某个索引处的对象使用继承自NSArray的objectAtIndex方法。NSMutableArray还可以删除某个索引处的对象: -(void)removeObjectAtIndex:(unsigned)index; 同C数组一样,NSArray和NSMutableArray也是从0开始索引的。此外,可变数组可以在特定索引处插入/替换某个对象,进行数组排序等。(4)NSDictionary和NSMutableDictionary字典也称散列表(Java语言中)或者关联数组(C语言中),在Objective-C中用NSDictionary表示字典。创建一个NSDictionary通常是使用类方法: +(id)dictionaryWithObjectsAndKeys:(id)firstObject,...; …代表了可变参数数组,一系列个数不能确定的同类型参数的集合。跟NSArray一样,一旦创建并初始化了一个NSDictionary,其包含的对象就不能改变: NSDictionary d=[NSDictionary dictionaryWithObjectsAndKeys: obj1,@”first object”,obj2,@”second object”,nil]; 同样,在字典的最后以nil标志结束。在初始化方法的参数列表中,除了nil外,所有的参数都是成对的,比如:对象obj1和字符串“fist object”是一对,对象obj2和字符串“second object”是一对。每对都代表字典集合中所存储的一个对象和它对应的索引键,当然,索引键在字典中是唯一的。我们可以通过索引键来检索字典中存放的对象: -(id)objectForKey:(id)aKey; 这样,通过键“first object”查找字典d中存储的对象obj1: id something=[d objectForKey:@”first object”]; NSMutableDictionary是可变字典。假设需要在字典d中增加新的对象,我们可以创建NSMutableDictionary: NSMutableDictionary mutableD=[NSMutableDictionary dictionaryWithDictionary:d]; [d setObject:obj3 forKey:@”third object”]; 如果新加入的对象所采用的索引键与字典中已存在的键相同,则原来的对象会被覆盖。这就是为什么方法名采用了setObject而不是addObject的原因。要删除字典中的对象,可采用如下方法: -(void)removeObjectForKey:(id)aKey; (5)NSDate和NSDateFormatter日期的显示非常重要,我们最常用到日期的地方就是获取当前时间,这也是为什么可以使用iPhone手机用来取代手表,并用它来做烦人的闹钟。NSDate的date类方法创建了一个临时的NSDate对象,它代表了当前时间: NSLog(@”当前时间:%@”,[NSDate date]); 这会在控制台输出如下内容:当前时间:2011-7-30 15:37:02 -0570NSDateFormatter类用于和NSDate配合,将各种格式的字符串转换为NSDate或从NSDate转换为指定格式的文本。日期转换为文本: NSDateFormatter df=[[NSDateFormatter alloc]init]; [df setDateFormat:@”yyyy/MM/dd”]; NSLog(@”%d”,[df stringFromDate:[NSDate date]]; 从文本转换为日期使用: NSDate date=[df dateFromeString:@”2011-7-30”]; 3.1.4 常量、变量和宏 Objective-C的变量声明和C完全相同:类型<变量名>。如果是声明对象的话,需要使用指针符号“*”,例如前面曾经见到过的许多代码: NSDate date; NSString string; NSArray array; ... 常量可以使用static关键字声明: static NSString string=@”abc”; 也可以通过预定义宏来声明: #define PI 3.14 #define PATH @”images”; 3.1.5 #include和#import C和Objective-C都使用头文件来声明类型、结构体、符号常量和函数原型等,因此需要通知编译器去头文件中查找相应的定义。为了实现这个目的,你可以使用#include和#import语句,二者的区别仅在于#import是GCC编译器提供的,它可保证同一个头文件无论被包含多少次始终只导入一次。由于这个特性,你完全可以在Objective-C程序中用#import取代#include。HelloWorld程序中的#import 文件语句中的第一个Foundation并不代表目录,而是指我们在第2章中提到过的Foundation框架。提示:包含头文件时,框架和库中的头文件用尖括号引住,项目中的头文件用双引号引住。如#import 和 #import“ViewController.h”。 3.1.6 函数 Objective-C支持函数的声明和定义。但函数不是类的一部分。函数可以在.h头文件中进行声明,也可以直接在.m文件中定义(调用前)。关于函数的声明和定义,请遵循标准C的语法规范。 3.1.7 分支和循环 Objective-C支持C的所有分支语句和循环语句:switch语句、判断、while循环、do…while循环和for循环。除此之外,从Objective-C 2.0开始,支持快速迭代,类似VB 中的For…each语法。使用快速迭代,可以简单地遍历数组元素: For(NSString each in array){ NSLog(@”%@”,each); } 其中,array是一个字符串数组。显然,这样的语法显得更加简洁明快。快速迭代不仅仅可用于数组,也可以用于遍历任何集合对象。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一第3章 Objective-C 语法简介

第3章 Objective-C 语法简介 本书不是一本关于Objective-C编程语言的专著,但仍然会介绍一些Objective-C语言的语法基础和有趣特性。这对于刚刚接触到iPhone编程的人来说,会是一个很好的开始。Objective-C兼具C语言和面向对象语言的特性。因此本章会从两个方面来介绍Objective-C(简称O-C)。首先,由于Objective-C具有C语言背景(它仍然是一种C),它从C语言中继承了一些C语言特性,例如:Objective-C全面支持C的数据类型(包括简单类型和复合类型)、常量/变量/宏、包含头文件(import/include指令)、函数、条件和循环控制语句。其次,Objective-C在C语言的基础上进行了扩展,加入了面向对象的内容。例如:对象和类(方法及属性的集合)、Objective-C的消息机制、内存管理(包括对象生命周期和对象的创建和释放)、类别和协议、反射、谓词,以及Cocoa对一些常见模式(Pattern)的Objective-C实现(如MVC、KVO)。在本书后续的一些章节中,使用了块语法。因此本章最后单独对Objective-C的块编程进行了介绍。 块是现代C语言标准的一部分,类似C++中的inline函数。Objective-C以面向对象的方式对C的块进行了封装。你可以有针对性地阅读这些内容。比如对于有C基础的程序员,应该跳过基本语法部分(主要是C语言特性),重点阅读Objective-C在C语言基础上进行的扩展(如NS类、类别和协议),以及Cocoa提供的一些优秀特性(比如MVC、KVO)。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一1.3 iOS企业应用程序的发布

1.3 iOS企业应用程序的发布 除了上述特点,iOS企业应用还有一个显著的特点,就是应用程序的发布方式。iOS企业应用具有两种发布方式:In-House和Ad-Hoc,它们并不经过苹果公司的App Store进行发布,而只是在企业内部进行发布。换句话说,不经过苹果商店的应用程序审核程序。 1.3.1 iOS应用程序发布与App Store 2008年3月6日苹果公司推出了iPhone的应用程序开发包(iPhone SDK),吸引了全世界的开发者。2008年7月11日,App Store正式上线,从而开辟了一种前所未有的应用程序销售模式。起初,只有少数的开发者(主要是大型程序开发商)掌握iPhone的开发语言,应用程序商店出现的都是一些精品程序。例如,在2008年TIOBE发布的全球编程语言排名中,iPhone等使用的Objective C一直都在40位左右徘徊,使用率为0.134%;排名第一的为Java,使用率约为19%。《连线》杂志评出的2008年最佳iPhone程序中,排名第一的是来自谷歌的地图程序Google Earth,Twitter的iPhone手机客户端排名第七。然而,随着更多开发者尤其是个人开发者的进入,一些开发者开始从App Store中获益,并被媒体大肆报道。例如, Freeverse公司开发的《Skee-ball》游戏在一个月内就赚得18.1万美元,而Freeverse开发和部署该游戏仅花费了两个月的时间。国内开发者139.ME团队的水族箱程序第一天的下载就实现了300美元的收入。此后,App Store中应用程序的数量呈现出爆炸性增长。2010年8月,Objective-C已经进入了TIOBE的前十大编程语言排行榜,使用率达到3.15%,并且是增长率最快的语言。App Store中应用程序的数量,也从2008年底的1万个,增加到2009年底的10万个。截至2010年10月,App Store已经增加到30万个应用程序,下载量更是突破50亿。这些惊人的数字,只能用奇迹来形容,这也让人不难理解:为什么iPhone开发会这样火爆。然而,如果你现在正准备成为或者已经是一个iPhone开发人员,你也许知道,要想下载iPhone SDK,必须注册成为苹果公司的iPhone Developer(iPhone 开发人员)——这并不是免费的,你需要购买苹果公司的iPhone Development Program;否则你只能下载一个功能有限的iPhone SDK。除此之外,由于苹果公司一贯坚持的“精品应用”策略,苹果公司没有开放iPhone的操作系统。实际上,在App Store上线以前,人们甚至无法在iPhone上安装程序——苹果公司通过App Store控制着iPhone应用程序的发布。如果你想让自己开发的程序安装在iPhone上,你必须购买iPhone Developer Program。iPhone Development Program有两个版本:标准版和企业版。标准版程序价格为99美元/年,它提供大量开发工具、资源和技术支持,支持可以通过苹果公司App Store发布应用程序。同时也支持在iPhone/iPod Touch/iPad(不仅仅是在模拟器)上调试代码。企业版程序价格为299美元/年,支持开发企业专用的,在内部发布的企业应用程序。它不支持在苹果公司App Store销售和发布应用程序,但它支持不经苹果公司审核的应用程序发布方式。标准版和企业版这两者的区别很像是IT界中“做产品”和“做项目”的提法。做产品依靠销售产品拷贝盈利,卖的拷贝数越多则赚的就越多,标准版程序也是如此,依靠下载数量盈利。而做项目并不需要销售产品拷贝,它为企业提供解决方案,做的企业越多则赚的越多,即企业版程序,不管有多少用户在下载(安装)和使用,每做一个项目(企业)收取的开发费用总是相对固定的。网络资料中,介绍标准版IDP比较多,介绍企业版IDP相对较少,而iOS企业应用是本书的主题,与企业版程序有着直接关系,因此接下来详细介绍企业版程序(企业版IDP)。 1.3.2 Ad-Hoc与In-House发布 企业版IDP只支持两种应用程序发布方式,Ad-Hoc和In-House发布。尤其是In-House发布,是企业版IDP所独有的。它使用一种叫做“In House Distribution Provisioning Profile”的文件进行发布,不能发布到App商店进行销售,也不需要Apple的评审。你可以把In-House应用通过任何方式发布给你的企业员工、用户及你认可的其他任何人,尤其适合于企业应用的开发。1.申请企业版IDP首先,你需要有一个Apple ID,如果没有则需要事先申请一个。其次,你的企业需要拥有邓白氏编码。如果没有则需要进行注册。邓白氏编码是美国联邦政府推荐使用的企业机构编码。可以看成是美国版的“组织机构代码”,只不过已经得到了联合国、澳大利亚政府、欧盟及美国政府的承认,成为了全球企业标准。申请邓白氏编码在D&B公司的网站(英文)或者“华夏邓白氏”网站(中文)申请,在网站上提交注册申请后,等待1~2天,对方人员会跟你联系(Email)。如果英文沟通有问题,你可以在华夏邓白氏进行申请,他们会安排中籍文员跟你联系。邓白氏注册服务有几个版本,收费情况也不一样。笔者一开始收到的邮件是“实地核实”的版本,报价15200/2年。后来经与北京苹果公司联系,只需要购买最基本的“标准版”即可,报价8600元/2年,有网友说2000~3000元/年,现在看来是不可能的。联系时一定要强调是购买标准版服务(最便宜),否则你可能会花冤枉钱。收到邮件后,把申请表、协议打印出来,填好并加盖公章,然后加上企业营业执照副本、扫描为电子的,发给对方邮箱。其实还有一个就是汇款水单(小票),需要发送给对方——这一步其实可以省略,笔者申请时并没有Email汇款水单 ,只要对方确认汇款到账即可。大约5~7天后,对方发来第2封邮件,告诉你贵公司的编码。此外还可以在你的公司网站上安装一个邓白氏电子标识——在网页上嵌入指定脚本,则会在页面上显示一个D&B图标,点击图标自动链接到D&B的网站并呈现你们公司的电子注册信息。现在,可以申请企业版IDP了。登录苹果公司开发者网站,申请Apple Developer Program,注意要选择iOS Enterprise Program链接(在页面底部)。点击Apply Now按钮,进入下一页,点击Continue按钮,再进入下一页,选择“Use an existing Apple ID”,点击Continue。进入下一页,输入你的Apple ID、密码,登录。后面就是确认注册协议和填写你的公司资料了(英文)。内容最好同邓白氏申请时一样,否则对方会打电话来确认,要你更改。填写完公司资料,还要填写委托人联系资料。注意委托人应该有权代表公司签字(需要贵公司认可,他们会在电话里确认)。提交资料后,会在注册的联系邮箱里收到苹果公司的邮件,内容大概是感谢你提交了申请,申请的编号是多少,公司名称、邮箱地址等,如果你想看评审流程,可以登录Member Center。接下来就是等待苹果公司的电话了。这个过程大概要2~3天,对方会安排懂中文的人员来电话,如果没什么问题,接下来(电话之后几分钟)会收到苹果公司的第2封邮件,大意是要你点击邮件中的链接,查看一个协议。同意协议后,显示一个页面,大意是你所申请的国家不支持在线购买苹果公司产品(在线支付),需要你下载一个PDF格式的Purchase Form(见图1-1)。将它打印出来,根据要求填好,然后传真给苹果公司。注意,国内信用卡支持美元支付的一般是Visa卡(如招行)和Master卡(如交行),一定要找那种卡上印有“Visa”或“Master”标志的信用卡。Cvc2 code是指信用卡背面的那串数字(7位)的末3位。信用卡地址写申请信用卡时登记的地址。如果传真机发送国际传真有麻烦,可将Purchase Form扫描后用Email发给亚洲苹果公司chinadev@asia.apple.com,请其转交给 Billing 团队。亚洲苹果公司几分钟后自动回复了一封邮件,并在信中附了一个业务流水号: Follow-Up: 149653xxx。下次再给亚洲苹果公司联系时,可以附上这个业务流水号。然后3~5个工作日后,如果信用卡办理了账户余额变动短信提醒功能,则会收到扣费成功短信(注意美国和中国有时差,很可能是在半夜发送的)。登录邮箱后,果然收到了苹果公司的2封Email,1封是发票,上面有你的发票号码,单位报账的时候把这封邮件内容打印出来就可以了。另1封是激活邮件,告诉你现在你的IDP账号已经生效了,你点击那个login now按钮可以登录到member center,这时可以看到你的developer program overview的状态已经改变。同时,Peoples中会包含一个成员,这个成员就是你注册IDP时所绑定的开发者账号(Apple ID),同时也是该IDP的Agent(超级管理员,具有发布权限)。 2.制作开发者证书(1)在本机生成证书请求CSR从Dock栏的“应用程序”→“实用工具”中,打开“钥匙串”应用程序,修改偏好设置如图1-2所示。 选择菜单“钥匙串访问→证书助理→从证书颁发机构求证书”,如图1-3所示。 注意,如果此时密钥中的某个私钥处于选中状态,则菜单会变为“钥匙串访问→证书助理→用<私钥>从证书颁发机构求证书”,这样制作出来的CSR是无效的。 输入你的Email地址和名字,确保Email地址和名字与你注册为iOS开发者时登记的相一致。选中Saved to Disk(保存到磁盘)单选按钮并勾选Let me specify key pair information(指定密钥对信息)复选框,然后点击Continue按钮,如图1-4所示。 当选择了Let me specify key pair复选框之后,会要求你指定文件保存位置。接下来按图1-5所示指定密钥对信息。点击Continue按钮,即可生成CSR文件。一旦生成CSR,在“登录”钥匙串中会生成一对密钥对(一个私钥,一个公钥)。你可以在钥匙串的密钥栏中查看。 (2)提交CSR文件用企业版IDP绑定的Apple ID( 跟制作CSR时要求输的可能不一致,这里是注册企业版时绑定的iOS开发者账号,即Agent)登录iOS Provision Portal 。在Provision Portal页面中,依次点击“Certificates→Development中的Add Certificate”,进入图1-6所示的页面。 接下来点击左下角的Choose File按钮,选择所生成的CSR文件,然后点击Submit按钮。如果密钥长度未设置为2048,Portal会拒绝CSR。提交CSR后,Team管理员(Agent)会收到一封提醒邮件,主题为 Certificate Request Requires Your Approval,提示你需要去同意该CSR。此时Agent需要登录Portal去同意该CSR。但实际上,Agent也可能根本不需要点击“同意”按钮,Portal几秒钟后就自动同意了——笔者遇到的情况就是这样的(可能笔者是用Agent提交CSR的)。(3)下载并安装开发者证书用提交CSR的Apple账号登录Portal。如果机器上未安装WWDR证书,请点击“Certificate →Distribution”中的链接“Saved Linked File to Downloads”,以下载WWDR证书,并通过双击WWDR证书文件进行安装。在“Certificate→Development”中, 在Your Certificate下会列出当前有效的开发者证书。 点击Download按钮,即可下载到本机。下载后双击,即可安装到本机。可以在钥匙串“证书”一栏中查看到导入的开发证书。Team 成员只能下载自己的iOS开发证书。Team管理员有权下载所有成员的公有证书。苹果公司不接受CSR中的私钥。私钥仅对创建者有效,并且必须存储在系统钥匙串里。(4)保存私钥并迁移到其他系统如果你在多台电脑上进行开发或者重装系统,那么把私钥存储在安全的地方是件很重要的事情。如果没有私钥,你无法在Xcode中签名代码并进行真机调试。钥匙串在生成操作系统CSR时,就会在“登录”钥匙串中创建一个私钥。该私钥和你的用户账号绑定,如果重装操作系统导致该私钥遗失,则该私钥无法再次生成。如果你想在多台电脑上开发和调试,你必须将私钥导入到每一台机器上:在钥匙串访问程序中,选择登录钥匙串的“密钥”。可以看到有许多密钥对,选择与你的开发者证书相对应的私钥(还记得创建CSR时要你输入的邮箱地址和名字吗?那个名字会显示在私钥的名字上)。然后选择菜单“文件→导出项目…”,将私钥保存为.p12格式(Personal Information Exchange)。当提示输入密码时,设置一个密码并记住它,它会在导入.p12文件时使用。现住,你可以把.p12文件拷贝到其他机器上并双击它进行安装,这时会提示你输入导出私钥时设置的密码。这个私钥是重要的。如果你机器重装系统了(或者你想把开发环境迁移到另一台机器上),那么很可能需要重新安装开发环境,包括导入开发者证书。每个开发者证书都是和申请证书(提交CSR)时的私钥(私钥可以保存在.p12文件中)是绑定的。如果仅仅是导入了开发者证书文件而机器上没有对应的私钥,则这个开发者证书对这台机器是无效的。3.设备ID所谓设备ID(device ID又称UDID)是Apple 设备上的40位十六进制码,每台Apple设备的设备ID都是唯一的,Apple以此来识别每一台iOS设备。我们通过在Provision Portal中录入设备的设备ID,可以允许开发者在指定真实设备上进行调试。在Provision Portal中最多允许输入100个设备ID。因此,录入设备ID是后续制作Provision Profile的必需步骤(而Provision Profile又是真机调试的必需步骤)。(1)获取设备ID有两种获取设备ID的方式:把Apple 设备(iPhone或iPod)连接电脑,打开Xcode(以4.2版本为例)的Organizer,如图1-7所示。 或者,把Apple 设备(iPhone或iPod)连接电脑,打开iTunes,如图1-8所示。 那个40位16进制的数字就是设备ID。(2)添加设备ID以Team管理员登录Provision Portal,点击Devices页面中的“Add Device”按钮,如图1-9所示,在其中进行以下设置:Device Name:设备名称,输入一个描述该设备的名字。UD ID:即设备ID。点击Submit按钮即可。 4.创建App IDApp 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。其中,8E549T7128是Bundle Seed ID,com.apple.AddressBook是Bundle Identifier。如果你写了一系列应用程序,它们共用相同的钥匙串(如共用密码),或者根本就不使用钥匙串访问,你可以只创建一个App ID,所有的应用程序都使用以星号结尾的App ID。这个星号就是通配符,只能用于App ID最后一个字符。例如,这个App ID可以是:R2T24EVAEE.com. domainname. 或者 R2T24EVAEE.。以Agent或Team 管理员登录Provision Portal,点击“App ID”页面中的“New App ID”按钮。如图1-10所示,在其中修改如下信息:Description:给这个App ID一个名字。如果存在多个App ID,每个App ID需要一个易于识别的名称。Bundle ldentifier:如前面所述,Bundle Seed ID是Apple分配的,其实这里只需要你输入Bundle Identifier。可以使用统配符*。 5.制作开发者Provisioning Profile拥有了开发者证书(Development Certificate),只是表明你有权利在电脑上进行开发,在模拟器上运行程序,但你还不能在iPhone上运行你开发的程序。其实如果你只是在模拟器上调试程序的话,要不要开发者证书都无所谓,因为证书只是用来代码签名(Code Sign)的,如果在模拟器上运行的话,你可以选择不签名(don’t code sign)。如果要在真机上调试就不一样了,没有这个Provision Profile,苹果设备无法安装、运行你开发的程序(这个Provision Profile也将随程序一同安装到iPhone上)。这个Provision Profile中记录了一些信息:开发者证书、开发者Apple ID、一系列设备ID(开发者可以使用哪几部设备进行调试——这些设备的设备ID要登录到Portal上)。(1)创建开发者Provision Profile登录Provision Portal,点击“Provisioning→Development”,点击New Profile按钮,修改以下信息:Profile Name:输入Profile的名字,随意。Certificate:选择开发者证书。App ID:选择一个App ID。Devices:设备ID列表。点击Submit按钮,即会生成Development Provisioning Profile,如图1-11所示。 (2)安装Development Provision Profile所有Team成员都可以下载Development Provision Profile。但只有Profile中记录了设备ID的设备以及iOS开发者证书所指定的开发者能够使用这个Profile。在Portal的“Provisioning→Development”中,点击某个profile右边的“download”按钮。下载profile后,将下载到的文件拖曳到桌面Dock面板的Xcode图标上(或者直接拖到Xcode的Organizer中)。这会将profile文件拷贝到~/Library/MobileDevice/Provisioning Profiles目录。(3)签名并调试这需要用到两个文件:证书用于给代码签名,Provisioning Profile用于真机调试。在Xcode (以4.2版本为例)中打开项目,选中 Target,打开info窗口,在Build Settings面板中找到“Code Signing Identify”,打开并点击“Debug”下面的“Any iOS Device”将弹出一个签名文档(即Provisioning Profile)选择列表,如图1-12所示。 提示:除了可以对“Debug”进行签名,我们还可以对“Release”、“Distribution”等进行签名。这里“Debug”、“Release”、“Distribution”指的是不同的编译版本,在Xcode里也叫做Schema。一个Schema是一种编译方案,代表了一个项目在编译时所采用的编译选项,包括编译器选项参数、环境变量、签名文档和编译脚本等。默认情况下,一个Xcode项目只有“Debug”和“Release”两种Schema,分别代表了调试时和发布时的不同编译选项。在Xcode里,这两种Schema是不一样的。因为程序员在开发调试过程中,对代码进行编译是非常频繁的,这种情况下,应该对编译速度进行一些优化,以节省编译时间,但同时运行效率就会较差一些。但对于发布版本就相反了,这时的编译器应当优先考虑在运行速度上进行优化,而编译速度就会有所下降。此外,你也可以自己加入一些定制的Schema,比如“Distribution”,从而对编译选项进行一些调优。在弹出菜单中选择你要用于签名的Provision Profile(即先前在Portal中制作的Provision Profile),该签名应当和一个开发者证书对应。这个Profile就是前面安装的Development Provision Profile。注意,有时候Xcode会自动根据当前连接的设备的设备ID选择一个有该设备调试权限的签名,比如一般是位于Automatic Profile Selector(灰色)条目下面的iPhone Developer项。这在大部分时候是适用的,但有时候Xcode的选择并不符合你的意愿。此时就需要手动修改签名。例如,在图1-12中,Xcode自动选择了“Automatic Profile Selector”下面的“iPhone Developer(current matches 'iPhone Developer:Hongyan Yang...')”进行签名。这表明将用iPhone Developer“Hongyan Yang”的数字证书进行签名。一个证书可以绑定多个Provision Profile。在图1-12的例子中,“Hongyan Yang”的证书就会存在于许多Provision Profile中:My Development Profile、iOS Team Provisioning Profile 。在图1-12中,有的证书是灰色的,表明不能用于当前签名(可能是Provision Profile的IDs列表中没有包含调试设备,或者App ID不匹配,或者证书和私钥不匹配等原因)。在Target的info面板(其实就是info.plist中的内容)中,还需要设置的Bundle Identifier。如果你的App ID是A1B2C3D4E5.com.domainname. applicationname(我们在前面创建的App ID),那么Bundle Identifier可以是 com.domainname.applicationname(不需要填写Bundle Seed ID)。如果App ID使用了通配符,比如A1B2C3D4E5.com.domainname.*,则Bundle Identifier可以是com.domainname.<任意字符>。如图1-13所示(以Xcode 4.2为例)。签名完成,你就可以在真机上运行程序了。点击Xcode工具栏左上角Scheme下拉按钮,从中选择Device→Debug,然后点击Build and Debug按钮,编译并在真机上运行程序。(4)发布应用程序发布应用程序需要使用发布证书(Distribution Certificate)。发布证书的制作,跟制作开发者证书的步骤是一样的,只不过使用的是Provision Portal的“Certificates→Distribution”功能。把制作好的发布证书下载、安装到本机。 发布应用程序时使用的是“发布证书”,就如同开发时要使用“开发证书”一样。同理,发布时用的签名文档(即Provision Profile)也与开发时使用的不太一样。 企业版IDP有两种发布方式:In-House和Ad-Hoc。两种Profile制作步骤稍有区别。而前者(In-House方式发布)正是企业版IDP真正区别于其他版本的IDP所在。我们重点介绍In-House方式的发布。6.制作In-House发布的签名文档以Team Admin(Agent)登录Provision Portal,打开“Provisioning Distribution”页面,如图1-14所示。 进行如下配置: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图标。7.制作Ad-Hoc发布的签名文档以Admin或Agent登录Provision Portal。打开“Provisioning Distribution”页面,如图1-15所示。 与In-House方式大同小异,只不过发布方式选择Ad-Hoc,同时在Devices(optional)栏勾选要绑定的device ID,最多可选择100个。点击Submit按钮,生成Profile,将Profile下载到本地进行安装。8.编译发布版本打开你的项目。在Target的Builder Settings面板中,找到Code Signing Identity下面的Release项。将Any iOS SDK指定为你的发布证书(Distribution Certificate),如图1-16所示。 切换到Info面板,在Identifier栏输入Bundle Identifier。该Bundle Identifier应根据App ID填写。选择菜单“Project→Edit Scheme”,在Profile的Info窗口中,将Build Configuration选择为Release,如图1-17所示。在菜单栏选择“Product→Archive”。如果Archive是灰色的,请连接设备,在Scheme按钮中选择所连接的iPhone,如图1-18所示。 这时再次选择“Product→Archive”,Archive就变成可用的了。点击“Product→Archive”,编译成功后,会弹出Organizer窗口,如图1-19所示。 点击Share按钮,又会弹出另一个窗口,如图1-20所示。 然后,点击Next按钮,会弹出新窗口选择Archive保存路径,如图1-21所示。注意,不要勾选“Save for Enterprise Distribution”选项。 填入文件名,选择保存路径,点击Save按钮,文件会保存在指定地方。打开Finder,你可以在指定目录下看到生成的.ipa文件。9.安装应用程序以Ad-Hoc或In-House方式发布的应用程序,可以将.ipa文件直接发送给用户。用户可以用两种方式安装:使用iTunes,或者使用iPhone配置实用工具。(1)使用iTunes用户将压缩包中的.ipa文件拖到iTunes的“资料库→应用程序”下,然后和iPhone/iPod进行同步。(2)使用iPhone配置实用工具iPhone配置工具是完全免费的,你可以从这里下载:http://support.apple.com/kb/DL926?viewlocale=zh_CN安装后会在“应用程序/实用工具”中生成一个快捷方式“iPhone配置实用工具”。同样,将iPhone/iPod连上电脑,打开“iPhone配置实用工具”,将.ipa文件拖放到“iPhone配置实用工具”的“资料库→应用程序”下,然后选中你的iPhone/iPod,在右边“安装或删除应用程序列表”中,点击某个应用程序右边的“安装”按钮进行安装。10.问题及错误如果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、下载并安装,一般可以得到解决。 1.3.3 OTA无线部署 所谓OTA(Over The Air),是苹果公司在iOS 4.0中加入的一种新的企业部署方式,即iOS 4的无线部署。无线部署是完全脱离iTunes的发布程序的一种方式。 苹果公司扩展了iOS的Safari的功能,使得iOS企业应用可以通过Safari浏览器进行部署。Safari对URL地址中的特殊协议itms-services进行识别并自动下载ipa安装包,并在下载完成后调用iOS操作系统的应用程序安装界面(iTunes)进行安装。“无线部署”专用于企业部署,包括Ad-Hoc和In-House部署,所以这里你必须使用这两种provision profile 文件。下面介绍如何在Xcode(以4.2版本为例)中进行OTA部署。OTA部署仍然使用“Product→Archive”菜单的功能(正如1.3.2节下面的“8. 编译发布版本”节所描述)。但在选择保存路径这一步(如图1-21所示步骤),注意勾选“Save for Enterprise Distribution”选项。这样将出现OTA部署选项,如图1-22所示。 需要填写的各项设置意义如下:Application URL:你的.ipa文件将部署到服务器的哪个位置。当用户通过Safari安装你的企业应用时,这个URL应指向.ipa文件所在的地址,必填。Title:企业应用名称,必填。Subtitle:子标题,可选。Large Image URL:大图标(512512)所在的URL。大图标用于在iPad上安装时显示应用程序图标,可选。Small Image URL:小图标(5757)所在的URL。大图标用于在iPhone上安装时显示应用程序图标,可选。Add Shine Effect to Image:会在大/小图标上加上一个光照效果,可选。填写完后,点击Save按钮。Xcode会在硬盘上产生一个.ipa文件和一个.plist文件。这两个文件都OTA部署所必需的。其中.plist文件是一个XML文件,保存了你刚才填入的那些配置选项。将上述两个文件和图标文件(如果有的话),放到Web服务器上。注意,.ipa文件和图标文件所放的位置应该和你在图1-22界面中配置的内容一致。至于.plist文件,你可以让它和.ipa文件放在一起,也可以单独放在另外一个地方。另外制作一个html文件,如install.html,内容如下: <html> <head><title>TextGlowDemo</title></head> <body> <ul> <li> <a href="http://10.180.120.235:8080/AnyMail/InHouseProvisionProfile. mobileprovision"> Provisioning File</a> </li> <li> <a href="itms-services://?action=download-manifest&url=http://10.180.120.235:8080/ AnyMail/GlowDemo.plist"> install GlowDemo</a> </li> </ul> </body> </html> 主要是两个标签。第一个标签是Provision Profile文件的超级链接,因为在iPhone上安装应用程序之前,必须先安装Provision Profile文件,所以这个链接是有必要的。第二个是.plist的超级链接。注意:在第2个标签中,href属性的“itms-services://?action=download-manifest&url=”是固定的(后面的跟着.plist文件的真实URL地址)。“itms-services://?action=download- manifest&url=”不能改成其他内容,否则Safari不会调用安装程序。把这个HTML文件放在Web服务器上,然后在iPhone上用Safari访问这个HTML文件地址,你将看到如图1-23所示的页面。 首先点击Provisioning File链接,iOS提示你要安装该预置描述文件,根据提示安装就可。然后点击install GlowDemo链接,Safari会开始下载.ipa包,当下载完成会立即启动系统安装程序进行安装。注意:如果iPhone上已经安装有该应用程序,则会进行覆盖安装。这样,通过OTA部署,不再需要用户将iPhone和 PC同步的繁琐步骤(利用iTunes)。OTA部署直接利用iPhone的无线通信功能(WiFi网络或移动网络)进行应用程序部署(或者在线更新),显得更加灵活和方便。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一2.7 在 iPhone 上运行应用程序

2.7 在 iPhone 上运行应用程序 如果要在iPhone手机上运行程序则没有那么容易了。正如第1章所述,在开始开发iPhone应用程序之前,你需要注册成为iPhone开发人员。只有这样,苹果公司才会允许你使用“完全的”的SDK,否则你只能下载一个有功能限制的免费SDK。注册页面位于。苹果将该注册程序称为苹果开发者计划(Apple Developer Plan),其中针对iPhone开发人员的称作iOS开发者程序。在该页面的底部提供了苹果支持的所有注册程序(见图2-29)。 在该页面底部的Programs列表中,列出了所有的iOS开发者程序类型(排在列表的头3项):iOS Developer ProgramiOS Enterprise ProgramiOS University ProgramiOS University Program程序是免费的,面向科研和教学人员。它也提供了完整的Xcode和iPhone模拟器,但不支持将应用程序在真实的iPhone(iPod Touch或iPad)中运行,而且也不支持通过App Store发布应用程序。iOS Developer Program程序是开发者们最常用的版本,即标准版IDP,它的价格是99美元/年。它提供了一个Xcode,一个iPhone模拟器——支持在Mac上运行绝大多数iPhone程序。标准版IDP支持通过苹果App Store分发应用程序,并可在iPhone上(不是模拟器上)调试应用程序。iOS Enterprise Program程序即企业版IDP,在第1章中已经做了详细的介绍,它的价格是299美元/年。当你拥有了标准版或企业版的IDP证书,还需要通过Provision Portal制作相应的Provisioning Profile,并下载到你的电脑上。然后使用IDP对程序进行代码签名,才能在iPhone上运行你开发的程序,这个过程正如第1章所述。如果你已经仔细看完第1章,那么我们可以假设你已经完成了这些步骤。接下来就可以在真机上运行(调试)程序了。将iPhone连接到电脑, Xcode会自动识别出你的iPhone。将项目的Scheme修改为你的iPhone名字,例如作者的iPhone 名为“YHY's iPhone”,如图2-30所示。然后点击Run按钮,Xcode将会在你iPhone上运行My_First_iPhone_App程序了。 提示:如果是第一次调试这个设备,则Xcode会提示要在该设备上安装一个Provisioning Profile,请选择同意安装。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一1.2 iOS企业应用程序的架构

1.2 iOS企业应用程序的架构 本书把iOS企业应用定义为传统企业应用向iOS手机终端的顺延和扩张。在此定义下,iOS企业应用由服务端和iOS客户端构成,二者间通过3G移动互联网(CDMA/TD/WCDMA)连接或通信。 1.2.1 服务端 服务端(企业网络或Web服务)实际上为iOS企业应用提供企业数据和服务。如果把iOS客户端看做是前端应用,则服务端就是后台服务。服务端向前端提供一系列访问传统企业应用的接口,也可以为前端提供企业数据库和业务系统的访问。因此,iOS企业应用的服务端可能有两层或多层:接口、企业应用、企业数据库。本书的核心内容是介绍iOS开发技术,不会对企业开发技术做过多的介绍。因此服务端代码(企业应用和企业数据库)的开发细节不会在本书中出现,但对于本书中涉及的接口,会提供必要的代码给读者学习。此外,本书中的接口代码是以Java编写的,需要读者对Java语言有一定的了解。 1.2.2 iOS 客户端 iOS客户端是一个标准的iOS应用,当然它也具备一些企业应用所特有的特点。但无论如何,它不应当是在浏览器中运行的Web网页。如果你想找一本介绍如何开发在iPhone浏览器上运行的Web网页应用程序的书,那么不应该是本书。本书大部分内容旨在教你开发标准的iOS应用程序,这与市面上大部分介绍iPhone开发的书籍是一致的,但有一些例外。首先,作为运行在手机上的iOS企业应用来说,安全是尤其需要注意的问题。因为iPhone等手持式移动终端所特有的一些特点,比如随身携带、随处可用,不需要登录,容易丢失等等,稍有不慎,就有可能导致企业机密的泄漏。其次,对于企业应用来说,访问网络的需要,尤其是访问企业网络内部资源,如服务器、数据库等,永远是必不可少的重要内容。无论在任何情况下,网络带宽永远是企业的稀缺资源,对于企业应用尤其如此,因此,必须在节省带宽和提高用户体验中进行平衡。本书使用了很大的篇幅来介绍网络访问技术,此外,企业网络的类型(例如APN网络)会给iOS访问企业数据带来麻烦。由于iOS本身的限制,iPhone在切换APN网络时显得不太灵活——iPhone只能通过.mobileconfig描述文件切换APN。你可以在App Store上找到一堆的应用,专门用于给iPhone提供APN切换的功能。因此,本书也会介绍如何在自己的项目中实现一个简单APN切换器。另外,与App Store中占据主要份额的游戏应用不同,iOS企业应用有使用数据库技术的迫切需要——作为企业开发人员,习惯于把业务数据保存在关系数据库中的这一顽疾早已根深蒂固——哪怕我们在客户端使用数据库的目的仅仅是出于把服务端数据缓存到本地的需要。最后,还需要介绍一下文档和报表的显示。企业办公环境中离不开各种文档:文本、图片、视频和声音,尤其Microsoft 的Office文档俨然已成为了企业办公中公文流转的标准格式。如果在iPhone手机上竟然无法打开这些最为常见的企业办公文档,这绝对是一场悲剧。而报表和图表,是企业管理中最为常见的数据表现形式和数据分析手段,把企业运营数据以报表图表的形式进行展示,显然是iOS企业应用中应该提供的基本功能。综上所述,企业开发人员必须充分认识到iOS企业应用的特点,结合企业的实际需要,才能开发出一个优秀的iOS企业应用。

优秀的个人博客,低调大师

《规范敏捷交付:企业级敏捷软件交付的方法与实践》——3.5 敏捷数据

3.5 敏捷数据 敏捷数据(AD)方法定义了一组策略,IT专业人员可以在各种不同的环境下应用这些策略,以便在软件系统的数据方面有效地合作。这并不是说AD是一个“一刀切”的方法。相反,当提到软件系统的数据方面时,应该认识到AD是一套技术和哲学的组合,它可以促进组织内IT专业人员之间的有效合作。演进式/敏捷数据库开发的实践有以下几种。数据库重构。数据库重构是对数据库模式的一个小更改,以改进它的设计,而不改变其原本的语义结构(比如,不会增添任何新的内容或破坏任何现有的内容)。数据库重构过程是对数据库模式的演进式改进,它不会改变其原本的功能,但可以提高团队提供客户新需求的能力。敏捷数据建模。用演进的方式对软件系统的数据进行迭代建模和增量建模。采用敏捷方式,团队可以高度合作,一起对软件系统的数据进行建模。在项目早期,在高层面上预想用户需求和架

优秀的个人博客,低调大师

《规范敏捷交付:企业级敏捷软件交付的方法与实践》——3.4 敏捷建模

3.4 敏捷建模 敏捷建模(AM)是一个基于实践的方法论,它关注软件系统的有效建模和文档。详细级别的AM是由价值观、原则、实践组成的集合,其以有效的、轻量级的方式将软件建模的实践应用于软件开发项目中。提出AM的目的是为了提供一系列可被裁剪并应用到其他基础过程框架中的敏捷策略,而DAD过程框架也从AM中受益匪浅。敏捷模型驱动开发(Agile Model Driven Development,AMDD)(见图3.3)是指通常在项目的最开始阶段仅仅进行高层建模,从而理解系统所涵盖的范围以及潜在的架构。在构造迭代周期内,敏捷建模是迭代计划活动的一部分,其以即时(JIT)方式进行敏捷建模风暴,在进行几个小时的编码前,先花几分钟建模。AMDD虽然不强制从业者必须采用测试驱动开发方法,但是推荐使用它(DAD采取同样的立场)。从图3.3中我们不难看

优秀的个人博客,低调大师

《规范敏捷交付:企业级敏捷软件交付的方法与实践》——3.7 IBM实践

3.7 IBM实践 IBM为软件开发实践集合的整理和编写做出了巨大的贡献(而且必将继续下去),这些实践包括关注敏捷交付的最佳实践。通过Rational Method Composer(RMC),敏捷团队可以很方便地根据自身所处的情形去裁剪这些IBM实践以帮助自己走出困境。IBM实践的目的在于提供可供敏捷团队创建流程的构建模块。而且事实上,IBM已经定义了一些流程和方法,如开放统一过程(OpenUP)、Eclipse Way和Harmony/ESW等。IBM的客户则可以对这些实践和方法进行适当的裁剪,然后开发出适合自己的一套流程。下面列出的只是IBM实践集合中所包含的迭代和/或敏捷实践的一部分。并行测试(全团队测试)。开发团队应该在进行其他开发活动的同时,尽自己最大能力做好相关的测试。持续集成。请参考前面章节所介绍的XP实践的相关内容

优秀的个人博客,低调大师

《规范敏捷交付:企业级敏捷软件交付的方法与实践》——1.9 企业意识

1.9 企业意识 与其他团队一样,DAD团队是企业生态系统中的一部分,更为明显的是,DAD团队总是主动出击,力图把握出现在他们面前的各种机会,力图创造良好的文化环境,使得自律的敏捷实践者在立足本地,开展自己的工作的同时,能够着眼全局,把自己的收获贡献给整个组织。企业意识的核心是倡导团队成员与企业中各种角色能够密切共事,例如,企业技术架构师和资产重用工程师——以利用和增强现有和“将来”的技术基础设施;企业业务架构师和产品组合经理——以适应整个业务生态系统;监管各种团队的高级经理人员;运营人员——以支持组织的整体开发和运维(DevOps)任务;数据管理员——以访问和改进现有的数据源;IT开发支持人员——以理解和遵循企业的IT指导方针(如编码、用户界面、安全性和数据规范等),以及业务专家——以共享他们的市场洞察力、销售预期、服务预测和其他

优秀的个人博客,低调大师

分析型数据库+数据传输,构建企业级实时数仓

什么是实时数仓 传统的离线数据仓库,将业务数据集中进行存储后,以固定的计算逻辑定时进行ETL 和其它建模后产出报表等应用。离线数据仓库一般采用每日或每几个小时进行一次计算的方式,计算和数据的实时性均较差,业务人员无法根据自己的即时性需要获取几分钟之前的实时数据。 而虽然软件技术和硬件的发展,实时数据仓库一类解决方案越发流行。实时数仓同时具有计算的实时性(计算在用户查询时发生,可自由变换,查询速度快),和数据的实时性(数据产生插入数仓后很短时间内既可以查询到),可以让业务人员在几秒钟甚至几百毫秒的时间内获取到包含最近几分钟内的数据计算结果,以最大的灵活度应对千变万化的业务挑战。 实时数据仓库解决方案还广泛的运用于物流行业的件量预测、O2O/电商行业的实时A-CRM系统、广告行业的M-DMP系统、国家政府机关如公安/交警的大数据系统,以及企

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册