1,voip方式
    1)首先要修改应用的plist配置,添加下面的设置:
        Application does not run in background: NO
        Required background modes: VOIP
    注:添加这些配置之后,程序重启解锁就会自动运行application:              
                    didFinishLaunchingWithOptions方法。
    2)主要测试代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     __block UIBackgroundTaskIdentifier background_task;
    background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
        //打开后台运行任务
    }];
   
    static dispatch_queue_t _queue ;
    _queue = dispatch_queue_create("sddfgfgwerty456567fre4ghghkjdsfbnjfrtyrt", DISPATCH_QUEUE_SERIAL);
    dispatch_async(_queue, ^{
        while(TRUE)
        {
            //打印进程id
            NSLog(@"processID = %d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CurrentThread = %@",[SSProcessInfo processID],[[NSThread currentThread] description]);
            [NSThread sleepForTimeInterval: 5]; //wait for 15 min
        }
    });
    
    sleep(1);
    return YES;
}

注:程序测试必须真机下,观察log信息用Xcode上自带的Organizer工具。
经过分析log信息,发现processID过一段时间就会变,说明程序运行一段时间就会被kill掉,然后程序会自动重启。虽然达到了持续运行的目的,但是不符合程序持续运行要求。

2,GPS方式
    1)首先要修改应用的plist配置,添加下面的设置:
    Application does not run in background: NO
    Required background modes: App registers for location updates
    添加这两项之后可以保证程序在后台运行
    2)主要测试代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([CLLocationManager significantLocationChangeMonitoringAvailable])
     {
        [self.locationManager startUpdatingLocation];
      }
   else
     {
         NSLog(@"Significant location change monitoring is not available.");
     }
     return YES;
}

- (CLLocationManager *)locationManager
{
    
    if (_locationManager == nil) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        
        if([CLLocationManager locationServicesEnabled])
        {
               NSLog(@"无限运行................................................");
            //这个分支进入后台后,运行时间和前台一样,是无限的
            [_locationManager startMonitoringSignificantLocationChanges];
            _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
            _locationManager.distanceFilter= 1;
            _locationManager.pausesLocationUpdatesAutomatically = NO;
            _locationManager.activityType = CLActivityTypeAutomotiveNavigation;
            [_locationManager startUpdatingLocation];
       }
    }
  return _locationManager;
    
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    while (true) {
        [NSThread sleepForTimeInterval:1];
            NSLog(@"processID = %d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++CurrentThread = %@",[SSProcessInfo processID],[[NSThread currentThread] description]);
        [self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
    }
}

注:程序测试必须真机下,观察log信息用Xcode上自带的Organizer工具。
经过分析log信息,发现processID不会变,说明程序能够持续运行。

程序自启动及后台持续运行的研究(voip和GPS方式)的更多相关文章

  1. spring boot jar 进程自动停止,自动终止,不能后台持续运行

    第一次部署spring boot 到linux上,用命令java -jar **.jar,发现应用自动退出,进程停止了.后来发现要不挂断的执行命令,忽略所有的挂断信号,用以下命令解决 nohup ja ...

  2. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案

    jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...

  3. 编写shell脚本,使用 nohup 让springboot 项目在后台持续运行

    1.将springboot项目打成jar放在linux的某个目录下. 2.新建一个nohup.log文件. 3.使用vi命令新建一个start.sh文件并写下以下内容: #!/bin/sh nohup ...

  4. nodejs服务后台持续运行三种方法

    一.利用 forever forever是一个nodejs守护进程,完全由命令行操控.forever会监控nodejs服务,并在服务挂掉后进行重启. 1.安装 forever npm install ...

  5. Xamarin 后台持续定位与提示

    IOS后台持续运行对于c#程序员不懂得ios后台机制的是存在一定困扰的.特别是ios9过后对后台和安全进行了更严格的限制 好了废话不多说 一 设置info.plist权限信息 参考: 后台模式:htt ...

  6. ios后台程序持续运行方法

    iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验.但是有很多社交类的软件,如果因为它在后台就不能刷新到新的数据的话 ...

  7. iOS开发:后台运行以及保持程序在后台长时间运行

    第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动. 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备). 活动-app处于“使用中 ...

  8. ios程序后台继续运行

    1.图标右上角显示消息个数 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificati ...

  9. Swift - 让程序挂起后,能在后台继续运行任务

    1,程序的挂起和退出 由于iOS设备资源有限.当用户点击了home键,或者另一个应用程序启动了.那么原先那个程序便进入后台被挂起,不是退出,只是停止执行代码,同时它的内存被锁定.当应用程序恢复时,它会 ...

随机推荐

  1. iOS应用架构现状分析

    iOS从2007年诞生至今已有近10年的历史,10年的时间对iOS技术圈来说足够产生相当可观的沉淀,尤其这几年的技术分享氛围无论国内国外都显得异常活跃.本文就iOS架构这一主题,结合开发圈里讨论较多的 ...

  2. ie6 ie7 绝对定位 相对定位 层被遮住

    relative 上加上z-index有多个,则z-index递减, absolute层显示则不会被其它标签挡住.

  3. Sumblime Text2安装Package Control两种方法+安装插件+注册码

    刚开始不认识sumblime的时候,就直接在网上下载了一个最新版的sumblime text3,只是在配合使用go语言时,出现了一些不为自己知道的奇葩问题,于是果断把3卸载了,改成了sumblime ...

  4. js中Array自定义contains, indexOf, delete方法.

    Array.prototype.contains = function (elem) { for (var i = 0; i < this.length; i++) { if (this[i] ...

  5. Elasticsearch Java Api--DeleteByQuery

    一.安装插件 要删除某个索引的一个type下的所有文档,相当于关系型数据库中的清空表操作.查阅了一些资料可以通过Delete-by-Query插件删除,首先使用插件管理器安装Delete-by-Que ...

  6. 二模 (8) day2

    第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得 ...

  7. Quartz2D

    http://donbe.blog.163.com/blog/static/138048021201052093633776/ 详解 代码如下: DJView 绘制线段 基本图形 // // DJVi ...

  8. Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'

    给UITableViewController 展示数据时候 删除系统自带viewController 然后拖过来一个UITableViewController 指定class后没有指定main入口 报 ...

  9. K2上海总部技术培训分享笔记

    第一部门 WinDdg 入门指南 1.NGen.exe --> native code 预编译,省去了.NET程序编译器JIT过程,是程序第一次运行也非常快. NGen 参考资料:http:// ...

  10. C语言基础--while循环

    while循环格式: while (条件表达式) { 语句; ... }   执行说明: while是对给定的条件进行判断, 如果条件满足, 就执行while后面大括号中的内容, 执行完毕之后会再次判 ...