2018-07-10 iOS app后台无限存活的方式

最近客户要求app在后台无限存活,记录用户的位置信息。本人在网上找了两个方法,第一个是无限开启定位,这种方式比较耗电,因为是使用的GPS定位。第二种方式是后台播放无声音乐保持app在后台无限期存活。这种方式相比第一种方式耗电小一点。

- (void)playbackgroud

{

    /*

     这里是随便添加得一首音乐。

     真正的工程应该是添加一个尽可能小的音乐。。。

     0~1秒的

     没有声音的。

     循环播放就行。

     这个只是保证后台一直运行该软件。

     使得该软件一直处于活跃状态.

     你想操作的东西该在哪里操作就在哪里操作。

     */

    AVAudioSession *session = [AVAudioSession sharedInstance];

    /*打开应用会关闭别的播放器音乐*/

    //  [session setCategory:AVAudioSessionCategoryPlaybaxck error:nil];

    /*打开应用不影响别的播放器音乐*/

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];

    [sessionsetActive:YES error:nil];

    //设置代理 可以处理电话打进时中断音乐播放

    NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"jy" ofType:@"mp3"];

    NSURL*URLPath = [NSURLfileURLWithPath:musicPath];

    NSError*err=nil;

    player = [[AVAudioPlayer alloc] initWithContentsOfURL:URLPath error:&err];

    //  [player setDelegate:self];

    if(err!=nil) {

        NSLog(@"move player init error:%@",err);

    }else{

        if (![player isPlaying]){

            player.numberOfLoops = -1;

            player.currentTime = 0;

            [player setVolume:0.6];

            [player prepareToPlay];

            [playerplay];

        }

    }


}

这种方式还有一个弊端就是用户接打电话会中断音乐播放,使得app会刮起,解决这个弊端的原因是:

// 监听事件中断通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil];

// 监听中断通知调用的方法

- (void)audioSessionInterruptionNotification:(NSNotification*)notification{

    /*

     监听到的中断事件通知,AVAudioSessionInterruptionOptionKey

     typedef NS_ENUM(NSUInteger, AVAudioSessionInterruptionType)

     {

     AVAudioSessionInterruptionTypeBegan = 1, 中断开始

     AVAudioSessionInterruptionTypeEnded = 0,  中断结束

     }

     */

    int type = [notification.userInfo[AVAudioSessionInterruptionOptionKey] intValue];

    switch(type) {

        case AVAudioSessionInterruptionTypeBegan: // 被打断

            [player pause]; // 暂停播放

            break;

        case AVAudioSessionInterruptionTypeEnded: // 中断结束

            [playerplay];  // 继续播放

            break;

        default:

            break;

    }

}

忘了还有关键的一点

{

    AVAudioPlayer *player;//必须设置成全局变量否则不会播报

}

有更好的方法欢迎指教。

你可能感兴趣的:(2018-07-10 iOS app后台无限存活的方式)