web-dev-qa-db-ja.com

ユーザーがiCloudにログインしているかどうかを確認しますか? Swift / iOS

ユーザーがアプリを開いたときにiCloudにログインしているかどうかを確認する方法はありますか?ログインしていない場合や、iCloudにログインしていて、以前にアプリを使用したことがある場合は、設定ページに移動できるようにしたい-サインインページをスキップしたい...

私はAppleのiCloudとCloudkitsのドキュメントを調べましたが、役立つものを見つけることができませんでした。これは可能ですか?

27
pmoney13

ここに行きます-うまくいけば自明です。詳しくは、以下のApple NSFileManager関数のドキュメントをご覧ください。

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

以下の抜粋を参照してください:現在のユーザーのiCloud IDを表す不透明なトークン(読み取り専用)現在iCloudが利用可能な場合、このプロパティには現在のユーザーのIDを表す不透明なオブジェクトが含まれます。何らかの理由でiCloudが利用できない場合、またはログインしているユーザーがいない場合、このプロパティの値はnilです。

33

ユーザーが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でないことを確認するのではなく、availablenoAccountであることを確認する必要があります。

CKContainer.default().accountStatus { (accountStatus, error) in
    if case .available = accountStatus {
        print("iCloud Available")
    } else {
        print("iCloud Unavailable")
    }
}
33
Joseph Duffy

チェック中はブロックしないように、この非同期メソッドが推奨されます。

        CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStat, error) in
          if (accountStat == .Available) {
              print("iCloud is available")
          }
          else {
              print("iCloud is not available")
          }
        }
8
RawMean

2つの異なるニーズのために提供されているiCloud機能をチェックするための2つのメソッドがあります。

  1. iCloudDriveの可用性を確認しています
  2. iCloud CKContainerの可用性を確認しています

ICloudDriveの可用性の確認

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の可用性の確認

確認するには、ユーザーの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通知を使用できます。

0
LukeSideWalker