You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iOS中用Swift实现每24小时自动累加本地变量(离线生效)

嘿,这个问题我太熟了!Cookie Clicker这类离线收益的核心逻辑其实根本不是让代码在后台一直跑——毕竟用户把APP关掉后,系统不可能让你的程序持续运行。真正的诀窍是用时间差来计算收益,下面给你一步步拆解怎么实现:

核心思路

本质就是「记录上次的状态时间」,等用户下次打开APP时,对比当前时间算出离线时长,再把这段时间对应的收益一次性补上。完全不需要后台定时器,简单又高效。

具体实现步骤

1. 把关键数据存到本地

每次用户更新数值(或者APP要退出/切后台时),一定要把两个核心数据存到持久化存储里(比如前端用localStorage,移动端用AsyncStorage之类的):

  • 当前的数值(比如叫currentCount)
  • 最后一次更新的时间戳(比如叫lastUpdateTime)

举个前端的代码例子,用localStorage存储:

// 保存当前状态到本地
function saveCurrentState(count) {
  localStorage.setItem('currentCount', count.toString());
  localStorage.setItem('lastUpdateTime', Date.now().toString());
}

2. 打开APP时计算离线收益

用户再次打开APP时,先读取本地存储的旧数据,然后算时间差补收益:

  • 获取当前时间戳now = Date.now()
  • 算出离线时长:offlineDuration = now - lastUpdateTime(单位是毫秒)
  • 把时长转换成天数,再乘以每日收益(这里是每天加1),得到要累加的数值

还要处理第一次打开APP(本地没数据)的情况,代码示例:

function loadStateAndCalculateProfit() {
  const savedCount = localStorage.getItem('currentCount');
  const savedTime = localStorage.getItem('lastUpdateTime');
  
  // 默认初始值
  let currentCount = 0;
  let lastUpdateTime = Date.now();
  
  if (savedCount && savedTime) {
    currentCount = parseInt(savedCount);
    lastUpdateTime = parseInt(savedTime);
    
    const now = Date.now();
    const oneDayInMs = 24 * 60 * 60 * 1000; // 一天的毫秒数
    // 计算离线的完整天数(比如离线30小时就算1天,加1)
    const daysOffline = Math.floor((now - lastUpdateTime) / oneDayInMs);
    
    if (daysOffline > 0) {
      currentCount += daysOffline * 1; // 这里的1就是每天要加的数值,可按需修改
      // 更新时间戳,避免下次重复计算这段时间的收益
      lastUpdateTime = now - ((now - lastUpdateTime) % oneDayInMs);
    }
  }
  
  // 把更新后的状态存回本地
  saveCurrentState(currentCount);
  return currentCount;
}

3. 处理前后台切换的场景

除了打开APP,用户把APP切到后台再切回来时,也得触发一次收益计算。比如前端可以监听页面可见性变化:

// 监听页面从后台回到前台的事件
document.addEventListener('visibilitychange', () => {
  if (!document.hidden) {
    // 回到前台,重新计算收益
    loadStateAndCalculateProfit();
  }
});

如果是React Native这类移动端APP,就用AppState监听:

import { AppState } from 'react-native';

AppState.addEventListener('change', (nextState) => {
  if (nextState === 'active') {
    // APP回到前台,计算收益
    loadStateAndCalculateProfit();
  }
});
额外要注意的细节
  • 防时间作弊:有些用户会改系统时间刷收益,如果要防这个,可以每次打开APP时请求服务器的当前时间,用服务器时间来计算差。如果是纯离线APP,只能做简单校验——比如发现本地时间比上次存储的时间还早,就跳过收益计算。
  • 收益公式扩展:如果你的收益不是固定每天加1,而是和其他变量(比如等级、道具数量)有关,记得把这些变量也一起存到本地,计算时用它们算出每日收益再乘以天数。
  • 数据安全:如果是敏感数值,别用明文存储的localStorage,可以加密后再存;但对于Cookie Clicker这类游戏数值,明文存储完全够用。

内容的提问来源于stack exchange,提问作者Nathan C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:37:11