objective-c 简单笔记

Objective-C源文件使用“.m”作为文件名的扩展名,Xcode可以编译的文件扩展名如下所示。
.c:C语言源文件、.cc或.cpp:C++语言源文件、.h:头文件、.m:Objective-C源文件、.mm:Objective-C++源文件、.pl:Perl源文件、.o:已经编译的文件。

#import <Foundation/Foundation.h>

在Objective-C语言中,编译器指令以 @ 符号开始,这个符号经常用在使用类和对象的情况

int main(int argc, char *argv[])
{
  @autoreleasepool
  {

    NSLog(@"Hello Objective-C"); // 执行输出 此处的符号@位于一对双引号括起来的字符串前面,这被称为常量NSString对象
  }
  return 0; // 返回结果
}

第2章 常量、变量和数据类型

与 C 差不多

NSLog 既可以像C语言中的printf那样方便地格式化输出数据

第3章 运算符和表达式

在Objective-C语言中,可以将运算符分为以下7大类。
(1)算术运算符:用于各类数值运算,包括加(+)、减(−)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(− −)共7种。
(2)比较运算符:用于比较运算,包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)6种。
(3)逻辑运算符:用于逻辑运算,包括与(&&)、或(||)、非(!)3种。
(4)位操作运算符:参与运算的量按二进制位进行运算,包括按位与(&)、按位或(|)、按位非(~)、按位异或(^)、左移(<<)、右移(>>)共6种。
(5)赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,−=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类,共11种。
(6)条件运算符:这是一个三目运算符,用于条件求值(?:)。

第4章 选择结构

在Objective-C程序中有如下所示的3种选择结构:
●if语句。
●switch语句。
●conditional运算符 for and while。

第6章 面向对象——类、对象和方法

Objective-C语言是面向对象的,用户可以根据需要在程序内定义自己需要的类。在Objective-C中,类使用关键字@interface来定义

#import <Foundation/Foundation.h>
//———— @interface定义部分————
@interface Fraction:NSObject      // @interface 类名:父类
{
  int numerator;
  int denominator;
}
-(void)  print;
-(void)  setNumerator:(int) n;

-(void)  setDenominator:(int) d;

// 在上述声明代码中,开头的“-”功能是通知Objective-C编译器该方法是一个实例方法。而与“-”对应的另外一种选择是“+”,表示类方法。类方法是对类本身执行某些操作的方法,例如,创建类的新实例。这类似于制造厂制造一辆新汽车,在这一点上,汽车就是一个类;而要制造新汽车便是类方法。


@end
//———— @implementation实现部分————
@implementation Fraction
-(void) print
{
  NSLog (@"%i/%i", numerator, denominator);
}
-(void) setNumerator:(int) n
{
  numerator = n;
}
-(void) setDenominator:(int) d
{
  denominator = d;
}

@end
//————Program程序段,实现具体功能————
int main(int argc, const char * argv[]) {
   @autoreleasepool {
    Fraction *myFraction;
    //创建一个实例
    myFraction = [Fraction alloc];
    myFraction = [myFraction init];
    // 设置为 2/3
    [myFraction setNumerator:2];
    [myFraction setDenominator:3];
    // 打印输出
    NSLog (@"The value of myFraction is:");
    [myFraction print];
   }
   return 0;

}

使用点运算符访问属性

方法类型标示符(-) 即这是一个实例方法。

返回类型(void) 即没有返回值。

方法名称(insertString:atIndex:) 一个方法的实际名称是所有签名关键词的串联,包括冒号字符。

参数类型 该方法中包括了两个参数,两个参数的类型为NSString和NSUInteger。

参数名称 该方法中包含了两个参数,两个参数的名称分别为aString和loc。

注意:在定义方法时,方法名称以及参数名称需要使用驼峰法来定义。

方法

调用某个对象中定义的方法是通过向对象发送消息的方式进行的,消息的名称对应类中定义的方法名称,这种机制是Objective-C语言的区别其他编程语言的一个特性。

[receiver message];

消息message:在iOS开发中,调用一个方法相当于传递一个消息,这里的消息指的是方法名(选择器Selector)和参数。消息传递(Message Passing)是Objective-C最大的特色,对象不是简单的调用方法,而是相互传递消息,这与C++有很大差异。

接收者receiver:通常为一个对象,消息告诉接收者需要去做什么事情。当消息发送的时候,系统从接收者的方法列表中选择最合适的方法并调用。

方法method:一般来说,方法都包括方法声明和方法实现两部分,相关代码分别编写在.h和.m文件中。通俗来说,方法就是需要对象去完成某个工作,以实现某种功能,可以简单理解为函数(实际上和函数也有差别)。

发送消息:当需要调用一个方法时,通过给实现该方法的对象发送一条消息来实现,简单来说,就是通知对象去调用其定义的某个方法或者其父类的某个方法。在发送的消息中,包含方法名称以及参数。

选择器selector:因为方法名在消息中负责在对象的方法列表中选择一个方法执行,因此方法名在消息中通常称为选择器。

调用一个方法相当于传递一个消息,消息中包含方法名(也称为选择器)和参数。通常调用方法存在以下几种方式。

普通调用:使用方括号将消息本身与参数放到括号内,同时将接收消息的对象放在最前面

嵌套调用:有时为了避免声明大量的局部变量来存储临时结果,Objective-C也支持嵌套消息表达式。上面的案例中,可以不声明str2,从而对代码做如下改写:

调用父类的方法:子类可以直接调用父类的方法。如下所示:MYClass继承自NSObject,因此MYClass的对象myClass可以直接调用NSObject的copy方法。

为了深入理解消息、方法、接收者这些概念,必须了解消息处理的机制。在Objective-C中,消息是直到运行时才和方法进行绑定关联的。

消息机制的关键在于编译器为类和对象生成的结构。其中类的结构中包含两个基本元素:第一,指向父类的指针;第二,类的方法列表。而对象被创建时,对象的第一个实例变量是一个指向该对象的“类结构”的指针,即isa指针。通过该指针,就可以访问到该类及其父类的方法列表,如图3-8所示。

当向某个对象发送消息时:

首先根据isa指针,找到该对象对应的类结构的方法列表,继而即可找到具体的方法实现;当在本类的方法列表中找不到对应的方法时,会根据类结构中父类的指针去查找父类的方法列表,直至NSObject根类。

将对象以及参数传递给找到的方法实现。

执行方法中的代码,获取方法的返回值。

对象是类Class运行时的实例,它包含了自己的实例变量(属性中声明)的内存副本以及类方法的指针,在实际开发中可以采用分配内存地址alloc以及初始化init两个步骤来创建一个对象。

对象的创建分为两个阶段:内存空间分配和初始化。通常情况下,初始化总是紧跟在内存空间分配之后进行的,但是在创建对象的过程中,这两个操作的作用是不同的。

第7章 面向对象——继承

继承

第8章 多态、动态类型和异常处理

多态、动态类型和异常处理

在Objective-C程序,可以使用以下内置方法来判断指针变量的实际类型。
●-(BOOL) isKindOfClass:classObj:判断是否是这个类或者这个类的子类的实例。
●-(BOOL) isMemberOfClass:classObj:判断是否是这个类的实例。
●+ (BOOL)isSubclassOfClass:classObj:判定是否为classObj的子类。

第 9 章 Foundation框架

第4章,框架是由许多类、方法、函数和文档按照一定的逻辑组织起来的集合,以便使研发程序变得更加容易。苹果公司为程序员提供了很多的框架,而其中Foundation框架是为所有程序开发奠定基础的框架。

Foundation框架允许使用一些基本对象,如数字、字符串,以及一些对象集合,如数组、字典和集合。另外,Foundation框架还提供了包括日期处理、自动化内存管理、处理基础文件系统、存储/归档对象等常用基础类。

在实际的开发中,关于框架经常会遇到以下几个概念。

Application Kit框架:包含了用于开发交互式图形应用程序,使得开发文本、菜单、工具栏、表、文档、剪切板和窗口之类的过程变得十分简便,用于Mac OS桌面程序的开发。

Cocoa:总体来说,通常指的是Foundation框架、Application Kit框架以及CoreData框架,Cocoa一般针对的是MacOS的应用开发。

Cocoa Touch:指的是Foundation框架、UIKit框架以及CoreData框架,CocoaTouch一般用于iOS移动设备开发,从名称上来看包含了关键字Touch,顾名思义与触控有关。

字符串类操作 NSString

char* cstr = "Hello, iOS!";  // 使用 c 风格初始化

NSString* str2 = [NSString stringWithUTF8String:cstr];

NSString *book = @"hello";

可变字符串 NSMutableString

NSString是不可变的,

NSMutableString* str = [NSMutableString stringWithString:@"Hello"];

[str appendString:@",iOS"];

对象复制 copy 和 mutableCopy

copy 方法总是返回不可修改的副本

NSMutableString* str1 = [NSMutableString stringWithString:@"Hello"];

NSMutableString* bookCopy = [str mutableCopy];

注意:自定义的类需要使用 NSCopying 和 NSMutableCopy

三种集合类

1、数组类NSArray

分NSArray和NSMutableArray

2、字典类NSDictionary

分NSDictionary和NSMutableDictionary

3、集合 NSSet

分NSSet和NSMutableSet

基本数据类 NSNumber

文件操作类 NSFileManager

基于NSFileManager类,允许用户对文件进行基本操作。这些操作包括:创建新的文件、读取文件、对文件进行复制、移动以及删除等,同时还可以对文件的一些常规属性进行读取以及修改。

1.基本概念

在学习NSFileManager类的相关属性和方法之前,需要提前了解并掌握如下几个与文件相关的基本概念。

路径Path:在使用NSFileManager类对文件进行操作时,经常需要使用到路径的概念,路径可以理解为文件的物理存储路径+文件名称的组合,每个路径名都是一个NSString类型的对象。

属性Attr:文件的属性是一个NSDictionary类型的对象,文件属性定义在Foundation/NSFileManager.h文件中,有二十余个。

错误err:一个指向NSError对象的指针,能提供有关文件操作更多的错误信息,如果err被置为nil,那么就会采取默认的错误处理行为。

2.基本操作

在使用NSFileManager类时,需要实例化一个NSFileManager类的对象,然后对指定路径Path上的文件进行一些操作。下方的代码演示了如何获取目录,如何获取路径(这里要注意区分路径和目录的区别),如何实例化NSFileManager类,以及如何判断一个文件是否存在。

首先在计算机的桌面上创建一个myfile.txt文件,可以打开终端,执行如下命令:

NSBundle类

当创建一个应用时,系统存储了应用相关联的所有资源,例如图片、文件等,将这些内容放在应用包(application bundle)中。为了定位应用包中的资源,则需要使用NSBundle类。

1.向应用包中添加资源

在使用Xcode进行iOS开发时,可以在Finder中选中一些资源文件,然后拖动到Xcode的左边窗口中,即可完成资源的添加。当出现如图4-35所示对话框时,通常选择复制资源文件到项目中。

2.从应用包中读取资源

当向程序的应用包中添加了一些资源文件后,在某些情况下,就需要从应用包中读取这些文件,例如,获取一张图片并显示在屏幕上,这就需要找到这张图片在程序包中的位置。NSBundle类提供了在程序包中查找资源的相关方法。

使用mainBundle方法来实例化得到一个NSBundle类对象。

可以使用pathForResource方法来获取某个资源的路径,返回一个NSString类型的对象。

把下方的所有代码添加到ViewController.m文件的viewDidLoad方法中,可以实现从应用包中读取名称为my file,类型为txt的文件(请提前添加文件到应用包),并打印出文件中的内容。

当使用NSLog()打印变量时,会根据需要打印变量的类型提供相应的格式化占位符,常用的占位符如下所示。

%@:对象;

%d,%i:整数;

%u:无符整形;

%f:浮点/双字;

%x,%X:二进制整数;

%o:八进制整数;

%zu:size_t;

%p:指针;

%e:浮点/双字(科学计算);

%g:浮点/双字;

%s:C字符串;

%.*s:Pascal字符串;

%c:字符;

%C:unichar;

%lld:64位长整数(long long);

%llu:无符64位长整数;

%Lf:64位双字。

第 10 章 UI 界面

iOS开发过程中,70%~80%的工作是在围绕UIKit框架中定义的类进行的。

UIView 类

第 11 章 多线程

NSThred类是苹果官方提供的管理线程的类,提供了一些线程管理的方法。但是随着GCD和NSOperation的推出,NSThread的使用场景已经大大减少。

特别是苹果公司把CPU升级为多核后,GCD的使用变得更加广泛和重要。相比于NSThread,GCD中已经完全屏蔽了有关线程的概念,而是引入了任务和队列,把任务放到队列中执行,指定任务和队列的类型。其他有关线程管理的事务完全交由GCD来处理,大大简化了多任务开发的难度。

NSOperation在iOS 4后也基于GCD实现,但是相对于GCD来说可控性更强,并且可以加入操作依赖。NSOperation是一个抽象类,因此系统提供了NSBlockOperation和NSInvocationOperation两个子类,并且可以创建继承自NSOperation的自定义类。相比于GCD,NSOperation更加面向对象,开发者除了不需要去了解线程相关的概念之外,甚至连GCD中需要了解的异步/同步、并行/串行都不太需要深入了解,开发者只要懂得任务和队列即可。

第 12 章 网络

客户端(Client):在移动开发过程中,客户端就是手机上的App。

服务器(Server):为客户端提供服务、提供数据的设备。

请求(Request):客户端向服务器索取数据的一种行为,客户端告诉服务器,需要获取哪些数据。

响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端。

同步请求:当客户端在发送请求,在获得响应这段时间,同步请求会导致客户端必须等待服务器响应结束之后,才能对应用进行交互。

异步请求:当客户端在发送请求,在获得响应这段时间,异步请求可以允许客户端做其他操作,不需要等待网络操作结束。

请求队列:请求队列提供了对异步请求更加精准丰富的控制,例如可以设置在队列中设置请求的连接数(maxConcurrentOperationCount)。当向请求队列里添加的请求实例数大于maxConcurrentOperationCount时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才被放到队列里执行。这也适用于当有多个请求需要按顺序执行时(可能是业务上的需要,也可能是软件上的调优),仅仅需要把maxConcurrentOperationCount设为“1”(这时和串行无异)。

协议:网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。iOS开发常用协议有:HTTP、HTTPS、Socket协议等。

2.网络开发基本流程

在iOS网络开发过程中,在不借助其他第三方开源框架的情况下,当需要发送一个网络请求,通常情况下包含如下几个常规步骤:

构造地址NSURL;

构造请求NSURLRequest;

构造启动连接NSURLConnection;

发送同步请求/异步请求;

代理对象实现协议,用于监听通信事件。

在接下来的章节中会介绍一下如何使用苹果官方提供的框架以及第三方开源框架来发送网络请求以及解析服务器响应。

AFNetworking是目前使用人数最多的网络加载第三方开源框架,从最初的NSURLConnection到现在的NSURLSession,它都一直保持着与苹果一致的步调,而由它也衍生出大量的相关第三方网络功能框架。在绝大多数情况下,当需要发送网络请求,或者是下载文件,使用AFNetworking都是最便捷的选择。

JSON转换为Objective-C中的数据类型。JSON数据格式与Objective-C对象之间的参照如图12-16所示。

苹果官方提供了原生的解析JSON数据的方法——NSJSONSerialization。NSJSONSerialization类中提供了JSON与Objective-C对象之间相互转换的方法。

另外,JSON的解析也可以使用第三方框架,常见的有JSONKit、SBJson等。需要特别说明的是,假如使用AFNeworking处理网络请求,该框架会自动解析JSON类型的网络响应数据。

第13章 数据持久化

在iOS的开发过程中,常常会遇到数据持久化存储方面的问题,而数据持久化的基础是建立在iOS的沙盒机制上的,所以深入理解iOS的沙盒机制是很有必要的。

iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在本应用的文件夹内读取文件,不可以访问其他区域的内容,此区域被称为沙盒。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。关于沙盒需要提前了解下面的几个要点:

每个应用程序都有属于本应用的沙盒存储空间。

应用程序不能随意跨越自己的沙盒去访问其他的应用程序沙盒的内容。

应用程序向外读写数据都需要经过权限认证。

正是因为沙盒机制的存在,iOS以及MacOS的软件安全性要比Android以及Windows应用的安全性高。

2.沙盒目录介绍

默认情况下,每个应用的沙盒包含3个文件夹:Documents、Library和tmp。由于沙盒机制的存在,应用只能在这几个目录中读写文件。使用iTunes与iPhone同步时,会备份所有的Documents和Library文件。iPhone在重启时,会丢弃所有的tmp文件。

Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。

Library:存储程序的默认设置或其他状态信息,其中又包含了Caches文件夹和Preferences文件夹。

Library/Caches:存放缓存文件,iTunes不会备份此目录,但此目录下文件在应用退出时不会被删除。

Library/Preferences:存放偏好设置的plist文件。

tmp:提供一个即时创建临时文件的地方。

3.获取沙盒中文件夹的路径

在Foundation框架中提供了用于快速获取沙盒相关路径的方法和函数,可以快速定位应用程序对应的沙盒路径。

NSString *homePath = NSHomeDirectory();

获取沙盒中Documents文件夹目录

NSArray *documentsArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsPath = [documentsArr objectAtIndex:0];

获取沙盒中Library文件夹目录

NSArray *libraryArr = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

NSString *libraryPath = [libraryArr objectAtIndex:0];

获取沙盒中caches文件夹目录

NSArray *cachesArr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *cachesPath = [cachesArr objectAtIndex:0];

tmp文件夹

NSString *tmpPath = NSTemporaryDirectory();

在涉及数据持久化开发过程中,如果使用到模拟器运行程序,一定会使用到在Mac上查看App所在的沙盒路径。默认情况下,沙盒所在的文件夹是隐藏的,因此需要显示被隐藏的文件夹。

1.在Mac上显示隐藏的文件夹

程序的沙盒文件在Mac上是被隐藏的,所以如果想要查看程序的沙盒路径,首先需要显示Mac上隐藏的文件夹。可以在Terminal中,执行如下命令,来实现文件夹的显示与隐藏。

显示隐藏的文件夹。

不显示隐藏的文件夹。

输入命令后按Enter键,然后退出终端,重新启动Finder,隐藏文件就会显示出来了。

2.在Mac中查看App的沙盒文件夹

在应用程序中,首先使用NSHomeDirectory()函数,获取App的沙盒路径,然后复制路径后,通过Finder可以快速访问

复制该路径后,在Finder中使用前往文件夹功能,即可快速访问沙盒路径,如图13-7所示。

可以查看App沙盒的主要路径

Plist文件是iOS开发过程中非常常用的一种数据持久化方案,主要原因在于其简单易用,因此被广大开发者广泛采用。

在iOS开发中,有的工具可将一些简单的数据进行持久化的存储,方便保存程序的一些配置和用户的一些数据,Plist文件就是保存这些数据的最佳选择。

鉴于Plist属于文件存储,不是数据库存储,所以当数据量不是特别大时,建议采用。一般来说,App在本地不会存储大量的数据,前端所需的数据一般都是存储在远程服务器的数据库中。对于手持终端来说,Plist存储对于绝大多数情况下,都能够满足数据持久化的要求。

2.手工创建Plist文件

假如需要通过Plist存储一些简单的数据,例如,应用的配置信息等,可以手工创建Plist文件。例如,可以创建一个website.plist文件用来存储网址信息。

在Xcode中,新建文件,选择Property List

3.读取Plist文件中的内容

Plist文件创建完成后,就可以使用Foundation框架中提供的文件存取方法读取Plist文件中的数据了。

获取Plist文件所在路径,由于是手工新增的Plist文件,因此存储在mainBundle中。

13.2.2 Plist文件的读取

Plist文件的顶层结构通常是由一个字典或者一个数组构成的。因此,Plist文件的读取思路,就是把Plist文件中的所有数据一次性读取出来,然后放到一个字典对象或数组对象中,供后续操作使用。

1.读取Plist文件返回数组

当Plist文件的顶层结构是一个数组时,通常会用于存储一些具有相同数据结构的数据,这个结构与数据库的表是类似的。

手工添加一个Plist文件,顶层结构是一个Array,然后再添加两条记录,如图13-12所示。

2.读取Plist文件返回字典

当Plist文件的顶层结构是一个字典时,其中存储了多个键值对,通常可以用于保存一些App运行的配置信息。另外,有关配置信息也可以保存在偏好设置中,实现原理完全相同。

手工添加一个Plist文件,顶层结构是一个字典

Plist文件的操作也属于文件操作的范畴,通常可以使用writeToFile:方法,把一个字典对象或数组对象写入一个指定的Plist文件中进行保存。

首先准备需要写入的数据对象,例如:一个字典或数组对象,并在其中存储一些数据。

NSUserDefaults简介

偏好设置在iOS开发中的使用是比较普遍的,主要原因在于其简单易用。偏好设置本质上就是一个Plist文件,不过该Plist文件是由系统自动创建的,并且在Foundation框架中提供了一些专用的访问方法。

1.偏好设置简介

绝大多数iOS应用开发过程中,都会使用到偏好设置,比如保存用户名、密码、字体大小等设置。 Foundation框架提供了一套标准的解决方案为应用提供了偏好设置功能。每个应用都有一个NSUserDefaults实例,通过它来存取偏好设置。NSUserDefaults基本上支持所有的原生数据类型NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger等。关于偏好设置需要了解以下两个要点。

偏好设置也是保存在应用的沙盒中的,保存的路径在Library/Preferences路径下。

偏好设置可以理解为是一个特殊的Plist文件,但由于其本质上还是Plist文件,因此,存储形式还是使用键值对的方式。

2.偏好设置常用方法和属性

在Foundation框架中的NSUserDefaults.h文件中,提供了NSUserDefaults类的方法和属性,常用的方法和属性有以下几个。

standardUserDefaults:获取系统默认的偏好设置对象。

对于简单的数据,完全可以使用Plist来存取数据。随着数据逐渐变大,查询数据和修改数据就会变得越来越麻烦。另外,使用Plist来存取数据无法解决的一个问题是,每次查询数据需要将整个文件都加载到内存中,如果文件很大这显然是不合适的。此时,就需要使用到SQLite。

SQLite是一个数据库引擎,无须服务端支持即可直接运行在客户端上。SQLite使用非常广泛,在每一台iOS设备、Android设备、Mac和Windows 10上面都能使用SQLite。就像其他数据库一样,SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接,并且SQLite直接访问其存储文件。

1.数据类型

存储在SQLite数据库中的数据具有以下几种存储类型

3.创建数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今50年前,随着信息技术和市场的发展,特别是20世纪90年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。

现在来创建一个SQLite数据库。

在控制器类中添加一个sqlite3类型的属性。

第18章 证书管理与应用发布

苹果公司对于程序真机调试以及应用发布都采取了比较严格的措施进行管理和控制,通过证书来管理相关的权限。常见的证书有三类:开发证书(调试证书)、发布证书以及消息推送证书。本章节主要讲解开发证书的管理。

1.开发证书简介

在iOS 9以及Xcode 7之前,假如需要使用真机进行调试,是必须要有开发证书(调试证书)的。iOS 9/Xcode 7发布后,苹果修改了真机调试的策略,只要拥有appleID即可进行真机调试。但是在进行团队开发过程中,还是通常使用公司的开发证书来进行真机调试。

苹果公司对于证书的管理非常严格,不像Android可以随意调试,必须要进行繁杂的证书配置。但是对于一般工程师来说,基本不需要深入掌握苹果证书管理的原理,主要掌握本文介绍的使用方法即可。

对苹果设备进行真机调试时,需要提前准备好两个文件:P12文件以及Provisioning文件,接下来分别介绍下如何生成P12文件和Provisioning文件。

18.1.2 iOS发布证书创建详解

同开发者证书一样,苹果对于发布应用的权限也做了严格的限制。当需要发布一款应用时,必须具备对应的证书文件,才能够对应用进行打包以及上传。与开发证书相比,发布证书的生成以及使用流程基本类似,稍有差别。

1.发布证书(Distribution)简介

发布证书,顾名思义就是用于发布App的证书。对于iOS应用来说,由于Apple ID有企业账号以及个人账号之分,因此,发布证书也有细微差别,主要体现在Provisioning Pro file证书的某些选项上。简单来说,只有Mac设备安装了正确的发布证书,才能够对App应用进行打包(生成ipa文件)以及上传。

所谓的发布证书,一般来说包括2个文件,一个是P12文件,一个是Provisioning Pro file文件,接下来分步骤介绍一下。

苹果设备的消息推送功能是通过苹果服务器完成的,因此,苹果对于每款应用的消息推送权限都进行了严格控制。推送证书也分为开发推送证书以及生产推送证书两种,分别对应App开发的不同阶段以及不同用户使用。目前,市面上有几家非常出色的第三方厂家提供的平台可以简化消息推送的操作,前提是必须要上传应用的推送证书(开发+生产)才能够借助第三方平台来完成批量推送。

App开发完成后,通常情况下,需要上传到App Store进行应用的发布。苹果的应用发布过程相对于Andriod应用比较复杂,需要经过苹果的审核,同时需要借助苹果提供的App发布工具来完成。

开发者在开发应用程序之前,熟悉苹果审核应用的技术、内容以及设计准则是非常重要的,可以大大降低应用审核被拒的可能性。苹果官方给出了截至2016年10月10日应用提交审核被拒的10大原因,大约有67%的开发者因为这十个原因被拒绝,需要开发者重点关注

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值