2015-03-28 3 views
12

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

18

Ti consigliamo di chiamare -[CKContainer fetchUserRecordIDWithCompletionHandler:] per andare a prendere l'ID del record utente corrente:

+3

Come faccio ad avere questo uomo una birra !!! –

+0

Ricevo un'eccezione quando eseguo CKContainer.defaultContainer() libC++ abi.dylib: termina con eccezione non rilevata di tipo CKException –

22

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

Ricevo un'eccezione quando eseguo CKContainer.defaultContainer() libC++ abi.dylib: termina con l'eccezione non rilevata di tipo CKException –

4

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

funziona in ios 10.3? – RejoylinLokeshwaran

+0

Sì, dovrebbe funzionare su iOS 10.3 –

+0

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