Mi piacerebbe salvare al massimo un record (vale a dire una valutazione) per utente in una tabella del database pubblico. Per questo ho bisogno di salvare l'ID utente corrente o l'ID del dispositivo. Ma come posso averlo?Come ottenere l'ID utente corrente in CloudKit?
risposta
Ti consigliamo di chiamare -[CKContainer fetchUserRecordIDWithCompletionHandler:]
per andare a prendere l'ID del record utente corrente:
Get iCloud ID/CloudKit ID record con Swift 2
Ecco un frammento che Utilizzo sempre per andare a prendere l'iPhone l'ID iCloud dell'utente (Apple lo chiama CloudKit Record ID) per un'app iOS.
L'unica cosa che devi fare in Xcode è attivare la casella di controllo "CloudKit" nelle funzionalità iCloud del tuo progetto. Non è affatto necessario utilizzare attivamente CloudKit, ma è il fulcro di tutte le attività iCloud da iOS 8.
È importante sapere che Apple non espone mai direttamente il vero ID iCloud, ma restituisce sempre un hash sicuro di l'ID iCloud e il tuo ID app. Ma questo non dovrebbe preoccuparti perché quella stringa è ancora unica per tutti gli utenti della tua app su tutti i suoi dispositivi e può essere utilizzata come sostituzione di login.
La mia funzione è asincrona e restituisce un oggetto CKRecordID opzionale. La proprietà più interessante di quell'oggetto CKRecordID è recordName.
CKRecordID.recordName
è una stringa di 33 caratteri in cui il primo carattere è sempre un trattino basso seguito da 32 caratteri univoci (== l'ID iCloud dell'utente codificato per l'app). Sembra simile a: "_cd2f38d1db30d2fe80df12c89f463a9e"
import CloudKit
/// async gets iCloud record name of logged-in user
func iCloudUserIDAsync(complete: (instance: CKRecordID?, error: NSError?) ->()) {
let container = CKContainer.defaultContainer()
container.fetchUserRecordIDWithCompletionHandler() {
recordID, error in
if error != nil {
print(error!.localizedDescription)
complete(instance: nil, error: error)
} else {
print("fetched ID \(recordID?.recordName)")
complete(instance: recordID, error: nil)
}
}
}
// call the function above in the following way:
// (userID is the string you are intersted in!)
iCloudUserIDAsync() {
recordID, error in
if let userID = recordID?.recordName {
print("received iCloudID \(userID)")
} else {
print("Fetched iCloudID was nil")
}
}
Ricevo un'eccezione quando eseguo CKContainer.defaultContainer() libC++ abi.dylib: termina con l'eccezione non rilevata di tipo CKException –
Ecco il frammento di codice per Swift 3
import CloudKit
/// async gets iCloud record ID object of logged-in iCloud user
func iCloudUserIDAsync(complete: @escaping (_ instance: CKRecordID?, _ error: NSError?) ->()) {
let container = CKContainer.default()
container.fetchUserRecordID() {
recordID, error in
if error != nil {
print(error!.localizedDescription)
complete(nil, error as NSError?)
} else {
print("fetched ID \(recordID?.recordName)")
complete(recordID, nil)
}
}
}
// call the function above in the following way:
// (userID is the string you are interested in!)
iCloudUserIDAsync { (recordID: CKRecordID?, error: NSError?) in
if let userID = recordID?.recordName {
print("received iCloudID \(userID)")
} else {
print("Fetched iCloudID was nil")
}
}
funziona in ios 10.3? – RejoylinLokeshwaran
Sì, dovrebbe funzionare su iOS 10.3 –
ho avuto l'errore di terminare un'app a causa dell'eccezione non rilevata 'CKException', motivo: 'L'applicazione non è richiesta autorizzazione necessaria com.apple.developer.icloud-services' – RejoylinLokeshwaran
Come faccio ad avere questo uomo una birra !!! –
Ricevo un'eccezione quando eseguo CKContainer.defaultContainer() libC++ abi.dylib: termina con eccezione non rilevata di tipo CKException –