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

SwiftUI如何每日调用函数或每日首次启动APP时执行方法

实现每日/APP首次打开时调用函数并更新变量的方案

核心思路是利用持久化本地存储保存上次执行更新的日期,每次APP启动时对比当前日期,判断是否需要执行更新逻辑——这种存储不会随APP重启或进程销毁自动变更,完美解决你担心的"参考变量自动更新"问题。

具体实现步骤

  1. 选择持久化存储方式:根据你的开发平台选择对应方案,比如:
    • Web:localStorage/sessionStorage(前者更持久)
    • iOS:UserDefaults
    • Android:SharedPreferences
    • Flutter:shared_preferences插件
  2. 统一日期格式化规则:只保留年-月-日部分(忽略时分秒),避免因时间精度导致误判;建议统一用UTC日期或固定时区格式,防止跨时区问题。
  3. 启动时检查并执行更新:每次APP启动/页面加载时,读取存储的上次更新日期,与当前日期对比:
    • 若存储无日期(首次启动)或日期不匹配:执行更新函数,然后将当前日期写入存储
    • 若日期匹配:跳过更新

示例代码

Web(JavaScript)

// 获取格式化后的当前日期(仅年月日)
function getCurrentDate() {
  const today = new Date();
  return `${today.getFullYear()}-${String(today.getMonth()+1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
}

// 你的每日变量更新逻辑
function updateDailyVariables() {
  // 示例:更新全局变量
  window.dailyConfig = {
    featuredContentId: Math.floor(Math.random() * 100),
    updateDate: getCurrentDate()
  };
  console.log("今日变量已更新");
}

// 页面加载时触发检查
document.addEventListener('DOMContentLoaded', () => {
  const lastUpdateDate = localStorage.getItem('lastUpdateDate');
  const currentDate = getCurrentDate();

  if (!lastUpdateDate || lastUpdateDate !== currentDate) {
    updateDailyVariables();
    localStorage.setItem('lastUpdateDate', currentDate);
  } else {
    console.log("今日已完成更新,无需重复执行");
  }
});

iOS(Swift)

import Foundation

// 获取格式化日期
private func formattedCurrentDate() -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.timeZone = TimeZone(identifier: "UTC") // 可选:用UTC避免时区问题
    return formatter.string(from: Date())
}

// 每日更新逻辑
private func performDailyVariableUpdate() {
    // 示例:更新UserDefaults中的变量
    UserDefaults.standard.set(Int.random(in: 1...100), forKey: "dailyRandomValue")
    print("每日变量更新完成")
}

// 在APP启动时调用(比如SceneDelegate的sceneDidBecomeActive方法)
func checkDailyUpdate() {
    let lastUpdateDate = UserDefaults.standard.string(forKey: "lastUpdateDate")
    let currentDate = formattedCurrentDate()
    
    guard lastUpdateDate != currentDate else {
        print("今日已更新,跳过")
        return
    }
    
    performDailyVariableUpdate()
    UserDefaults.standard.set(currentDate, forKey: "lastUpdateDate")
}

关键注意事项

  • 持久化存储的日期仅在执行更新后手动覆盖,不会自动变更,完全可控
  • 如果需要严格在每日零点触发(而非APP启动时),可以结合后台任务,但不同平台对后台任务的限制较多,APP启动时触发是更可靠的通用方案
  • 日期格式化必须一致,否则会出现"同一天但格式不同导致重复更新"的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:36:23