SwiftUI如何每日调用函数或每日首次启动APP时执行方法
实现每日/APP首次打开时调用函数并更新变量的方案
核心思路是利用持久化本地存储保存上次执行更新的日期,每次APP启动时对比当前日期,判断是否需要执行更新逻辑——这种存储不会随APP重启或进程销毁自动变更,完美解决你担心的"参考变量自动更新"问题。
具体实现步骤
- 选择持久化存储方式:根据你的开发平台选择对应方案,比如:
- Web:
localStorage/sessionStorage(前者更持久) - iOS:
UserDefaults - Android:
SharedPreferences - Flutter:
shared_preferences插件
- Web:
- 统一日期格式化规则:只保留年-月-日部分(忽略时分秒),避免因时间精度导致误判;建议统一用UTC日期或固定时区格式,防止跨时区问题。
- 启动时检查并执行更新:每次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
相关产品推荐
相关产品推荐

