iOS:在特定日期后执行代码

iOS: execute code AFTER a particular date

我有一些代码想要在特定的 date/time 之后 运行。例如,如果我希望代码从现在起 运行 7 天并且用户在第 7 天或之后的任何时间打开应用程序,代码将 运行 但如果他们在开始之前打开应用程序第 7 天没有任何反应。主 运行 循环中的计时器会工作,但前提是应用程序仍在后台 运行ning。我需要一种即使用户终止应用程序也能正常工作的方法。

您可以设置您希望应用“记住”在本地存储或网络服务上的日期。然后,当用户打开您的应用程序时,将该日期与当前设备时间进行比较,以确定您是否应该执行您的代码。

首先,save the current time 当你想要的时候。您可以根据需要设置键名。

  UserDefaults.standard.setValue(Date(), forKey: "rememberTime")

而且每次我打开应用程序时,您都会将当前时间与保存的时间进行比较。 为此,我创建了一个 compares time.

的函数
extension Date {
    func timeAgoSince() -> Bool {
        let calendar = Calendar.current
        let unitFlags: NSCalendar.Unit = [.day]
        let components = (calendar as NSCalendar).components(unitFlags, from: self, to: Date(), options: [])
        
        if let day = components.day, day >= 7 {
        // Returns true if more than 7 days have passed.
            return true
        }
        return false
    }
    
}

调用之前保存的时间,使用时间比较功能

let beforeTime: Date = (UserDefaults.standard.object(forKey: "rememberTime") as? Date)!

if beforeTime.timeAgoSince() {
    // more than seven days later
    ...
} else {

    ...
}

有问题请留言!

您可以使用下面的示例代码:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let nextCodeRunDate = Date() + (7 * 24 * 60 * 60) // 7 Days
    
    if let savedDate = UserDefaults.standard.value(forKey: "NEXT_DATE") as? Date {
        
        if Date() > savedDate {
            UserDefaults.standard.setValue(nextCodeRunDate, forKey: "NEXT_DATE")
            runYourCode()
        }
    }else {
        // First time
        UserDefaults.standard.setValue(nextCodeRunDate, forKey: "NEXT_DATE")
        runYourCode()
    }
}

func runYourCode() {
    // Your code
}

你最好的选择是将它存储为 local data 即使你只希望代码 运行 一次,开销很低,“检查”不会影响速度或感觉的应用程序。此外,这将允许您 运行 进行额外检查 .. 例如,如果有人删除了该应用程序,并留下了本地存储空间。如果他们重新安装,理论上您可以“记住”该应用程序已安装,并且所述代码已经 运行(直到用户清除应用程序数据)

类似于:

//Globally set key
struct defaultsKeys {
    static let keyDate = "dateKey"
}


// Set the date in local storage
let defaults = UserDefaults.standard
defaults.set("Your Date String", forKey: defaultsKeys.dateKey)


// Get the date from local storage
let defaults = UserDefaults.standard
if let stringDate = defaults.string(forKey: defaultsKeys.dateKey) {
    print(stringDate) 
    //  Do your date comparison here
}

代码行很少,即使每次应用程序启动时都会进行检查。开销可以忽略不计。