检查用户是否登录到iCloud?斯威夫特/ iOS版

pmo*_*y13 26 ios icloud swift cloudkit

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

我查看了Apple的iCloud和Cloudkits文档,但无法找到任何有用的东西!这甚至可能吗?

Dun*_*ald 34

你走了 - 希望自我解释.有关NSFileManager函数的Apple文档,请参阅下面的内容.

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

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

  • 可以从我自己的应用程序调用iCloud登录吗?例如,如果`isICloudContainerAvailable`返回false,则打开登录名. (3认同)
  • 2017年更新:看起来[此解决方案可能不再适用](http://stackoverflow.com/questions/41602477/why-is-icloud-account-ckcontainer-not-being-found).从现在开始,我必须使用[Joseph Duffy的答案](http://stackoverflow.com/a/39053572/54423)(下面)中的异步方法. (2认同)

Jos*_*ffy 34

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

if FileManager.default.ubiquityIdentityToken != nil {
    print("iCloud Available")
} else {
    print("iCloud Unavailable")
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您想知道为什么 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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Raw*_*ean 8

我认为这种异步方法是首选,因此您在检查时不会阻止.

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


Luk*_*ker 8

两种方法可以检查 iCloud 功能,以满足两种不同的需求

\n
    \n
  1. 检查iCloudDrive可用性
  2. \n
  3. 检查iCloud CKContainer可用性
  4. \n
\n

检查 iCloudDrive 可用性

\n

来自苹果文档:

\n

FileManager.default.ubiquityIdentityToken ->代表当前用户\xe2\x80\x99s iCloud Drive Documents 身份的不透明令牌。

\n

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

\n

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

\n
// Request iCloud token\nlet token = FileManager.default.ubiquityIdentityToken\nif token == nil {\n    print("iCloud (Drive) is not available")\n} else {\n    print("iCloud (Drive) is available")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

检查 iCloud CKContainer 可用性

\n

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

\n
// Check iCloud account status (access to the apps private database)\nCKContainer.default().accountStatus { (accountStatus, error) in\n\n  if accountStatus == .available {\n      print("iCloud app container and private database is available")\n  } else {\n      print("iCloud not available \\(String(describing: error?.localizedDescription))")\n  }   \n}\n
Run Code Online (Sandbox Code Playgroud)\n

要在应用程序运行时了解更改,您可以使用CKAccountChanged通知。

\n