2

我在我的应用程序(iOS 13+)(swift)中使用我的应用程序 cloudKit + 核心数据。

无论设备如何初始化一些默认数据,我都无法弄清楚如何检测应用程序的第一次运行。

有很多帖子如何检测 iOS 应用在特定设备上的首次启动——这很容易。我找不到检测特定用户首次运行应用程序的解决方案,或者换句话说 - 如果在用户的 iCloud 中确实存在具有特定容器标识符的初始化容器。

如果用户之前已经在另一台设备上使用过该应用程序,那么在新设备上首次启动时,将与 iCloud 同步,应用程序将使用用户的数据。但是如果用户之前从未使用过该应用程序,我需要初始化一些数据。

我正在寻找如何处理它几个小时的线索,找不到任何相关的东西。任何想法?

提前感谢您的帮助。

4

1 回答 1

0

有关您的 cloudkit 架构的更多信息会有所帮助,但假设您使用 publicDB 来存储信息,当用户第一次采取将数据保存到 cloudkit 的操作时,将为用户创建一条唯一记录。

因此,您可以检查并查看 cloudkit 中 User 对象的 createDate 时间戳,并与当前时间进行比较(有点笨拙,但可能)。 在此处输入图像描述

获取用户的示例代码:

iCloudUserIDAsync { (recordID: CKRecord.ID?, error: NSError?) in
    if let userID = recordID?.recordName {
        self.loggedInUserID = userID

        self.loggedInWithiCloud = true
    } else {
        self.loggedInWithiCloud = false

        print("Fetched iCloudID was nil")
    }
}

或者,更优雅的是,您可以在首次启动时将布尔标志写入用户对象 CloudKit(或在 CoreData 中本地)。然后在任何启动时为登录的 iCloud 用户获取整个用户对象,然后您可以对其进行初始化,然后从那里对您的布尔变量进行操作。

获取完整用户并在本地对其进行初始化的示例代码:

    CKContainer.default().publicCloudDatabase.fetch(withRecordID: userRecordID) { (results, error ) in
        if results != nil {
          //now that you have the user, you can perform your checks
            self.currentUser = MyUser(record: results!)
        }
        if let error = error {
            print("couldn't set user reference")
        }
        DispatchQueue.main.async {
            completion(nil)
        }
    }
于 2020-03-03T15:13:21.093 回答