前景提要

对于每一台iphone手机而言,基本上都会有一个AppleID的存在,也就意味着有很大的可能性会使用以及正在使用iCloude的服务,这对于一个App来支持iCloud会显得有些意义。

在iCloud服务中,提供了三种数据库类型:private databaseshared databasepublic database。如果用户没有登录账号,则会被限制只能读取public databse中的数据。 在开发时会碰到一个问题,Cloud服务的一个基本前提是用户已经登录的Apple ID。但在自己的App中,我怎么知道用户的iCloud的状态是否已经登录,或者是否对我的App生效呢?

准备篇

准备一个项目,然后打开project设置中的iCloud服务选项,选中或者使用默认的container等,完成基本配置。

开始篇

在项目导航中,创建一个名为Managers的文件组(group),然后在这个组文件夹下创建一个Cloud服务的核心管理文件CloudKitManager.swift。我们尽量将cloude相关的服务集中到这个文件中,减少其他文件对import CloudeKit的依赖。

import CloudKit
class CloudKitManager {

}

然后定义两个基础字段:containeraccountStatuscontainder:定义了应用对应在cloud服务中的容器 accountStatus:存储了当前账户的状态。我们将这个字段初始化为couldNotDetermine。这个值意味着我们不知道当前账户的状态是什么。同时设置这个字段对外只读,只能在Manager中进行修改。

 // MARK: - Properties
private let container = CKContainer.default()

private(set) var accountStatus: CKAccountStatus = .couldNotDetermine
PS:
如果对于需要指定container的项目而言,需要通过使用CKContainer.init()方法。 如下:

CKContainer.init(identifier: "iCloud.com.leozhou.clib")

接下来定义Manager的初始化方法init。并在方法中请求账户的状态。

init(){
    // 请求账户状态
    requestAccountStatus()
}

我们通过执行accountStatus方法获取当前用户账号的状态。执行后会执行两个结果,一个为用户的状态值,另一个为错误(如果有的话)。 用户状态值是一个CKAccountStatus的实例,这个状态有四种状态:

  • couldNotDetermine - 不确定状态
  • available - 可用
  • restricted - 受限制的
  • noAccount - 没有账号
// MARK: - requestAccountStatus
private func requestAccountStatus() {
    // Request Account Status
    container.accountStatus { [unowned self] (accountStatus, error) in
        // Print Errors
        if let error = error { print(error) }
        self.accountStatus = accountStatus
        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")
            }

    }
}

如果不需要针对所有的类型做出解释或者说明,只需要区分是否可用,可以用类似以下的方式:

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

完结篇

END.