mutt 怎么实现 ios jqgrid 分页后台实现常运行

iOS开发必须知道的后台运行机制(2)
三、IOS长时间后台运行的实现代码
1、检查设备是否支持多任务
Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3G。如果你的应用在没有多任务特性时会出问题,为了保持应用的健壮性,你应该对此进行判断并处理。你可以通过调用UIDevice对象的multitaskingSupported属性来获取当前设备是否支持多任务。
[cpp]&view
if(![UIDevicecurrentDevice].multitaskingSupported)&&
&&&&//不支持多任务时应做的处理&&
通常,当用户按一下Home键,当前应用就会被进入后台,应用处在后台运行状态一小段时间后,就会进入挂起(suspend)状态,此时应用不会再执行任何代码。如果系统在运行其他应用时内存资源不足,这个挂起的应用甚至有可能被系统退出,释放内存以供活动的应用使用。只有当用户再次运行此应用,应用才会从挂起状态唤醒,代码得以继续执行。这就是iOS4带来的基本的多任务特性,这个特性是一般应用默认支持的,就是说你的应用不需要任何修改就能支持基本多任务特性。2、基本多任务特性
既然是多任务你应该会在应用进入后台时做一些处理,比如暂停一些界面的定时刷新或网络请求。同时,或者你会在程序进入前台时执行一些恢复操作。在你的应用的application delegate里有2个消息用于处理这些消息:
[cpp]&view
-&(void)applicationDidEnterBackground:(UIApplication*)application&&&
&&&&&//进入后台时要进行的处理&&
-&(void)applicationWillEnterForeground:(UIApplication*)application&&
&&&&&//进入前台时要进行的处理&&
也许你需要更多的多任务特性,比如后台播放音乐或者是后台进行GPS跟踪。这会是下面介绍的内容。当然你也许不会都在application delegate处理所有的事情。如果你要在其他对象中处理,那么你就需要注册系统通知了,这两个通知分别是UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification。
3、声明你需要的后台任务
在Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括:
audio:在后台提供声音播放功能,包括音频流和播放视频时的声音
location:在后台可以保持用户的位置信息
voip:在后台使用VOIP功能
前面的每个value让系统知道你的应用程序应该在适当的时候被唤醒。例如,一个应用程序,开始播放音乐,然后移动到后台仍然需要执行时间,以填补音频输出缓冲区。添加audio键用来告诉系统框架,需要继续播放音频,并且可以在合适的时间间隔下回调应用程序;如果应用程序不包括此项,任何音频播放在移到后台后将停止运行。
除了添加键值的方法,IOS还提供了两种途径使应用程序在后台工作:
Task completion—应用程序可以向系统申请额外的时间去完成给定的任务
Local notifications—应用程序可以预先安排时间执行local notifications 传递
4、后台播放音乐
通常,一般应用在进入后台时,任何声音就将会停止。这也许不是我们所想要的。要想让自己的应用支持后台播放,首先要修改应用的Info.plist文件,你需要在Info.plist文件中添加UIBackgroundModes字段,该字段的值是应用支持的所有后台模式,是一个数值类型。目前此数组可以包含“audio”、“location”和“voip”这三个字符串常量,如果要支持后台音乐播放,你就需要包含“audio”,其余两个会将在后面讲到。
同时,你也应该设置一下应用程序的Audio Sesstion。这个是必需的,如果不设置Audio Sesstion,应用就可能进入后台时Audio Sesstion失活而停止播放。一般需要这么设置就可以了:
[cpp]&view
[[AVAudioSessionsharedInstance]setCategory:AVAudioSessionCategoryPlaybackerror:nil];&&
5、后台GPS跟踪
和后台播放音乐类似,若要支持后台GPS跟踪,你就需要在Info.plist文件中UIBackgroundModes字段对应的数组中增加“location”字符串。
6、后台voip支持
由于voip应用需要一个长连接到服务器,为了让这类应用能正常工作,iOS中加入后台voip支持特性。为支持这一特性,需要在Info.plist文件中UIBackgroundModes字段对应的数组中增加“voip”字符串。
此外你仍然需要配置一下你的网络连接,以便支持后台连接。iOS提供的网络连接库有几种,下面一一说明:
a、如果你使用的是NSStream,如NSInputStream或NSOutputStream,需要调用setProperty:forKey:将Key为NSStreamNetworkServiceType的value设置为
NSStreamNetworkServiceTypeVoIP;
b、如果你使用NSURLRequest,需要调用setNetworkServiceType:将网络类型设置为NSURLNetworkServiceTypeVoIP;
c、如果你使用CFStream,如CFReadStreamRef或CFWriteStreamRef,需要调用CFReadStreamSetProperty或CFWriteStreamSetProperty将
kCFStreamNetworkServiceType属性设置为kCFStreamNetworkServiceTypeVoIP。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
三.IOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3G.如果你的应用在没有多任务特性时会出问题,为了保持应用的健壮性,你应该对此进行判断并处理.你可以通过调用UIDevice对象的multitaskingSupported属性来获取当前设备是否支持 ...
通过UIBackgroundTaskIdentifier可以实现有限时间内在后台运行程序 程序进入后台时调用applicationDidEnterBackground函数, 首先判断设置是否支付后台运行 通过beginBackgroundTaskWithExpirationHandler 获取UIBackgroundTaskIdentifier 后就可以在后 ...
一.IOS的&伪后台&程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS multitasking bar does not contain &a list of all running apps&. It contain ...
(温馨提示:亲,请先看上篇,此文乃下篇) 三.IOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3G.如果你的应用在没有多任务特性时会出问题,为了保持应用的健壮性,你应该对此进行判断并处理.你可以通过调用UIDevice对象的multitaskingS ...
当用户按下&Home&键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态.此转换将会导致先后调用应用代理的applicationWillResignActive:和applicationDidEnterBackground:方法. 在applicationDidEn ...
后台机制的不同,算是iOS 和 Android的一大区别了,最近发布的iOS7又对后台处理做了一定的更改,找时间总结一下编码上的区别,先做个记录. 先看看iOS的把,首先需要仔细阅读一下Apple的官方文档 iOS App Programming Guide中的App States and Multitasking,其中的Background Executi ...
在iOS开发中,经常需要从后台数据中获取时间,但是此时后台返回的时间格式经常是一串类似&&的数字,此数字是1970年开始截至到现在的秒数,此时我们需要将其转换为可以用的格式. 模型中我定义了c_time属性,通过重写c_time的get方法中进行格式的转换. - (NSString *)c_time{ // 1.创建时间 ...
在viewDidLoad中添加 消息代码
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(back:)name:UIApplicationDidEnterBackgroundNotificationobject:[UIApplicationsharedAp ...如何时iOS程序后台执行_百度知道  从2015年,接触到的项目里,就会有这样的需求:APP需要像Android那样,在后台状态下,执行正常的功能。到现在已经一年多了吧,一直在研究这个方面,写下一些心得,希望与大家共同交流探讨。
  首先,我们要知道,苹果对APP占用硬件资源管的很严,更不要说应用后台时候的资源占用了。正常情况下,使用应用时,APP从硬盘加载到内存,开始工作;当用户按下home键,APP便被挂起,依然驻留在内存中,这种状态下,不调用苹果已开放的几种后台方法,程序便不会运行;如果在这个时候,使程序继续运行,则为后台状态;如果当前内存将要不够用时,系统会自动把之前挂起状态下的APP请出内存。所以我们看到,有些时候打开APP时,还是上次退出时的那个页面那些数据,有时则是重新从闪屏进入。
  这样,就知道了后台运行最大的前置条件&&APP处于内存中的挂起状态。
  然后,再来看看上面说到的苹果已开放的后台运行方法。先看这张图
  很明显,我们项目里能用的机制就这么多,Background Audio,这是后台的音频,这个很早之前便有,可以实现后台的声音播放。去年的项目里用它在后台一直播放没有声音的文件,结果审核失败。
  在这里说一下去年做的那个项目的需求,用户类型A可以在任何时刻查看用户类型B的地理位置。这个功能有点像iPhone上的『查找朋友』,不知道的朋友请自行了解(想知道你的朋友在哪里吗,想知道你的另一半在哪里吗,对了,就用它);A想看B的时候,B需要上传自己的当前位置给服务器;先不考虑APP在挂起状态怎么做,先说APP在活动状态下,服务器想和客户端进行通信,告诉客户端要上传自己的位置了,这种服务器主动通信,常用到的就是socket和推送通知。我决定用推送,在APP收到来自APNS的推送时,就进行定位并上传。
  然而,按下home键进入挂起状态时,程序是不会执行的,所以也获取不到B的位置。BOSS大为恼火,Android分分钟干完的事,你怎么就搞不定呢(脑补:再搞不出来就滚蛋)。
  当时第一次接触苹果这些后台机制,探索之路弯弯曲曲,就不一一表述了。最后用静默推送解决了这个问题:Remote Notification!原理非常简单,不过苹果的初衷不是让我这样用的&&,说一下这个机制的应用场景:以往聊天类应用接受推送后点进去需要再收一次信息,这情况在QQ、微信等应用上最为明显。不过拥有了这个接口后,这情况将不复存在,以后推送将能够直接启动后台任务,在后台就已经接收到信息,点开APP不需要去拉取。
  so,在A查看B位置的时候,给B一条静默推送,B在后台定位并上传信息。这个唤起时间比较短,在3-5秒左右,有时候B网络不好,没有上传成功就又被挂起了,就需要重复进行。这个机制添加方法和推送一样,只有一点区别,就是委托方法不同。普通推送会执行这个回调:
1 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
DDLogDebug(@"[普通推送]%@", userInfo);
  而勾选住上面那个推送唤醒,就会回调这个方法:
1 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
DDLogDebug(@"[后台推送]%@", userInfo);
completionHandler(UIBackgroundFetchResultNewData);
  可以在这个回调里,调用定位请求之类的。
  本以为解决了问题,BOSS试了,也觉得可以。就喜滋滋的等着升职加薪走上人生巅峰,咳咳,又做梦了。
  "咋么回事呃,现在又定不到位了,赶紧搞好"还没到两个小时,BOSS气呼呼的跑过来喷了一顿。说完之后的0.01秒,我就知道是怎么回事了,"听我解释啊,老板"还没说出口,他就摔门而出,留下欲哭无泪的我。只有两个原因,一、APP被人为上划kill掉;二、APP被系统回收了,kill 了。
  就酱,明知山有虎,偏向虎山行。为了不让系统回收APP,我非常强硬的,加上了Background Audio。结果可想而知,被拒绝的同时,收到一封英文邮件,问我为什么这样做,如有异议,可提出。哎,总算松了一口气,可以离职了(个人原因)。
  换了公司,需求也不一样了,APP需要每五秒和服务器进行一次数据交换;以下,用到的是VoIP。
  刚开始的时候,推送唤醒机制还可以,不过林子大了什么鸟都有,一样的型号一样的设置,有台iPhone就是唤醒不了,只能尝试新方法。想起QQ语音时,切到后台依然可以通话,我想,就是它了。VoIP:后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。既然是语音通话,那么肯定是常连接,于是,有了以下代码。
1 @implementation NSStream(StreamsToHost)
3 + (void)getStreamsToHostNamed:(NSString *)hostName
port:(UInt32)port
inputStream:(out __strong NSInputStream **)inputStreamPtr
outputStream:(out __strong NSOutputStream **)outputStreamPtr
CFReadStreamRef
CFWriteStreamRef
assert(hostName != nil);
assert( (port & 0) && (port & 65536) );
assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
readStream = NULL;
writeStream = NULL;
CFStreamCreatePairWithSocketToHost(
(__bridge CFStringRef) hostName,
((inputStreamPtr
!= NULL) ? &readStream : NULL),
((outputStreamPtr != NULL) ? &writeStream : NULL)
if (inputStreamPtr != NULL) {
*inputStreamPtr
= CFBridgingRelease(readStream);
if (outputStreamPtr != NULL) {
*outputStreamPtr = CFBridgingRelease(writeStream);
  给NSStream加了一个类目。然后还需要一个server,我就不写了;发起连接请求让客户端与server保持通信,这些代码也太多了,就不贴了。勾选Voice over IP后,APP挂起状态时,系统会接管socket会话句柄,当收到从server发来的数据流时,就会唤起APP进入后台执行代码。这个唤起时间要长一些,可以在十秒多点。已经测试成功,但是还没有提交审核,还需要给它一个外套,不然就像上次一样被拒绝。
  一直在探索,因为以上方法并不完美,而且项目对后台的要求比较苛刻,事实上,用户在使用APP时,会有很多场景,最常见的就是弱网络,在这个场景下,不管是推送还是socket都无法收到内容,所以像这种需要依赖外力唤起的方式,弊端还是相当明显。
  已经感觉到后面写的比较仓促,VoIP涉及的内容还是比较多,还没有一一吃透,还是心急了些。个人知识有限,如有错误,欢迎指正。
阅读(...) 评论()ios开发关于如何实现伪后台运行的方法和思路?
游戏有个需求,就是通过游戏时长获得金币奖励,但是切到桌面,游戏进入后台后就被挂起了,经过了解,发现似乎没有较好的办法能够使其在后台继续运行(似乎有一些解决方法也会面临审核不通过的风险)。求教,有没有类似的方法来实现这样的功能,比如说我可以从互联网获取标准时间(这样可避免用户更改设备的系统时间来破解),然后和切出时的时间进行比对,最后根据时差给出游戏时长的奖励。不知道这方法是否可行,希望有了解的大大们给出具体的步骤,涉及到1、判断当前应用是否切出以及是否切回。2、如何获取网络时间(没有时区要求,只要校时服务器靠谱即可,比如nasa?3、如何判断当前是否有联网)有代码是最好了,拜谢。除此之外,求问是否还有更好使的解决方案呢?另外,这是联网处理的方法举例,如果是单机的话,大大们是否有什么解决之道呢?非常感谢!!
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 java后台实现消息推送 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信