zoukankan      html  css  js  c++  java
  • IOS零碎技术整理(1)-后台运行

     

    这两天做关于离线通知的功能,总结了一点关于这方面的注意点;按Home键回到桌面后程序很快被挂起,系统将关闭程序的Socket监听,此时程序将不能继续执行网络请求等操作。

    两种方式可以使程序继续存活一段时间或者继续保持运行状态:

    一是在项目进入后台时开启后台任务,即在applicationDidEnterBackground中执行beginBackgroundTaskWithExpirationHandler,这种方式可以让程序获取10分钟的时间继续运行;

    另一种方式是告诉系统本程序支持后台运行,即在项目的info.plist中设置Required background modes为:audio, location, voip,对于location来说这样设置了以后就可以了;

    但是对于audio,还需要有以下的条件才能保证程序进入后台后可以继续发送网络请求:

    将audioSession的Category为playback模式:

                   AVAudioSession* session = [AVAudioSession sharedInstance];

                   [session setActive:YES error:nil];

                    [session setCategory:AVAudioSessionCategoryPlayback error:nil];

     而且进入后台前必须处于播放状态:

                   [_backgroundPlayer setVolume:0];                //无声播放

                   [_backgroundPlayer setNumberOfLoops:-1];  //-1表示无限循环播放

                   [_backgroundPlayer prepareToPlay];

                   [_backgroundPlayer play];

           满足以上两个条件就可以保证程序进入后台以后,程序不会被挂起,也可以正常监听程序的Socket,即可以正常进行网络请求,但是前提是进入后台以后设备不会播放其他音频,否则会剥夺程序的音频播放资格而导致系统关闭程序的Socket监听,虽然程序目前没有被挂起,但是已经不能再进行网络请求,所以针对这个问题,我除了设置程序的audio类型,还设置了location类型(当然,不是这两个必须一起用);另外是否可以通过音频的恢复通知机制实现当前音频在其他音频完毕后恢复播放,然后恢复程序的网络能力,但是这样一来,被阻止期间网络功能也还是不能保持。

    注: 单独使用location类型,开启位置跟踪后就可以保持后台运行,不必配合audio使用

  • 相关阅读:
    Hadoop源代码分析
    Java中如何把两个数组合并为一个
    数据库死锁的解决办法
    Java程序中解决数据库超时与死锁
    mysql 死锁检查
    JDBC事务和数据库事务嵌套的讨论 .
    嵌套事务和事务保存点的错误处理
    java string常见操作题
    java基本数据类型包装类
    java string
  • 原文地址:https://www.cnblogs.com/v-jing/p/3302807.html
Copyright © 2011-2022 走看看