|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
父类是NSObjectUIKit里最底层的库可以响应一些触摸事件设置焦点等功能UIView父类是UIResponder所有View的父类方法太多了大部分很有用这个不赘述了在iOS7之前,当程序加入后,开辟者对程序几近做不了甚么。除VOIP和基于地位的特征,独一可以在背景运转代码的路子只要利用背景义务(backgroundtasks),但背景义务只会实行几分钟。假如你想要下载一部很年夜的视频以便离线寓目,大概将用户图片备份到服务器,你只能完成部分的义务。
ios7新增加了两个能够在背景更新使用程序界面和内容的APIs。第一个API是背景猎取(BackgroundFetch),同意你在按期距离内从收集猎取新内容。第二个API是远程关照(RemoteNotification),它是一个新特征,它在当新事务产生时使用推送关照(PushNotifications)往告诉程序。这两个新的机制,匡助你坚持程序界面最新,还能够在新的背景传输服务(BackgroundTransferService)中布置义务,这同意你在历程外实行收集传输(下载和上传)。
背景猎取(BackgroundFetch)和远程关照(RemoteNotification)基于复杂的使用程序托付钩子,在使用程序挂起之前的30秒时钟工夫入手下手实行事情。它们不是用于CPU频仍事情大概长工夫运转义务,而是用来处置长工夫运转的收集哀求行列,比方下载一部很年夜的影戏,大概实行疾速的内容更新。
在用户看来,多义务处置独一分明的变更就是新的程序切换器(appswitcher),它会显现当程序加入前台时每个程序的界面快照。显现这些快照是有缘故原由的:当完成背景事情时,开辟者能够更新程序快照,显现新内容的预览。交际收集,旧事,大概天色的使用程序,能够在用户不翻开使用程序的情形下显现最新的内容。接上去我们会展现怎样更新快照。
背景猎取(BackgroundFetch)
背景猎取(BackgroundFetch)是一种智能的轮询机制,它很合适必要常常更新内容的程序,像交际收集,旧事或天色的程序。为了在用户启动程序条件前触发背景猎取,体系会依据用户举动叫醒使用程序。举个例子,假如用户常常鄙人午1点利用某个使用程序,体系会进修,顺应并在利用周期前实行背景猎取。为了削减电池利用,背景猎取(BackgroundFetch)会跨使用程序被设备的无线电兼并,假如你向体系呈报新数据没法猎取,iOS会顺应并利用此信息制止会持续猎取。
开启背景猎取的第一步是在infoplist文件中的UIBackgroundModes健值指定利用的特征。最复杂的路子是在Xcode5的projecteditor中新的功能标签页中(Capabilitiestab)设置,这个标签页包括了背景形式部分,能够便利设置多义务选项。
<br>
大概,你能够手动编纂这个健值:
1
2
3
4
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
下一步,告知iOS你但愿多久举行一次背景猎取:
1
2
3
4
5
6
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
[applicationsetMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
returnYES;
}
iOS默许不举行背景猎取,以是你必要设置一个工夫距离,不然,你的使用程序永久不可在背景举行猎取数据。UIApplicationBackgroundFetchIntervalMinimum这个值请求体系尽量常常往办理使用程序甚么时分会被叫醒,但假如不必要这个值,你应当指定你的工夫距离。比方,一个天色的使用程序,大概只必要几个小时才更新一次,iOS将会在背景猎取之间最少守候你指定的工夫距离。
假如你的使用同意用户加入登录,那末就没有猎取新数据的必要了,你应当把minimumBackgroundFetchInterval设置为UIApplicationBackgroundFetchIntervalNever,如许能够节俭资本。
最初一步是在使用程序托付中完成以下办法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-(void)application:(UIApplication*)application
performFetchWithCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
{
NSURLSessionConfiguration*sessionConfiguration=[NSURLSessionConfigurationdefaultSessionConfiguration];
NSURLSession*session=[NSURLSessionsessionWithConfiguration:sessionConfiguration];
NSURL*url=[[NSURLalloc]initWithString:@"http://yourserver.com/data.json"];
NSURLSessionDataTask*task=[sessiondataTaskWithURL:url
completionHandler:^(NSData*data,NSURLResponse*response,NSError*error){
if(error){
completionHandler(UIBackgroundFetchResultFailed);
return;
}
//Parseresponse/dataanddeterminewhethernewcontentwasavailable
BOOLhasNewData=...
if(hasNewData){
completionHandler(UIBackgroundFetchResultNewData);
}else{
completionHandler(UIBackgroundFetchResultNoData);
}
}];
//Startthetask
[taskresume];
}
体系叫醒使用程序后将会实行这个托付办法。必要注重的是,你只要30秒的工夫来断定猎取的新内容是不是可用,然后处置新内容并更新界面。30秒工夫应当充足往从收集猎取数据和猎取界面的缩略图,最多只要30秒。当完成了收集哀求和更新界面后,你应当挪用完成的处置代码。
完成的处置代码有两个目标。起首,体系会估计你的历程损耗的电量,并依据你传送的UIBackgroundFetchResult参数纪录新数据是不是可用。其次,当你挪用完成的处置代码时,使用的界面缩略图会被接纳,并更新使用程序切换器。当用户在使用间切换时,用户将会看到新内容。这类快照举动的完成代码,在新的多义务处置APIs中,很很罕见的。
在实践使用中,你应当将completionHandler传送到使用程序的子组件,然后在处置完数据和更新界面后挪用。
在这里,你大概想晓得iOS是怎样在使用程序背景运转时取得界面快照的,而且想晓得使用程序的性命周期与背景猎取之间有甚么干系。假如使用程序处于挂起形态,体系会先叫醒使用,然后再挪用application:performFetchWithCompletionHandler:。假如使用程序还没有启动,体系将会启动它,然后挪用罕见的托付办法,包含application:didFinishLaunchingWithOptions:。你能够把这类使用程序运转的体例想像为用户从Springboard启动这个程序,区分仅仅在于界面是看不见的,在屏幕外衬着的。
年夜多半情形下,不管使用在背景启动大概在前台,你会实行不异的事情,但你能够经由过程检察UIApplication的applicationState属性来判别使用是否是从背景启动。
1
2
3
4
5
6
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
NSLog(@"Launchedinbackground%d",UIApplicationStateBackground==application.applicationState);
returnYES;
}
测试背景猎取(TestingBackgroundFetch)
有两种能够摹拟背景猎取的路子。最复杂是从Xcode运转你的使用,当使用运转时,在Xcode的Debug菜单选择SimulateBackgroundFetch.
<p>第二种办法,利用scheme变动Xcode运转程序的体例。在Xcode菜单的Product选项,选择Scheme然后选择ManageSchemes.在这里,你能够编纂大概增加一个新的
管理你的ViewController的层次可以自己写View切换的动画关掉他默认的动画文档:还有个蛋疼的UIWindow都快忘了他了因为iOS是从MacosX过来的很多工具直接拿来用这个UIWindow就是在iOS里每个App独占屏幕所以同时存在的只有一个UIWindow |
|