一、环境变量

macOS 默认的是 Bourne Shell,其环境变量配置文件及加载顺序如下:

1
2
3
4
5
6
7
/etc/profile
/etc/bashrc
/etc/paths
~/.bash_profile # macOS
~/.bash_login
~/.profile
~/.bashrc # linux

其中 /etc/profile /etc/bashrc/etc/paths 是系统级环境变量,对所有用户都有效。但它们的加载时机有所区别:

  • /etc/profile 任何用户登陆时都会读取该文件
  • /etc/bashrc bash shell执行时,不管是何种方式,读取此文件
  • /etc/paths 任何用户登陆时都会读取该文件
阅读全文 »

Tips

编译设置

  • Base SDK设置

    指的是当前编译所用的SDK 版本。

    可以将值改为“Latest iOS”或者是Xcode支持列表上的任意版本的SDK。Base SDK设置会引导编译器使用该版本的SDK编译和构建应用,也就是说,它会直接控制应用使用哪些API。

  • Deployment Target设置

    它控制着运行应用需要的最低操作系统版本。

    如果你将它设成了特定版本,比如7.0,App Store会自动阻止运行早期操作系统的用户下载或安装这个应用。目前支持iOS 7.0系统的主要是那些大厂APP。一般APP仅仅支持8.0系统即可。

若你想要体验最新的iOS 10的功能,又要兼容iOS 8.0版本,Base SDK设置为最新的iOS 10(默认即可)。Deployment Target设置为iOS 8.0。当然,你用到的iOS 10 的API,要确保它们不会在iOS 8.0上不会crash。

阅读全文 »

想了解更多iOS 通知

可以去下面repository看看:

PushNotificationEverything

静默推送

填个坑

设置角标

[UIApplication sharedApplication].applicationIconBadgeNumber = 0;

!!!注意:

应用角标特性

1. 假如本地推送和远程推送的消息payload都不带有badge字段,那么不管角标如何设置。
* 点击推送,点击一条消除一条;
* 点击APP,推送不会消除;

2. 如何本地推送或远程推送中含有payload带有badge字段,
* 假如角标设为“当前角标-1”,且不为0,推送点击一条消除一条,点击主应用,通知中心推送不改变;
* 假如角标设为0,不管点击推送,还是点击应用,那么推送会全部清除。
阅读全文 »

本文翻译至苹果开发者文档:URL Session Programming Guide
部分翻译有参考。

关于URL加载系统

本指南描述了使用标准Internet协议来处理URLs、与服务器通信的相关类。
URL Loading System包含了一系列类和协议,来支持app访问URL上的内容。核心类是NSURL,使得app可以操作URL以及该URL指向的内容。
为了支持NSURL,Foundation framework提供了丰富的类来帮助你加载URL的内容、上传数据到服务器、管理cookie存储,控制缓存,在app上处理证书和认证方式,以及扩展用户协议。

URL Loading System支持通过以下协议来访问资源:

  • FTP协议(ftp://)
  • 超文本传输协议(http://)
  • 加密超文本传输协议(https://)
  • 本地资源(file://)
  • 数据URLs(data://)

它也透明的支持用户系统设置的代理服务器和SOCKS网关。

提示:
获得更多关于在OS X中加载服务的,阅读Launch Services Programming Guide;
获得更多关于在OS X中NSWorkSpace使用“openURL:”方法,阅读NSWorkspace Class Reference;
获得更多关于在iOS中UIApplication使用“openURL:”方法,阅读 UIApplication Class Reference ;

阅读全文 »

本文翻译至苹果开发者文档:App Programming Guide for iOS

简介

关于iOS应用架构

在iOS系统中的APP需要提供极好的用户体验。不仅仅是APP良好的设计以及用户界面,绝佳的用户体验还包括许多其他因素。用户期待iOS APP能够运行流畅,响应及时,并且期望APP尽可能使用更少的电量。APP需要支持所有最新的iOS设备,并且针对当前设备进行适配。实现以上行为期初看起来会很困难,但是iOS系统会为实现提供帮助。

本文为了使你的应用在iOS设备上运行良好,突出应用的的核心行为。你也许不会实现在本文中提及的每一个特性,但是你需要在你的每个项目中考虑到这些特性。

Note:开发iOS应用,需要一个基于Inter安装了iOS SDK的Mac电脑。iOS SDK可以从这里获取。

阅读全文 »

接上,前两篇:

构建iOS Model层(一)最简单的实现Model解析

构建iOS-Model层(二)类型解析

嵌套

所谓嵌套,分两种情况:

  1. 字典里面包含字典,该字典可以转换为模型;

    NSDictionary *dic = @{
    ​ @”name”:@”wenghengcong”,
    ​ @”dog”:@{
    ​ @”nickName”:@”John”,
    ​ @”furColor”:@”blue”
    ​ }
    ​ };

  2. 字典里面包含数组,该数组里面又包含字典,而数组里面包含的字典可以转换为模型。

    NSDictionary *dic = @{
    ​ @”name”:@”wenghengcong”,
    ​ @”books”:@[
    ​ @{@”title”:@”Book1”,@”price”:@”1.0”},
    ​ @{@”title”:@”Book2”,@”price”:@”4.0”}
    ​ ]
    ​ };

综合上面两种情况:现在的JSPerson头文件如下:

阅读全文 »

上篇,讲到了实现Model解析的原理,但是不完整,类型解析只针对了我们特定的类型,在这篇,将完善类型解析这一部分。

Type Encoding

首先,抛出苹果给的文档。

Objective-C Runtime Programming Guide-Type Encodings

Objective-C Runtime Programming Guide-NextPrevious
Declared Properties

其中的Type Encoding类型编码摘要如下:

阅读全文 »

Model层框架

在iOS中,Model层的框架很多,Github中,star数众多的有:

RestKitMantleMJExtensionJSONModelYYModel

通过研读这些技术框架的实现,想自己实现一个Model层框架。关于这些框架,YY还写了一篇评测:

iOS JSON 模型转换库评测

引言

那么,这篇博客就是入门,用基本的原理,特定的对象实现Model层解析。

问题来了!

如何将字典转换为模型?

阅读全文 »

本文译自《The Remote Notification Payload》

每个远程通知都包含一个有效载荷。有效载荷包含了系统如何提醒用户和你提供的自定义数据的相关信息。通知有效载荷的最大值取决于你服务器所调用的API。当你使用HTTP/2协议的API时,最大的有效载荷值是4096字节。如果采用的是之前的二进制接口,最大值为2048字节。APNs会拒绝任何超过最大长度的通知。

阅读全文 »

NSTimer类详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@interface NSTimer : NSObject
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(nullable id)ui repeats:(BOOL)rep NS_DESIGNATED_INITIALIZER;

- (void)fire;

@property (copy) NSDate *fireDate;
@property (readonly) NSTimeInterval timeInterval;

@property NSTimeInterval tolerance NS_AVAILABLE(10_9, 7_0);

- (void)invalidate;
@property (readonly, getter=isValid) BOOL valid;

@property (nullable, readonly, retain) id userInfo;

@end
阅读全文 »

这是Objective-C系列的第5篇。

一、最佳实践

  • 多用Block枚举,少用for循环;
  • NSDictionary的键值内存语义不符合要求,可以自定义实现;
  • 构建缓存时选用NSCache而非NSDictionary
    • 实现自动缓存是应选用NSCache而非NSDictionary对象,因为NSCache可以提供优雅的自动删减功能,而且是“线程安全的”,此外,它与字典不同,并不会copy键;
    • 可以给NSCache设置上限,用以限制缓存中的对象总个数及“总成本”,而这些尺度定义了缓存删减其中对象的时机,但是绝对不要把这些尺度当初可靠的“硬限制”。它们仅仅对NSCache起指导作用;
    • 将NSPureableData与NSCache搭配使用,可实现自动清除数据的功能,也就是说,当NSPureableData对象所占内存为系统所丢弃是,该对象那自身也会从缓存中移除;
    • 如果缓存使用得当,那么应用程序的响应就能提升。只有那种“重新计算起来很费事”的数据,才值得放入缓存,比如那些需要从网络获取或从磁盘读取的数据;
  • 精简initalize与load的实现代码
阅读全文 »

这是Objective-C系列的第4篇。

一、最佳实践

  • 在开发中合理巧妙的使用位段
  • 将类的实现代码分散到便于管理的数个分类之中

    • 使用分类机制把类的实现代码划分成易于管理的小模块;
    • 将应该视为“私有”的方法归入名叫Private的分类中,以隐藏实现细节。
阅读全文 »