卡卷网
当前位置:卡卷网 / 每日看点 / 正文

是如何做到长时间在iOS后台运行的?

作者:卡卷网发布时间:2025-01-06 21:22浏览数量:82次评论数量:0次

iOS开发者

2023年12月了,这个后台循环播放无声音频保活的策略还是没有移除掉。

用了11分钟,睡一觉消耗我54%的电。iPhone15Pro。

只能卸载了。

<>2023年12月18更新

恰好这两天要搞后台下载,再加上这个事,我特地查苹果文档找了相关资料来确定我的经验带给我的认知没有出错。

目前后台运行的方式

<>1,配置后台下载

//配置后台下载session的config NSLSessionConfigation*config=[NSLSessionConfigationackgroundSessionConfigationWithIdentifier:@"sessionId"]; //下载完如果app被了调用launch config.sessionSendsLaunchEvents=YES; //后台下载的优先级等托管给。传输大数据要设置yes以保证稳定性 config.discretionary=YES;

实际上这种是将下载托管给,下载动作不在app进程内,如果app被挂起、死(非用户主动上滑任务卡片)、崩溃也不会影响,下载完成之后会主动唤醒app。

<>但是这个场景太过单一,只能用于下载,无法在里面加上业务逻辑。目前我遇到的用这种方式后台运行的只有王者荣耀、迅雷下载。

<>2,remoteNotifycatio和nActivityKit,即远程推送和灵动岛。

这俩都由服务端向苹果发送数据,再由苹果推送向设备,可以唤醒程序执行少量代码。

以最新的灵动岛举例

灵动岛具有“Start”、“Update”、“End”三种状态。其中更新和结束可以由后台远程推送更新唤起,简而言之,这种状态下哪怕app是不活动的状态也能唤起运行。

apns-topic:固定为{undleId}.push-type.liveactivity apns-push-type:固定为liveactivity SimulatorTargetundle:模拟器推送,设置为对应应用的{undleId} timestamp:刷新时间戳。需设置正确,否则灵动岛的推送不会生效 event:可填入update、end,对应灵动岛的更新与结束。 content-state:对应灵动岛的Attriutes

<>很明显这种方式只能做简短的代码逻辑,每次被唤醒之后10S之内会再次被挂起。不可能让服务端频繁推送更新来实现保活的。

<>3,音乐、健身、定位、通话类应用或具备此功能的应用。

<>根据设置里面展示的“后台活动,音频”,可以得出主要是播放无声音频来保证app不被死,音频播放几个重要回调(音频播放生命周期)里面能做的事情太多了。基本上就是起了一个repeat的定时器,定时器多久执行一次取决于音频时长。如我播放1秒的音频,那就是个1秒钟的重复运行定时器。可作性特别强,如我想在音频开始播放时new一个AudioRecorder什么的记录麦克风那太可行了。

所以...

已卸载闲鱼,支付宝已注销账号。由于最后一笔订单没有超过15天,没有注销账号成功。

2012年1月12注册的。累计消费44万。拜拜了。

------

2023-12-26更新

教大家一个简单的识别App是否有后台播放音频的逻辑。

1,打开音乐播放App,网易云或者Applemusic之类的播放音乐。

2,进入某App,如果这个App界面没有显示播放音乐你的音乐播放器停了,那有概率是App后台播放音乐。还有可能是播放音乐/直播等占用audioSession了你没看到。

3,某个App前台进后台你的音乐停了,那绝对是后台播放音频了。

------

2024-06-24更新

<>有人评论说是后台定位导致的保活。我在这里分析一下。

首先参照第3条【音乐、健身、定位、通话类应用或具备此功能的应用】,我不清楚有没有申请后台定位权限,即

CLLocationManager.requestAlwaysAuthorization

1,申请后台定位权限的app,会弹出一个“后台使用期间”的弹窗让用户选择,我的里面只有高德允许后台定位。

2,虽然申请了这个权限可以在用户定位发声明显变化时或者进入/离开“app所设置的地理围栏”时触发,但是并不会太频繁的作为soce1事件输入给app。

结合以上2点所以这个可能也pass。

然后他提到cpu占用异常会被看门狗死应用,我只能说,外行太想当然。iOS开发者耳熟能详的0xadf00dcrash,也就是watchdog超时,这种崩溃是指主线程占用异常,看门狗机制非常宽容,只有主线程被完全阻塞的情况下才会crash。以苹果A17的6核心举例,哪怕599%的cpu占用率,只要主线程还能响应,它都不会给你了。而且如果是我来写这个后台保活代码,我又不用刷新UI(反正后台执行逻辑用户也看不到),我都不用在主线程,直接随便new一个子线程队列去塞任务。

另外说一下,快捷指令里面的基于定位触发的自动化就是基于地理围栏,但是大家可能发现触发不准,原因是设置地理围栏的时候的定位坐标系是gcj02也就是国家02年标准,但是实际触发的逻辑里面是层面的s82也就是全球定位82年标准坐标系(苹果一直没有修复这个问题)。所以大家如果想触发准的话,在选择地点的时候要看看想触发的位置的定位在s82里面是哪里,然后选那个地方即可。

<>最近有人私信我问锁屏界面的广告播放器是什么情况...

我只能说国内产品经理没下限,利用灵动岛和远程推送,让主动唤醒用户设备,然后new一个广告播放器,触发播放广告的逻辑,的是玩的花啊。。。

第一种:iOS16以后的灵动岛设备的实时活动广告---设置---app---实时活动---关闭

第二种:不是灵动岛,但是锁屏/非锁屏情况下莫名其妙跑出一个播放器开始播放广告---设置---app---通知---关闭

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

评论 打赏
卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

相关推荐

欢迎 发表评论:

请填写验证码