iOS App Programming Guide

本文详细介绍了iOS应用程序的用户界面选择、数据模型、生命周期管理、内存管理及后台运行策略等内容。探讨了UIKit库的处理流程,包括app启动过程、状态转换、中断处理以及如何支持多线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户界面的选择:
1:堆积方式:sdk提供的控件,你一个一个往上加,搭建起来就ok
2:用openGL es绘图,如果你的应用程序需要频繁的画面更新或复杂的渲染,那么使用它,一般游戏会使用这种。

数据模型:
String: NSString(NSMutableString)
NSAttributedString(NSMutableAttributed-String)
Numbers:NSNumber NSDecimalNumber NSIndexPath
Raw bytes:NSData (NSMutableData) NSValue
Dates and times:NSDate NSDateComponents
URLs:NSURL
Collections:NSArray(NSMutableArray) NSDictionary(NSMutableDictionary)
NSIndexSet(NSMutableIndexSet) NSOrderedSet(NSMutableOrderedSet)
NSSet (NSMutableSet)

NSAttributedString:可以根据下标来设置字符串的颜色,字体大小等属性。
NSNumber:继承自NSValue,使用NSValue来辅助我们实现一些简单数据结构的封装,可以搜索下。
NSDecimalNumber:继承NSNumber,用科学计数来表示,10的n次
NSIndexPath:tableView里面的代理方法有这个形参,表示第几个section,第几个row。
NSSet:无序的集合,不允许重复元素

一个app bundle基本上包括:
1:可执行文件
2:配置文件(例如Info.plist)
3:app icon(也就是小图标),一般要四张(Icon.png Icon@2x.png Icon-Small.png Icon- Small@2x.png)
4:app launch的图标
5:xib或者storyboard文件
6:iTunesArtwork
7:公开自定义自己的setting(也就是偏好设置),那么要有setting.bundle
8:本地化资源文件,比如图片,声音,使用的plist文件等
9:多国语言(en.lproj fr.lproj es.lproj,英国、法国、西班牙)

app的状态有五种:
1:not running:没有启动app
2:inactive:app运行在前台,但是没有任何事件的处理
3:active:app运行在前台,并且在处理事件
4:background:app在后台运行,还在内存中,并且执行代码
5:suspend:app还在内存中,但是不运行任何代码,如果内存不足,会自动kill掉

app states changes:
[img]http://dl.iteye.com/upload/attachment/0081/0905/750f3b27-3b85-37d3-9918-91f47b03f5c7.png[/img]

lanch app的方式有两种,一种是直接lanch到前台,展现给用户,一种是直接lanch到后台
两种方式的执行步骤:
直接lanch到前台前台
[img]http://dl.iteye.com/upload/attachment/0081/0911/0cb92605-4ece-3c8c-aeb3-676d0304ee1f.png[/img]
直接lanch到后台
[img]http://dl.iteye.com/upload/attachment/0081/0909/4e8c2812-c9df-365f-9612-6bee909e64a5.png[/img]

觉得lanch到前台还是后台可以通过willFinishLaunchingWithOptions:或didFinishLaunchingWithOptions:这两个方法里设置applicationState为UIApplicationStateBackground或者UIApplicationStateInactive.

lanch的过程主要是对UIKit库的处理:

#import <UIKit/UIKit.h>
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate
class]));
}
}


对于UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)的后面两个参数,一般都为nil,它代表的含义是:第三个参数默认为是@"UIApplication",这个参数必须是UIApplication或其子类的名字,它代表着当前iPhone程序本身,这个程序会去读info.plist文件获取配置信息,一个重要的信息是Main nib file base name(主nib文件)的值,一般为MainWindow(.xib),第四个参数为MainWindow.xib文件中遵循UIApplicationDelegate的类的类名,因为UIApplication定义了一个delegte变量,这个变量应该遵循UIApplicationDelegate,负责控制程序的运行,在主nib文件中,你应该创建一个继承于Object,并遵循UIApplicationDelegate的类,如果主nib文件没有这个类,你应该自定义一个这样的类,并将第四个参数改为这个类的类名,否则这个程序不知道如何进行运作,因为前三个参数代表应用程序本身,它除了把应用的事件循环启动起来,并读取info.plist里的配置信息,不做其它任何事情。

app lanch之后干了些什么,调用delegate
application:willFinishLaunchingWithOptions: and
application:didFinishLaunchingWithOptions
检查内容和相应是否都ok,初始化关键数据,准备view和window显示
如果在lanch time你没有指定nib或者storybord,那么你可以在willFinishLaunchingWithOptions:中指定,不过这个两个方法尽量不要用,为了启动更快,app启动一般被设计成不超过5s,如果lanch到的前台,那么还要调用方法applicationDidBecomeActive:

IOS的对中断的处理:
[img]http://dl.iteye.com/upload/attachment/0081/0939/f15881bf-3658-3377-bcce-6c5e4d1165d4.png[/img]

app从前台切换到后台:
[img]http://dl.iteye.com/upload/attachment/0081/2635/a435879c-bc50-36b0-9ce7-6760cc9315ef.png[/img]
会有一个通知:UIApplicationDidEnterBackgroundNotification

app从后台切换到前台
[img]http://dl.iteye.com/upload/attachment/0081/2647/9c5d389a-1217-3da6-a1d9-4e3aab13c0e8.png[/img]
会有一个通知:UIApplicationWillEnterForegroundNotification

app在被唤醒的过程中,有一系列的通知,如果注册了这些通知,那么可以收到相关通知
比如被唤醒的app所存储的数据被修改了,那么可以注册这个通知,然后被唤醒的时候,可以告知用户。

app被kill的时候会调用applicationWillTerminate:

The Main Run Loop:
[img]http://dl.iteye.com/upload/attachment/0081/2712/b4f548eb-48db-36cf-99bc-6ba2d5f6cbba.png[/img]

检查是否支持多线程代码(IOS4之后支持):
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
backgroundSupported = device.multitaskingSupported;


长时间在后台运行的程序,有几种情况:
1:类似音乐播放器这种应用。
2:类似导航类应用,需要不停的把位置信息。
3:下载上传等应用
4:更新应用的操作
5:app支持VoIP协议
如果需要后台运行程序,需要再plist文件中定赋值UIBackgroundModes

ios ui 保存(http://blog.youkuaiyun.com/tonny_guan/article/details/8547903):
[img]http://dl.iteye.com/upload/attachment/0081/3222/48eee667-2151-3c9a-afb1-ae81f395ee32.png[/img]

ios ui 恢复
[img]http://dl.iteye.com/upload/attachment/0081/3269/994faf28-4a71-3310-803c-70f17829263a.png[/img]

连接到app store的代码:

NSURL *myURL = [NSURL
URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];


自定义URL,打开自己开发的app:
http://www.2cto.com/kf/201301/187156.html

关闭自动锁屏功能:
set the idleTimerDisabled property of the shared UIApplication object to
YES

在更新app的时候,一下两个目录会被保存:
<Application_Home> /Documents
<Application_Home> /Library

icloud和itunes不会备份以下目录:
<Application_Home> /AppName .app
<Application_Home> /Library/Caches
<Application_Home> /tmp

内存警告时,会调用applicationDidReceiveMemoryWarning:(这个是appdelegate的);didReceiveMemoryWarning(这个是viewcontroller)或者注册UIApplicationDidReceiveMemoryWarningNotificationnotification.通知

减少app的内存方法:
1:减少内存泄露
2:资源文件尽量小
3:使用core data或则sqllite存储大文件
4:懒加载
5:使用thumb指令集,编译代码使用-mthumb参数

明智的分配内存
1:尽量少用autorelease
2:根据size来分配内存,不要小对象分配了大内存

节省电池寿命:
1:尽量不要使用轮训,用NSRunLoop or NSTimer来替代轮训
2:set idleTimerDisabled 为no
3:尽量合并处理事务,使cpu空闲
4:避免频繁读写磁盘
5:关闭地理位置开关,当你不用的时候
6:屏幕滑动不要太快
7:使用wifi会更省电

使用UIRequiresPersistentWiFi来设置wifi,可以在plist文件中设置
每个app都有自己的一个sandbox环境,主要出于安全考虑, iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,应用程序不能翻过自己的围墙去访问别的存储空间的内容。
sandbox的目录结构:
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。

用keychain进行数据加密,可以使用苹果官方发布的KeychainItemWrapper或者SFHFKeychainUtils
### 回答1: 《CarPlay应用编程指南》是由Apple官方提供的关于CarPlay应用开发的指南,旨在帮助开发者了解如何开发支持CarPlay的应用程序。该指南详细介绍了CarPlay应用的设计原则、开发要求和注意事项。 指南首先介绍了CarPlay的基本概念和特点,以及开发者需要了解的CarPlay框架和API。它解释了如何在CarPlay中创建应用程序的基本结构和原理,并详细描述了CarPlay界面交互的各种方法和技巧。 除了CarPlay应用程序的基本开发技巧,该指南还涵盖了一些高级主题,如CarPlay音频和媒体播放、导航和地图集成,以及车辆信息和功能的连接等。它还提供了开发过程中的最佳实践和调试技巧,以帮助开发者更好地理解和解决CarPlay应用开发中可能出现的各种问题和挑战。 这本指南非常清晰而全面,适合有一定iOS应用开发经验的开发者阅读。通过学习和理解该指南,开发者可以更好地理解和掌握如何开发出满足CarPlay严格要求和用户期望的高质量应用程序。 总之,《CarPlay应用编程指南》是一本宝贵的参考资料,为开发者提供了详尽的指导和建议,帮助他们开发出出色的CarPlay应用程序,为用户带来更好的汽车驾驶和娱乐体验。 ### 回答2: 《CarPlay 应用编程指南》是由苹果公司提供的一份详细指南,用于帮助开发者了解如何开发符合 CarPlay 标准的应用程序。CarPlay 是苹果公司推出的一种车载系统,可以将 iPhone 的功能汽车的多媒体系统相结合,以提供更安全和方便的车载体验。 该指南以中文版本提供,为广大开发者提供了关于如何设计、开发和测试 CarPlay 应用程序的详细说明。该指南的目的是帮助开发者了解 CarPlay 应用程序的特点和需求,并提供开发者所需的工具和资源,以便他们能够构建出符合 CarPlay 标准的高质量应用程序。 该指南涵盖了一系列主题,包括 CarPlay 应用程序的基本要求,界面设计准则,音频和视频媒体播放,导航和地图功能,语音识别,消息推送等等。此外,该指南还提供了一些附加的技术和开发资源,如 API 参考,样式和图标资源等。 开发者可以根据该指南中提供的步骤和示例代码,逐步学习和实践 CarPlay 应用程序的开发过程。通过遵循该指南中的建议和规范,开发者可以设计出兼容 CarPlay 系统的应用程序,并提供一致的用户体验。 总之,该《CarPlay 应用编程指南》中文版本为开发者提供了一份详尽且易于理解的指南,帮助他们更好地开发和优化符合 CarPlay 标准的应用程序。 ### 回答3: CarPlay App Programming Guide(CarPlay应用程序编程指南)是由苹果公司提供的一份官方文档,旨在帮助开发人员了解如何为CarPlay平台设计和开发应用程序。这个指南提供了一系列的指导和最佳实践,帮助开发人员充分利用CarPlay的功能和特性。 CarPlay是一个车载娱乐和信息系统,它允许iPhone用户将他们的手机连接到汽车的显示屏上,并通过可靠和安全的方式来访问他们的手机应用。CarPlay App Programming Guide主要包括以下几个方面的内容: 1. 设计准则:指南中介绍了CarPlay应用程序的设计准则和界面规范,帮助开发人员确保他们的应用在车辆环境中能够提供良好的用户体验。 2. 应用开发:这部分介绍了如何创建一个CarPlay应用程序的基本结构和组件。开发人员可以了解到如何处理用户界面、导航、车辆信息、语音控制等方面的功能。 3. 集成指南:指南还提供了集成CarPlay功能的详细说明,开发人员可以了解到如何将CarPlay连接到汽车中,并车辆的硬件和软件进行交互。 4. 测试调试:在开发过程中,测试和调试是非常重要的环节。指南中给出了一些测试和调试的方法和工具,帮助开发人员确保他们的应用在CarPlay平台上的稳定性和性能。 总体而言,CarPlay App Programming Guide是一份非常有价值的官方指南,它提供了详细的内容和实用的建议,帮助开发人员顺利地设计和开发适用于CarPlay平台的应用程序。这些指南对于想要进一步了解和开发CarPlay应用的开发人员来说非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值