如何在飞行模式下识别iCloud登录用户?

时间:2014-09-17 07:18:35

标签: ios cloudkit airplane

我试图让userRecordID处于飞行模式,但是我得到了一个错误,还是其他任何方式?

class func asdf() {

    var defaultContainer = CKContainer.defaultContainer()
    var publicDatabase = defaultContainer.publicCloudDatabase

    defaultContainer.fetchUserRecordIDWithCompletionHandler({ userRecordID, error in

        if error == nil {

            println("userRecordID.recordName : \(userRecordID.recordName)")
        } else {
            println("\(error.localizedDescription)")
        }
    })
}

终端:无法续订我们的安全会话

我在accountStatusWithCompletionHandler之外拨打fetchUserRecordIDWithCompletionHandler来回CKAccountStatus.Available

2 个答案:

答案 0 :(得分:1)

您无法使用CloudKit检测互联网连接。它只会在没有连接时给你一个错误。如果您确实想测试互联网连接,那么您可以使用着名的Reachability类,如下所示:How to check for an active Internet connection on iOS or OSX?

如果要检测对iCloud帐户的更改,则可以将以下代码添加到AppDelegate应用程序didFinishLaunchingWithOptions:

var localeChangeObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
    println("The user’s iCloud login changed: should refresh all user data.")
}

如果您想要获取用户ID,则必须执行container.requestApplicationPermission以查看是否允许您查询container.fetchUserRecordIDWithCompletionHandler。这需要互联网连接。您可以将其与上述检测代码一起缓存在设备上,以获得正确的状态。

答案 1 :(得分:0)

我遇到了这段代码,比较了最近和之前登录过的用户令牌,如果相同,请使用之前下载的userRecordID。我的iPad ubiquityIdentityToken方法在某些情况下返回nil甚至dow的唯一问题是我登录了,很奇怪。

class func checkUser() {

        let ubiquityIdentityToken = NSFileManager.defaultManager().ubiquityIdentityToken
        let status = Utility.status()
        let prevUbiquityIdentityToken = status.objectForKey("ubiquityIdentityToken")

        if ubiquityIdentityToken != nil && ubiquityIdentityToken!.isEqual(prevUbiquityIdentityToken) {

        } else if ubiquityIdentityToken != nil && !ubiquityIdentityToken!.isEqual(prevUbiquityIdentityToken) {

            status.setObject(ubiquityIdentityToken!, forKey: "ubiquityIdentityToken")
            Utility.saveStatus(status)

            let defaultContainer = CKContainer.defaultContainer()
            let publicDatabase = defaultContainer.publicCloudDatabase

            defaultContainer.fetchUserRecordIDWithCompletionHandler({ userRecordID, error in
                if error == nil {
                    //do some stuff
                    }) 
                } else {
                    println("\(error.localizedDescription)")
                }
            })
        } else {
            //do some stuff
            status.removeObjectForKey("ubiquityIdentityToken")
            Utility.saveStatus(status)
        }
    }