CloudKit App 处理不同的 iCloud 帐户

Posted

技术标签:

【中文标题】CloudKit App 处理不同的 iCloud 帐户【英文标题】:CloudKit App to handle different iCloud accounts 【发布时间】:2017-01-26 03:35:47 【问题描述】:

我有一个使用 CloudKit 和 iCloud 将用户数据保存在私人数据库中的应用。我已经编写了代码来处理用户从 iCloud 注销并通过其设备上的 Settings -> iCloud 以其他用户身份重新登录时的处理。我目前处于 Beta 测试模式,当我作为内部测试人员尝试此操作时,当我更改帐户时应用程序崩溃。当我使用Xcode 模拟器或真实设备在开发模式下对此进行测试时,我的代码运行良好。我的问题是:当设备上的 iCloud 帐户发生变化时,CloudKit 应用程序是否应该能够处理?如果是这样,这种情况是否可以通过 TestFlight 进行内部测试。我处理帐户更改的代码如下...

func isCloudAccountAvailableASync() 
  container.accountStatusWithCompletionHandler  (accountStatus, error) in

    switch accountStatus 
    case .Available:
      print("INFO: iCloud Available!")
      // begin sync process by finding the current iCloud user
      self.fetchUserID()
      return
    case .NoAccount:
      print("INFO: No iCloud account")
    case .Restricted:
    print("WARNING: iCloud restricted")
    case .CouldNotDetermine:
      print("WARNING: Unable to determine iCloud status")
    

    // if you get here, no sync happened so make sure to exec the callback
    self.syncEnded(false)
  



func fetchUserID(numTries: Int = 0) 

  container.fetchUserRecordIDWithCompletionHandler(  recordID, error in

    if let error = error 

      // error handling code

      // reach here then fetchUser was a failure
      self.syncEnded(false)
    
    else 

      // fetchUserID success

      if self.lastiCloudUser == nil 
        print("INFO: our first iCloud user! \(recordID)")
        self.saveUserID()
      
      else if !recordID!.isEqual(self.lastiCloudUser) 
        // User has changed!!!!!!!!!!!!!
        self.saveUserID()

        // delete all local data

        // reset the saved server token
        self.saveServerToken(nil)
        // try again with reset fields
      
      // else user never changed, then just create a zone

      // continue the sync process
      self.initZone()
    
  )

---编辑/更新:--- 这是我的崩溃日志的屏幕截图

---编辑/更新2:--- 我能够使用不同的崩溃日志生成另一个崩溃。这个崩溃日志仍然没有指向我的代码,但至少描述了一个函数......

【问题讨论】:

用有关崩溃的详细信息更新您的问题。 添加了一个截图(不知道如何从 Xcode 复制/粘贴文本,所以它是一个图像)。这只是十六进制指令,当我单击“在项目中打开”时,我什么也得不到。涂黑的线条只是我的应用程序的名称。 【参考方案1】:

我一直让它崩溃,并且不知何故得到了一个崩溃日志,其中包含一行代码,我可以链接到我的 Xcode 项目中的一行。我的问题是 NSOrderedSet 和 ios 9。That issue can be found here。我不知道为什么我之前的崩溃日志中只有十六进制,如果有人知道如何处理十六进制崩溃日志,我很想听听。

以下是我对任何人的原始问题的答案:

    CloudKit 应用程序是否应该能够处理设备上的 iCloud 帐户更改? 回答:是的 如果是这样,这种情况是否可以通过 TestFlight 进行内部测试? 回答:是的

【讨论】:

【参考方案2】:

很难说您的应用是否完全崩溃了。 您必须注意,在更改帐户后,您应该重置应用程序的状态(清除本地用户数据并离开包含用户特定数据的屏幕) 在您的应用启动时,您应该调用如下函数:

func reactToiCloudloginChanges() 
    NotificationCenter.default.addObserver(forName: NSNotification.Name.NSUbiquityIdentityDidChange, object: nil, queue: nil)  _ in
        // The user’s iCloud login changed: should refresh all local user data here.
        Async.main 
            self.viewController?.removeFromParentViewController()
            // Or some other code to go back to your start screen.
        
        return
    

【讨论】:

今天早上我获得了不同的崩溃日志,我将其添加到上面的原始问题中作为编辑/更新。它指向核心数据。我以为我正在通过删除核心数据然后保存上下文来清理我的用户数据。然而,我并没有改变我的视图控制器。 您是否在为“所有异常”和“Swift 错误”添加断点时进行了调试?您可以通过转到断点列表并按左下角的加号来添加它们。 令人沮丧的是,此错误仅在通过用作内部测试的 TestFlight 运行 beta 测试版本时出现(如果您不熟悉,请告诉我)。当我在完全相同的设备(运行 iOS 9.3.5 的 iPad mini)上执行完全相同的步骤但插入 Xcode 时,它​​不会崩溃并且运行良好。我能想到的唯一区别是我的 iCloud 开发与生产数据。我只能在插入 Xcode 并运行开发代码时运行调试器,对吗?

以上是关于CloudKit App 处理不同的 iCloud 帐户的主要内容,如果未能解决你的问题,请参考以下文章

App 启动时如何知道 CloudKit 的 iCloud 数据同步操作已经结束了?

App 启动时如何知道 CloudKit 的 iCloud 数据同步操作已经结束了?

我可以将 CloudKit 与不同的 iCloud 帐户一起使用吗

您是不是需要启用 CloudKit 才能访问 iCloud 照片?

CloudKit - 无法从 iCloud 检索数据

iCloud / CloudKit 用户的唯一标识符