IOS 总结

1.该程式下沙盒目录 Documents

[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

2.字符串拼接为路径格式 自动添加\

stringByAppendingPathComponent


NSString*pT=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    pT=[pT stringByAppendingPathComponent:@"down.png"];


3. Error 处理

一、获取系统的错误信息

比如移动文件时,获取文件操作错误:

NSError *e = nil;
[[NSFileManager defaultManager] moveItemAtPath:sourcePath toPath:targetPath error:
&e];
if (e) {
  NSLog(
@"move failed:%@", [e localizedDescription]);
}

先定一个空的错误信息

NSError *e = nil;

取地址

&e   

如果有错误信息,打印错误的本地化描述

if (e) {
  NSLog(@"move failed:%@", [e localizedDescription]);
}

 

二、自定义错误信息

通常可以通过下面语句,自定义个NSError对象

复制代码
#define CustomErrorDomain @"com.xiaodao.test"
  typedef enum {

    XDefultFailed = -1000,

    XRegisterFailed,

    XConnectFailed,

    XNotBindedFailed

  }CustomErrorFailed;
复制代码
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"is a error test"                                                                      forKey:NSLocalizedDescriptionKey];
NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:XDefultFailed userInfo:userInfo];

其中,自定义错误域对象CustomErrorDomain,通常用域名反写,也可以是任何其他字符串

code错误标识, 系统的code一般都大于零,自定code可以用枚举(最好用负数, 但不是必须的)

userInfo自定义错误信息,NSLocalizedDescriptionKey是NSError头文件中预定义的键,标识错误的本地化描述

可以通过NSError的localizedDescription方法获得对应的值信息

 

主调用函数一般传入NSError指针的指针,来获取错误信息,例如

- (Bool)doSomething:(NSDictionary *)parameter1 error:(NSError **)aError
{
   //TODO: do something
  
*aError = [NSError errorWithDomain:CustomErrorDomain code:XDefultFailed userInfo:userInfo];
  return Yes;
}

 

 

三、NSError头文件解析

1.NSError对象中,主要有三个私有变量

错误域(NSInteger): _domain

错误标示(NSString *):_code

错误详细信息(NSDictionary *):_userInfo

通常用_domain和_code一起标识一个错误信息

 NSString*pF= [NSString stringWithFormat:@"%s",__FUNCTION__];
 NSString*pL= [NSString stringWithFormat:@"%d",__LINE__];

获取_domain

- (NSString *)domain;

获取 _code

- (NSInteger)code;

获取 _userInfo

- (NSDictionary *)userInfo;

 

2.预定义域

AppKit和Foundation库中主要的错误域

NSString *const NSCocoaErrorDomain;

其他域

NSString *const NSPOSIXErrorDomain;
NSString *const NSOSStatusErrorDomain;
NSString *const NSMachErrorDomain;

 

3.预定义的userinfo键名

推荐的标准方式,通用键

NSString *const NSUnderlyingErrorKey;

其他键,对应各自读取信息的方法:

详细描述键

NSString *const NSLocalizedDescriptionKey;

取方法

- (NSString *)localizedDescription;

失败原因键

NSString *const NSLocalizedFailureReasonErrorKey

取方法

- (NSString *)localizedFailureReason;

恢复建议键

NSString *const NSLocalizedRecoverySuggestionErrorKey;

取方法

- (NSString *)localizedRecoverySuggestion;

恢复选项键

NSString *const NSLocalizedRecoveryOptionsErrorKey

取方法

- (NSArray *)localizedRecoveryOptions;

其他键

NSString *const NSRecoveryAttempterErrorKey; 
NSString *const NSHelpAnchorErrorKey;
NSString *const NSStringEncodingErrorKey ;
NSString *const NSURLErrorKey;
NSString *const NSFilePathErrorKey;

 

用法:

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"这是错误详细的描述信息", NSLocalizedDescriptionKey, error, NSUnderlyingErrorKey, nil]];

 

4.主要的初始化方法:

- (id)initWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict;
+ (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict;


4. 方法前面+和-的区别   

+ 类方法   [类名  方法名]调用

- 对象放方法  [实例对象   方法名]调用 


5.@property

@property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在Xcode4.5以及以后的版本,@synthesize可以省略。

1.atomic与nonatomic
atomic
:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

2.readwrite与readonly
readwrite
:这个属性是默认的情况,会自动为你生成存取器。
readonly:只生成getter不会有setter方法。
readwritereadonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。

3.strong与weak
strong
:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。
strongretain功能相似;weakassign相似,只是当对象消失后weak会自动把指针变为nil;

4.assign、copy、retain
assign
:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。
retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。
copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。
也可以直接使用:
    使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
    使用copy: 对NSString
    使用retain: 对其他NSObject和其子类

6.getter setter

getter:是用来指定get方法的方法名
setter:是用来指定set访求的方法名
在@property的属性中,如果这个属性是一个BOOL值,通常我们可以用getter来定义一个自己喜欢的名字,例如:
@property (nonatomic, assign,  getter=isValue) boolean value;
@property (nonatomic, assign,  setter=setIsValue) boolean value;



7.APNS详解


建议每次程序启动的时候都调用registerForRemoteNotificationTypes来重新获取设备相关的token,而不要缓存token.

这是因为,如果用户重装了iOS或者用户换了设备并且恢复程序备份到一个新的设备,都将导致这个token值不一样。


当iOS收到远程消息时,

如果应用程序isn't running in the foreground,iOS会处理这个消息,比如弹出一个框、在应用程序的icon上显示红色数字。
然后如果用户通过点击弹框进入程序,iOS会启动程序并调用application:didFinishLaunchingWithOptions并且拿远程消息的payload进行传参.
如果用户直接点击app icon进入程序,iOS会启动程序并同样调用application:didFinishLaunchingWithOptions,但是传参将不会有远程消息的任何信息。

如果应用程序is running in the foreground,就会调用application:didReceiveRemoteNotification.

IOS设备会持久连接APNs以接受远程消息。

provider发送消息到APNs,然后APNs再发送到目标IOS设备。(这个传输是单向的。)
这个消息的内容含两部分:设备token和payload.

反馈服务--
    有时候APNs发送消息到某设备(token)某程序(bundle identifier)但是该设备并没有这个程序,多次这种情况之后,APNs会通知provider,通过其连接的一个反馈服务(a feedback service)。
    反馈服务为每一个程序维护了一个失效设备列表,provider应该获取这个列表从而停止向APNs发送以这些设备为目的地的某程序的远程消息。

APNs的安全架构--
provider需要一个有效证书才能和APNs连接(这个证书有目标程序的Bundle identifier信息)。
与APNs连接后,provider向APNs发送的消息带有设备token(由目标程序连接provider然后发来token),APNs以此找到目标设备,然后看目标设备里的目标程序有接受推送的证书,APNs以此验证给目标设备的目标程序发送的消息是合法的。

注意:远程消息是不可靠的。

----------------------------------------▲Provider-------------------------------------------
Payload--
最多256bytes。


本地化alert:
eg:"alert" : {"loc-key":"GAME_PLAY_REQUEST_FORMAT","loc-args":["Jenna","Frank"]},
程序包里面的本地化字符串如下:
"GAME_PLAY_REQUEST_FORMAT" = "%@ and %@ have invited you to play Monopoly";
这样,最后显示alert的字符串就是:
"Jenna and Frank have invited you to play Monopoly"

一个JSON Payload的完整例子(为了性能,建议去掉空白字符)
{
"aps" : 
{
"alert" : "Message received from Bob",
"badge" : 5,
"sound" : "bingbong.aiff"
},
"myCustomData" : ["bang", "bang、bang、bang"],
"myCustomData2": 42
}

----------------------------------------▲部署-------------------------------------------
要部署provider端client/server程序,需要来自苹果的SSL证书。下称provider证书。
provider证书对应于特定的iOS Application(Bundle identifier)。
同时,provider证书分为开发测试和产品两种版本,对应于两种APNs环境:
Sandbox(Development) :可用模拟器测试。地址是gateway.sandbox.push.apple.com: TCP 2195
Production(Distribution):gateway.push.apple.com: TCP 2195
同 时,provision profile也对应了两个版本:Development和Distribution.(The Distribution provision profile is a requirement for submitting your application to the App Store.)

可以在xcode里看iOS application所处何环境:看编译选项里的code-signing identity,如果是"iPhone Developer:Firstname Lastname"证书与provisioning profile匹配成对,说明是sandbox环境。如果是"iPhone Distribution:Companyname"证书与provision profile匹配成对,说明是production环境。根据release和debug分别配置code-signing identity选项的证书将会是一个好主意。

注意:尽管SSL证书(即provider证书)没有放到iOS application的providion profile里,但是ios application是否支持远程消息推送依然取决于profile,因为profile内含开发者证书、设备ID、application ID(Bundle identifier)、"是否支持推送"(在苹果开发者网站上配置证书的时候配置的)等信息。(The provisioning profile is a collection of assets that associates developers of an application and their devices with an authorized development team and enables those devices to be used for testing.The profile contains certificates,device identifiers,the application's bundle ID,and all entitlement,including <aps-environment>.)
以文本方式打 开*.mobileprovision,会看到里面类似xml格式,其中<key>Entitlements</key>里包含 了<key>aps-environment</key>,说明支持远程消息推送,<key>aps- environment</key>下面的<string>说明是调试版本还是发布版本(对应于Sandbox环境和 Production环境)。

●安装证书到服务端
你应该安装SSL证书和私匙到你的provider程序运行的服务器上。
步骤如下:
0.安装该证书到mac电脑的钥匙串。
1.打开钥匙串,在左侧面板上点击我的证书栏。
2.找到这个SSL证书,展开会看到证书和私匙。
3.我们选中证书和私匙,然后导出为"个人信息交换文件"--即扩展名为p12的文件。
4.provider服务器程序最好用Ruby和Perl这类语言,可以方便的处理"个人信息交换文件"里的证书。mac下打开终端输入以下命令以把证书转换为这类语言乐于交流的格式:
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
5.把这pem文件拷到服务器上并安装到某个适当的位置。


----------------------------------------▲Provider与APNs连接----------------------------------------
●连接APNs之前provider需要具备什么
APNs提供的连接接口是二进制的、streaming TCP socket、异步 的。
Production环境是通过gateway.push.apple.com:2195,Development环境是gateway.sandbox.push.apple.com:2195。
Provider可以建立多个与APNs的连接。每个都得用TLS(or SSL)来建立安全通道,需要用到SSL证书(就是上面提到的provider连接APNs要用到的SSL证书)。
----------------------
Note  要建立与APNs的TLS会话,需要在provider服务器上安装Entrust Secure CA根证书。Moa OS X是默认已安装的,其他系统的话,可以没有安装,可以从Entrust SSL Certificates的网站http://www.entrust.net/下载安装根证书。
----------------------

●发送消息的二进制接口和消息的数据包格式
消息须是网络字节顺序(即大尾顺序),消息里面的payload部分不可以超过256字节,且不得以'\0'结尾。

消息格式见"The Binary Interface and Notification Formats"章节。

●The Feedback Service
feedback service包含了这样的列表:某iOS应用程序对应的"设备"("设备"用二进制格式的设备token来标识)。--这些设备是由于各种原因而不能接收APNs发来的消息。
Provider应该定期查询这个列表,并且作出对应处理,如:停止向这些的设备发送消息。

provider访问feedback server通过一个与发送消息类似的二进制接口。
Production环境通过feedback.push.apple.com:2196来建立连接,Development通过feedback.sandbox.push.apple.com:2196。
feedback service和发送消息是不同的服务接口(但都属于APNs),他的连接方式和发送消息是一样的。也要通过证书建立SSL连接,连接后你不需要发送任何命令,直接开始读取流一直读完为止,然后provider要解析读到的数据。

数据是由多个这样的格式组成的:
| 四字节时间 | 2字节的token 长度 | 32字节的设备token |
关 于"四字节时间":Provider需要判断对应设备的这个iOS应用程序有没有在该时间之后重新像provider发送注册推送消息所获得的设备 token。如果没有,就认为该设备失效了,需停止向该设备发送消息。如果有,那就是这个设备失效过,但是现在又有效了,只是feedback service还没来得及刷新列表。


不同的证书device token是不同的。而且发送的apns服务器地址也不同产品发布APNS服务器:gateway.push.apple.com,获取device token的方法是和开发一样吧,都是在注册成功的回调里面获得。。不过就是没办法debug。 

8.jsonkit

NSString *str = nil;

    //字符串
    NSMutableString *string = [[NSMutableString alloc] init];
    [string appendString:@"xxxx"];
    str = [string JSONString];
    NSLog(@"str1:%@",[NSString stringWithString:str]);
    
    
    //数组
    NSArray *array = [[NSArray alloc] initWithObjects:@"111",@"333",@"222", nil];
   // NSMutableArray *array = [NSMutableArray array];
    str = [array JSONString];
    NSLog(@"str2:%@",[NSString stringWithString:str]);
    [array release ];
    
    //字典
    NSArray *firstArr = [NSArray arrayWithObjects:@"first",@"second", nil];
    //基本数据类型转换成NSNumber类型
    NSArray *secondArr = [NSArray arrayWithObjects:[NSNumber numberWithDouble:2.1],[NSNumber numberWithBool:NO], nil];
    //加到字典中
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:firstArr,@"first",secondArr,@"second", nil];
    //转化成json格式
    str = [dic JSONString];
    NSString *str2 = [NSString stringWithString:str];
    NSLog(@"str3:%@",str2);
    
    //编码
    NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:array];
//    NSLog(@"archive:%@",archive);
    NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithData:archive];
    NSLog(@"arr2:%@",arr2);

        // json转对象

  NSDictionary*pD= [content objectFromJSONString];

9.ios ascii

                int asciiCode = 1;
                NSString *string = [NSString stringWithFormat:@"%c", asciiCode];
                 NSString *str = [NSString stringWithFormat:@"%c", asciiCode];
               string =[ @"asdf" stringByAppendingString:string];
                string =[string stringByAppendingString:@"zxvc"];
        
        
                NSArray *arr = [string componentsSeparatedByCharactersInSet: [NSCharacterSet
                                                                           characterSetWithCharactersInString:str]];
                NSLog(@"%@", arr);


10.NSString与int和float的相互转换

  NSString *tempA = @"123";

  NSString *tempB = @"456";


1,字符串拼接

 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB];


2,字符转int

int intString = [newString intValue];


3,int转字符

NSString *stringInt = [NSString stringWithFormat:@"%d",intString];


4,字符转float

 float floatString = [newString floatValue];


5,float转字符

NSString *stringFloat = [NSString stringWithFormat:@"%f",intString];



11.UIActivityIndicatorView 的使用 

UIActivityIndicatorView 非常简单 ,就是一个转圈圈的控件


初始化方法
- initWithActivityIndicatorStyle
控制一个Activity Indicator
- startAnimating
- stopAnimating
- isAnimating
hidesWhenStopped 属性


配置Activity Indicator 外观
activityIndicatorViewStyle 属性
color 属性  (iOS 5  引入)


常量三个
typedef enum { 
UIActivityIndicatorViewStyleWhiteLarge, 
UIActivityIndicatorViewStyleWhite, 
UIActivityIndicatorViewStyleGray,
} UIActivityIndicatorViewStyle; 

使用方式就是
UIActivityIndicatorView *testActivityIndicator = [UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]];
testActivityIndicator.center = CGPointMake(100.0f, 100.0f);//只能设置中心,不能设置大小
[testActivityIndicator setFrame = CGRectMack(100, 100, 100, 100)];//不建议这样设置,因为UIActivityIndicatorView是不能改变大小只能改变位置,这样设置得到的结果是控件的中心在(100,100)上,而不是和其他控件的frame一样左上角在(100, 100)长为100,宽为100.
[self addSubview:testActivityIndicator];
testActivityIndicator.color = [UIColor redColor]; // 改变圈圈的颜色为红色; iOS5引入
[testActivityIndicator startAnimating]; // 开始旋转
[testActivityIndicator stopAnimating]; // 结束旋转
[testActivityIndicator setHidesWhenStopped:YES]; //当旋转结束时隐藏

还有一个是isAnimating方法,返回一个BOOL值,可以用这个方法来判断控件是否在旋转

initWithActivityIndicatorStyle是UIActivityIndicatorView唯一的初始化方法
属性值是一个枚举变量,只有三个值:
UIActivityIndicatorViewStyleWhite; 白色圆圈
UIActivityIndicatorViewStyleWhiteLarge; 白色圆圈 但是要大些
UIActivityIndicatorViewStyleGray; 灰色圆圈

- (void)viewDidLoad

{

    activity = [[UIActivityIndicatorViewallocinitWithFrame:CGRectMake(003030)];//指定进度轮的大小

    [activitysetCenter:CGPointMake(160140)];//指定进度轮中心点

    [activitysetActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];//设置进度轮显示类型

    [self.viewaddSubview:activity];

    [superviewDidLoad];

}

 

//button点击所触发的方法。 启动或关闭进度轮。

- (IBAction)startOrStop:(id)sender{

    if([activityisAnimating]){

        [activitystopAnimating];

    }

    else

        [activitystartAnimating];

}

loading.frame=CGRectMake([UIScreen mainScreen].bounds.size.width/2 - 45/2, [UIScreen mainScreen].bounds.size.height/2 - 45/2+120, 45, 45);


12.NSMutableDictionary 

NSMutableDictionary 是NSDictionary的子类,所以继承了NSDictionary的方法。

[NSMutableDictionary dictionaryWithCapacity:10] : 创建一个可变词典初始指定它的长度为10.,动态的添加数据如果超过10这个词典长度会自动增加,所以不用担心数组越界。推荐用这种方式

[NSMutableDictionary initWithCapacity:10]  :只是初始化一个词典的长度为10。

[dictionary setObject:@"雨松MOMO" forKey:@"name"] :向可变的词典动态的添加数据 ,这里的key是name ,值是雨松MOMO如果词典中存在这个KEY的数据则直接替换这个KEY的值。(易混的地方,慎重!)

[dictionary removeAllObjects..] : 删除掉词典中的所有数据。

[dictionary removeObjectForKey..] :删除掉词典中指定KEY的数据 。


13.IOS8 UIAlertController

  UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                                                                       message:@"It will use the browser to this URL."
                                                                preferredStyle:UIAlertControllerStyleAlert];
        // 確認按鈕
        UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString: self.pZBarResult]];
            self.pZBarResult=@"";
            [self backAction];
        }];
        
        // 取消按鈕
        UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel                                                                                                                handler:^(UIAlertAction * action) {}];
        
        [alert addAction:defaultAction];
        [alert addAction:cancel];
        [self presentViewController:alert animated:YES completion:nil];

14. framework引用

ZbarSDk 

  • AVFoundation.framework
  • CoreMedia.framework
  • CoreVideo.framework
  • QuartzCore.framework
  • libiconv.dylib

Reachability
 SystemConfiguration.framework

ASIHTTPRequest

CFNetwork.framework, SystemConfiguration.framework, MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib
全部添加-fno-objc-arc


15 File

  1. // 从路径中获得完整的文件名(带后缀)      
  2. exestr = [filePath lastPathComponent];  
  3.     NSLog(@"%@",exestr);  
  4. // 获得文件名(不带后缀)  
  5. exestr = [exestr stringByDeletingPathExtension];      
  6.     NSLog(@"%@",exestr);  
  7.   
  8. // 获得文件的后缀名(不带'.')  
  9. exestr = [filePath pathExtension];  
  10.     NSLog(@"%@",exestr);  

16.UIPopoverController 

取消箭头
permittedArrowDirections:0 
ios8
  UIPopoverPresentationController *ppc =alertController.popoverPresentationController;
        ppc.sourceView=self.view;
        ppc.sourceRect = CGRectMake(0, self.view.bounds.size.height*0.99, self.view.bounds.size.width, 2);
        ppc.delegate=self;
    ppc.permittedArrowDirections=0;


UIAlertController title样式
//    UIColor *backgroundColor = [UIColor blueColor];
//    NSNumber *baseLineOffset = [NSNumber numberWithFloat:20.0];
//    UIColor *foregroundColor = [UIColor redColor];
//    NSNumber *kern = [NSNumber numberWithFloat:5.0];
//    NSNumber *ligature = [NSNumber numberWithFloat:3.0];
//    NSURL *linkURL = [NSURL URLWithString:@"http://www.baidu.com"];
//    NSNumber *underline = [NSNumber numberWithInt:NSUnderlineStyleSingle];
//    NSDictionary *attrsDic = @{NSForegroundColorAttributeName: foregroundColor,
//                              
//                               NSBaselineOffsetAttributeName: baseLineOffset,
//                               NSKernAttributeName: kern,
//                               NSLigatureAttributeName: ligature,
//                               NSLinkAttributeName: linkURL,
//                               NSUnderlineStyleAttributeName: underline
//                               };
//    NSAttributedString *attributedString_str_atts = [[NSAttributedString alloc] initWithString:@"Presenting the great... Hulk Hogan" attributes:attrsDic];
//    
//    
//    
//    NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Presenting the great... Hulk Hogan!"];
//    [hogan addAttribute:NSFontAttributeName
//                  value:[UIFont systemFontOfSize:20.0]
//                  range:NSMakeRange(24, 11)];
//    //[alertController setValue:hogan forKey:@"attributedTitle"];


17 判断是否为ipad

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)


18.单例 ARC

h.
//+ (AlertShow*)sharedManager;
m。
//+ (AlertShow*)sharedManager
//{
//    static dispatch_once_t predicate;
//    dispatch_once(&predicate, ^{
//        _instance = [[self alloc] init];
//    });
//    return _instance;
//}


+ (id)allocWithZone:(struct _NSZone *)zone
{
    static id _instance =nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance=[super allocWithZone:zone];
    });
    return _instance;
}


19 各种证书

概述:

苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还是感觉很纠结,索性直接记录下来,日后你我他查阅都方便;

首先得描述一下各个证书的定位,作用,这样在制作的时候心中有谱,对整个流程的把握也会准确一些;

1、开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证明自己开发者身份的;

2、appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;

3、推送证书(分为开发和发布两种,类型分别为APNs Development ios,APNs Distribution ios),该证书在appID配置中创建生成,和开发者证书一样,安装到开发电脑上;

4、Provisioning Profiles,这个东西是很有苹果特色的一个东西,我一般称之为PP文件,该文件将appID,开发者证书,硬件Device绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的udid;是真机调试和必架必备之珍品;

平常我们的制作流程一般都是按以上序列进行,先利用开发者帐号登陆开发者中心,创建开发者证书,appID,在appID中开通推送服务,在开通推送服务的选项下面创建推送证书(服务器端的推送证书见下文),之后在PP文件中绑定所有的证书id,添加调试真机等;


20 smart banner

 <meta name="apple-itunes-app" content="app-id=1047472741"/>



21 swift

var x:Int?

if let y = x 

{  

// x was not nil, and its value is now stored in y

}

else 

{ // x was nil}



22.xcodebuild  

cd 進入到程序目錄

xcodebuild  -sdk iphoneos9.1

xcrun -sdk iphoneos9.1 PackageApplication -v /Users/xxx/Desktop/mac/poc/web/web/  -o /Users/xxx/Desktop/mac/poc/web/web/build/a123.ipa



23.Profiles文件位置

/Users/vsmac/Library/MobileDevice/Provisioning\ Profiles/


24.iOS的版本号

iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中target,点击“Summary”后看到。

Version在plist文件中的key是“CFBundleShortVersionString”,和AppStore上的版本号保持一致,

Build在plist中的key是“CFBundleVersion”,代表build的版本号,该值每次build(应该是版本更新)之后都应该增加1。

这两个值都可以在程序中通过下面的代码获得:
[[[NSBundle mainBundle] infoDictionary] valueForKey:@"key"];

25. 字符串转Json

#pragma mark 字符串转Json
-( NSDictionary *)parseJSONStringToNSDictionary:( NSString *)JSONString {
NSData *JSONData = [JSONString dataUsingEncoding: NSUTF8StringEncoding ];
NSDictionary *responseJSON = [ NSJSONSerialization JSONObjectWithData:JSONData options: NSJSONReadingMutableLeaves error: nil ];
return responseJSON;
}


26. 获得mime类型

NSURLRequest *request = [ NSURLRequest requestWithURL :[ NSURL fileURLWithPath :path]];

NSError  *error;
NSURLResponse *response;

[ NSURLConnection sendSynchronousRequest :request 
       returningResponse :&response 
                   error :&error];


return  [response  MIMEType ];


27. Base64互转

// Create NSData object
NSData *nsdata = [ @"iOS Developer Tips encoded in Base64" dataUsingEncoding :NSUTF8StringEncoding ] ;
 
// Get NSString from NSData object in Base64
NSString *base64Encoded = [ nsdata base64EncodedStringWithOptions : 0 ] ;
 
// Print the Base64 encoded string
NSLog ( @"Encoded: %@" , base64Encoded ) ;
 
// Let's go the other way...
 
// NSData from the Base64 encoded str
NSData *nsdataFromBase64String = [ [ NSData alloc ]  initWithBase64EncodedString :base64Encoded options : 0 ] ;
 
// Decoded NSString from the NSData
NSString *base64Decoded = [ [ NSString alloc ]  initWithData :nsdataFromBase64String encoding :NSUTF8StringEncoding ] ;
NSLog ( @"Decoded: %@" , base64Decoded ) ;

28.OpenURL和handleOpenURL

OpenURL是你通过打开一个url的方式打开其它的应用或链接
,handleOpenURL是其它应用通过调用你的app中设置的URL scheme打开你的应用
。如果你使用过第三方分享SDK,你应该知道需要在AppDelegate中实现handleOpenURL方法
,例如微信的分享,你在你的app中点击了分享,就会跳转到微信,这就是一个openURL的过程调起第三方应用
,如果你分享成功或者取消分享返回到自己的app,这时你AppDelegate中的handleOpenURL的方法就会被调用
,在这个方法中你可以根据实际需要实现你想要做的事

29. Object-C 中各数据类型转换

1,NSData 与 NSString
  
NSData --> NSString
  
NSString *aString = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];
  NSString --> NSData
  
NSString *aString = @"1234";
  NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding];

2,NSData 与 Byte
  
NSData --> Byte
  
NSString *testString = @"1234567890";
  NSData *testData = [testString dataUsingEncoding: NSUTF8StringEncoding];
  Byte *testByte = (Byte *)[testData bytes];
  Byte --> NSData
  Byte byte[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
  NSData *adata = [[NSData alloc] initWithBytes:byte length:24];

3,NSData 与 UIImage
  
NSData --> UIImage
  
UIImage *aimage = [UIImage imageWithData: imageData];
  //例:从本地文件沙盒中取图片并转换为NSData
  NSString *path = [[NSBundle mainBundle] bundlePath];
  NSString *name = [NSString stringWithFormat:@"ceshi.png"];
  NSString *finalPath = [path stringByAppendingPathComponent:name];
  NSData *imageData = [NSData dataWithContentsOfFile: finalPath];
  UIImage *aimage = [UIImage imageWithData: imageData];
  UIImage-> NSData
  NSData *imageData = UIImagePNGRepresentation(aimae);

4,NSData 与 NSMutableData
  NSData --> MSMutableData
  NSData *data=[[NSData alloc]init];
  NSMutableData *mdata=[[NSMutableData alloc]init];   
  mdata=[NSData dataWithData:data];

5,NSData合并为一个NSMutableData

- (NSString *)filePathWithName:(NSString *)filename
 {
         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
         NSString *documentsDirectory = [paths objectAtIndex:0];
         return [documentsDirectory stringByAppendingPathComponent:filename];
 }
 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
     //音频文件路径
         NSString *mp3Path1 = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"];
         NSString *mp3Path2 = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"mp3"];
         //音频数据
         NSData *sound1Data = [[NSData alloc] initWithContentsOfFile: mp3Path1];
         NSData *sound2Data = [[NSData alloc] initWithContentsOfFile: mp3Path2];
         //合并音频
         NSMutableData *sounds = [NSMutableData alloc];
         [sounds appendData:sound1Data];
         [sounds appendData:sound2Data];
         //保存音频
 
         NSLog(@"data length:%d", [sounds length]);
 
         [sounds writeToFile:[self filePathWithName:@"tmp.mp3"] atomically:YES];
         
         [window makeKeyAndVisible];
     
     return YES;
 }


30. GCD

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                                //这里就做一些比较耗时的操作,如请求数据。。
                                dispatch_async(dispatch_get_main_queue(), ^{
                               // something
                                });  
                            });
 //  后台执行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });

 // 主线程执行:
 dispatch_async(dispatch_get_main_queue(), ^{
      // something
 });

 // 一次性执行:
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
     // code to be executed once
 });

 // 延迟2秒执行:
 double delayInSeconds = 2.0;
 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     // code to be executed on the main queue after delay
 });

 // 自定义dispatch_queue_t
 dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
 dispatch_async(urls_queue, ^{  
   // your code 
 });
 dispatch_release(urls_queue);

 // 合并汇总结果
 dispatch_group_t group = dispatch_group_create();
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程一
 });
 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
      // 并行执行的线程二
 });
 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
      // 汇总结果
 });

31.蓝牙

CoreBlueTooth.framework
【必须要支持蓝牙4.0,且iPhone4以上,即至少4s手机。可与第三方设备交互数据,
蓝牙的缓冲大小只有20bytes,在发送数据时最多只能发送20bytes

32.UUID

使用Mac OS X的Terminal.app,用uuidgen命令生成一个128bit的UUID


33.orientation


  1.   //宣告一個UIDevice指標,並取得目前Device的方向    
  2.     UIDevice *device = [UIDevice currentDevice] ;     
  3.         
  4.     //取得當前Device的方向,來當作判斷敘述。(Device的方向型態為Integer)    
  5.     switch (device.orientation) {    
  6.         case UIDeviceOrientationFaceUp:    
  7.         NSLog(@"螢幕朝上平躺");    
  8.             break;    
  9.                 
  10.         case UIDeviceOrientationFaceDown:    
  11.         NSLog(@"螢幕朝下平躺");    
  12.             break;    
  13.                 
  14.         //系統無法判斷目前Device的方向,有可能是斜置     
  15.         case UIDeviceOrientationUnknown:    
  16.         NSLog(@"未知方向");    
  17.             break;    
  18.                 
  19.         case UIDeviceOrientationLandscapeLeft:    
  20.         NSLog(@"螢幕向左橫置");    
  21.             break;    
  22.                 
  23.         case UIDeviceOrientationLandscapeRight:    
  24.         NSLog(@"螢幕向右橫置");    
  25.             break;    
  26.                 
  27.         case UIDeviceOrientationPortrait:    
  28.         NSLog(@"螢幕直立");    
  29.             break;    
  30.                 
  31.         case UIDeviceOrientationPortraitUpsideDown:    
  32.         NSLog(@"螢幕直立,上下顛倒");    
  33.             break;    
  34.                 
  35.         default:    
  36.         NSLog(@"無法辨識");    
  37.             break;    
  38.     }    



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值