检查用户是否登录到 iCloud? Swift/iOS

Check if User is Logged into iCloud? Swift/iOS

有没有办法让我检查并查看用户在打开应用程序时是否登录到 iCloud?如果他们没有登录,我希望能够将他们定向到设置页面,如果他们登录到 iCloud 并且之前使用过该应用程序 - 我想跳过登录页面....

我查看了 Apple 的 iCloud 和 Cloudkits 文档,但找不到任何有用的信息!这甚至可以做到吗?

给你 - 希望不言自明。有关更多信息,请查看下面的 NSFileManager 函数的 Apple 文档。

func isICloudContainerAvailable()->Bool {
        if let currentToken = NSFileManager.defaultManager().ubiquityIdentityToken {
            return true
        }
        else {
            return false
        }
    }

请参阅以下摘录: 代表当前用户 iCloud 身份的不透明令牌(只读) 当 iCloud 当前可用时,此 属性 包含一个代表当前用户身份的不透明对象。如果 iCloud 因任何原因不可用或没有登录用户,则此 属性 的值为 nil。

我认为这种异步方法是首选,这样您在检查时就不会阻塞。

        CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStat, error) in
          if (accountStat == .Available) {
              print("iCloud is available")
          }
          else {
              print("iCloud is not available")
          }
        }

如果只是想知道用户是否登录了iCloud,可以使用同步方式:

if FileManager.default.ubiquityIdentityToken != nil {
    print("iCloud Available")
} else {
    print("iCloud Unavailable")
}

如果 ubiquityIdentityTokennil 并且您想知道 为什么 iCloud 不可用,您可以使用异步方法:

CKContainer.default().accountStatus { (accountStatus, error) in
    switch accountStatus {
    case .available:
        print("iCloud Available")
    case .noAccount:
        print("No iCloud account")
    case .restricted:
        print("iCloud restricted")
    case .couldNotDetermine:
        print("Unable to determine iCloud status")
    }
}

请注意,这需要使用 CloudKit,这需要 CloudKit 权限:

<key>com.apple.developer.icloud-services</key>
<array>
    <string>CloudKit</string>
</array>

如果你想使用异步方法但不关心为什么,你应该检查accountStatusavailable,而不是检查它不是noAccount

CKContainer.default().accountStatus { (accountStatus, error) in
    if case .available = accountStatus {
        print("iCloud Available")
    } else {
        print("iCloud Unavailable")
    }
}

两种检查 iCloud 功能的方法,它们是针对两种不同的需求

  1. 正在检查 iCloudDrive 可用性
  2. 正在检查 iCloud CKContainer 可用性

检查 iCloudDrive 可用性

来自 Apple 文档:

FileManager.default.ubiquityIdentityToken -> 代表当前用户的 iCloud Drive 文档身份的不透明令牌。

在 iCloud Drive Documents 中,当 iCloud 可用时,此 属性 包含一个代表当前用户身份的不透明对象。如果iCloud不可用或者没有登录用户,这个属性的值为nil。

要检查此 iCloud 功能,我们可以检索该令牌并检查 nil

// Request iCloud token
let token = FileManager.default.ubiquityIdentityToken
if token == nil {
    print("iCloud (Drive) is not available")
} else {
    print("iCloud (Drive) is available")
}

为了确保收到通知,如果 iCloudDrive 可用性在应用程序运行期间发生变化 -> 注册到 NotificationCenter 以获得 NSUbiquityIdentityDidChange 通知。

检查 iCloud CKContainer 可用性

要检查用户的 iCloud 帐户是否可用于访问 CKContainer(及其 私有数据库),我们可以使用default 容器上的异步请求。

// Check iCloud account status (access to the apps private database)
CKContainer.default().accountStatus { (accountStatus, error) in

  if accountStatus == .available {
      print("iCloud app container and private database is available")
  } else {
      print("iCloud not available \(String(describing: error?.localizedDescription))")
  }   
}

要在应用 运行 时收到有关更改的通知,您可以使用 CKAccountChanged 通知。

此处 Swift 5.x

的解决方案
func isICloudContainerAvailable()->Bool {
    if let _ = FileManager.default.ubiquityIdentityToken {
            return true
    } else {
        return false
    }
}