ユーザーがアプリを開いたときにiCloudにログインしているかどうかを確認する方法はありますか?ログインしていない場合や、iCloudにログインしていて、以前にアプリを使用したことがある場合は、設定ページに移動できるようにしたい-サインインページをスキップしたい...
私はAppleのiCloudとCloudkitsのドキュメントを調べましたが、役立つものを見つけることができませんでした。これは可能ですか?
ここに行きます-うまくいけば自明です。詳しくは、以下のApple NSFileManager関数のドキュメントをご覧ください。
func isICloudContainerAvailable()->Bool {
if let currentToken = NSFileManager.defaultManager().ubiquityIdentityToken {
return true
}
else {
return false
}
}
以下の抜粋を参照してください:現在のユーザーのiCloud IDを表す不透明なトークン(読み取り専用)現在iCloudが利用可能な場合、このプロパティには現在のユーザーのIDを表す不透明なオブジェクトが含まれます。何らかの理由でiCloudが利用できない場合、またはログインしているユーザーがいない場合、このプロパティの値はnilです。
ユーザーがiCloudにログインしているかどうかだけを知りたい場合は、同期メソッドを使用できます。
if FileManager.default.ubiquityIdentityToken != nil {
print("iCloud Available")
} else {
print("iCloud Unavailable")
}
ただし、知りたい場合はwhy 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")
}
}
非同期メソッドを使用したいが理由は気にしない場合は、accountStatus
でないことを確認するのではなく、available
がnoAccount
であることを確認する必要があります。
CKContainer.default().accountStatus { (accountStatus, error) in
if case .available = accountStatus {
print("iCloud Available")
} else {
print("iCloud Unavailable")
}
}
チェック中はブロックしないように、この非同期メソッドが推奨されます。
CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStat, error) in
if (accountStat == .Available) {
print("iCloud is available")
}
else {
print("iCloud is not available")
}
}
2つの異なるニーズのために提供されているiCloud機能をチェックするための2つのメソッドがあります。
Applesのドキュメントから:
FileManager.default.ubiquityIdentityToken->現在のユーザーのiCloudドライブドキュメントIDを表す不透明なトークン。
iCloudドライブドキュメントでは、iCloudが使用可能な場合、このプロパティには現在のユーザーのIDを表す不透明なオブジェクトが含まれます。 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の可用性が変化した場合->NSUbiquityIdentityDidChange通知をNotificationCenterに登録します。
確認するには、ユーザーのiCloudアカウントがCKContainer(およびそのprivateデータベース)にアクセスできるかどうか、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通知を使用できます。