检查用户是否登录到 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")
}
如果 ubiquityIdentityToken
是 nil
并且您想知道 为什么 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>
如果你想使用异步方法但不关心为什么,你应该检查accountStatus
是available
,而不是检查它不是noAccount
:
CKContainer.default().accountStatus { (accountStatus, error) in
if case .available = accountStatus {
print("iCloud Available")
} else {
print("iCloud Unavailable")
}
}
有两种检查 iCloud 功能的方法,它们是针对两种不同的需求。
- 正在检查 iCloudDrive 可用性
- 正在检查 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
}
}
有没有办法让我检查并查看用户在打开应用程序时是否登录到 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")
}
如果 ubiquityIdentityToken
是 nil
并且您想知道 为什么 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>
如果你想使用异步方法但不关心为什么,你应该检查accountStatus
是available
,而不是检查它不是noAccount
:
CKContainer.default().accountStatus { (accountStatus, error) in
if case .available = accountStatus {
print("iCloud Available")
} else {
print("iCloud Unavailable")
}
}
有两种检查 iCloud 功能的方法,它们是针对两种不同的需求。
- 正在检查 iCloudDrive 可用性
- 正在检查 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
}
}