web-dev-qa-db-fra.com

Vérifiez si l'utilisateur est connecté à iCloud? Swift / iOS

Existe-t-il un moyen pour moi de vérifier et de voir si un utilisateur est connecté à iCloud lorsqu'il ouvre l'application? Je veux pouvoir les diriger vers la page des paramètres s'ils ne sont pas connectés, et s'ils sont connectés à iCloud et ont déjà utilisé l'application - je veux ignorer la page de connexion ....

J'ai regardé la documentation iCloud et Cloudkits d'Apple, mais je n'ai pas pu trouver quoi que ce soit qui pourrait être utile! Est-ce même possible de le faire?

27
pmoney13

Voilà, j'espère que ça va de soi. Pour en savoir plus, consultez les documents Apple Apple pour la fonction NSFileManager ci-dessous.

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

Voir l'extrait ci-dessous: Un jeton opaque qui représente l'identité iCloud de l'utilisateur actuel (lecture seule) Lorsque iCloud est actuellement disponible, cette propriété contient un objet opaque représentant l'identité de l'utilisateur actuel. Si iCloud n'est pas disponible pour une raison quelconque ou qu'aucun utilisateur n'est connecté, la valeur de cette propriété est nulle.

33
Duncan Groenewald

Si vous voulez simplement savoir si l'utilisateur est connecté à iCloud, la méthode synchrone peut être utilisée:

if FileManager.default.ubiquityIdentityToken != nil {
    print("iCloud Available")
} else {
    print("iCloud Unavailable")
}

Cependant, si vous souhaitez savoir pourquoi iCloud n'est pas disponible, vous pouvez utiliser la méthode asynchrone:

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")
    }
}

Si vous souhaitez utiliser la méthode asynchrone mais ne vous souciez pas pourquoi, vous devez vérifier que accountStatus est available, plutôt que de vérifier qu'il ne s'agit pas de noAccount:

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

Je pense que cette méthode asynchrone est préférée afin que vous ne bloquiez pas pendant que vous vérifiez.

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

Il existe deux méthodes pour vérifier les fonctionnalités iCloud, qui sont fournies pour deux besoins différents.

  1. Vérification de la disponibilité de iCloudDrive
  2. Vérification de iCloud CKContainer disponibilité

Vérification de la disponibilité d'iCloudDrive

De la documentation Apples:

FileManager.default.ubiquityIdentityToken -> Un jeton opaque qui représente l'identité des documents de lecteur iCloud de l'utilisateur actuel.

Dans iCloud Drive Documents, lorsque iCloud est disponible, cette propriété contient un objet opaque représentant l'identité de l'utilisateur actuel. Si iCloud n'est pas disponible ou qu'aucun utilisateur n'est connecté, la valeur de cette propriété est nulle.

Pour vérifier cette fonctionnalité iCloud, nous pouvons récupérer ce jeton et vérifier nil .

// Request iCloud token
let token = FileManager.default.ubiquityIdentityToken
if token == nil {
    print("iCloud (Drive) is not available")
} else {
    print("iCloud (Drive) is available")
}

Pour garantir la notification, si la disponibilité d'iCloudDrive change pendant l'exécution de l'application -> inscrivez-vous au NotificationCenter pour NSUbiquityIdentityDidChange notification.

Vérification de la disponibilité d'iCloud CKContainer

Pour vérifier, si le compte iCloud des utilisateurs est disponible pour accéder au CKContainer (et à son base de données privée), nous pouvons utiliser une demande asynchrone sur le conteneur par défaut .

// 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))")
  }   
}

Pour être informé des modifications pendant l'exécution de l'application, vous pouvez utiliser la notification CKAccountChanged .

0
LukeSideWalker