2015-03-28 26 views
12

Tôi muốn lưu tối đa một bản ghi (ví dụ: xếp hạng) cho mỗi người dùng trong bảng của cơ sở dữ liệu công khai. Đối với điều này tôi cần phải lưu ID người dùng hiện tại hoặc ID thiết bị. Nhưng làm thế nào tôi có thể nhận được nó?Cách lấy ID người dùng hiện tại trong CloudKit?

Trả lời

18

Bạn sẽ muốn gọi -[CKContainer fetchUserRecordIDWithCompletionHandler:] để lấy dòng điện ID người dùng ghi lại:

+3

Làm thế nào để có được người đàn ông này một ly bia !!! –

+0

Tôi nhận được một ngoại lệ khi tôi làm CKContainer.defaultContainer() libC++ abi.dylib: chấm dứt ngoại lệ không bị loại CKException –

22

Nhận iCloud ID/CloudKit Ghi ID với Swift 2

Dưới đây là một đoạn mà tôi đang sử dụng luôn để lấy iPhone ID iCloud của người dùng (Apple gọi đó là ID bản ghi CloudKit) cho ứng dụng iOS.

Điều duy nhất bạn cần làm trong Xcode là kích hoạt hộp kiểm "CloudKit" trong khả năng iCloud của dự án của bạn. Bạn không cần phải chủ động sử dụng CloudKit - nó chỉ là cốt lõi của tất cả các hoạt động iCloud kể từ iOS 8.

Điều quan trọng cần biết là Apple không bao giờ trực tiếp trưng ra ID iCloud thực nhưng luôn trả về một băm bảo mật ID iCloud và ID ứng dụng của bạn. Nhưng điều đó không nên lo lắng bạn vì chuỗi vẫn là duy nhất cho mỗi người dùng ứng dụng của bạn trên tất cả các thiết bị của mình và có thể được sử dụng làm thay thế đăng nhập.

Chức năng của tôi, không đồng bộ và trả về đối tượng CKRecordID tùy chọn. Thuộc tính thú vị nhất của đối tượng CKRecordID đó là recordName.

CKRecordID.recordName là chuỗi ký tự 33, ký tự đầu tiên luôn là dấu gạch dưới, 32 ký tự duy nhất (== ID người dùng iCloud được mã hóa cho ứng dụng của bạn). Nó trông giống như: "_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

Tôi nhận được một ngoại lệ khi tôi làm CKContainer.defaultContainer() libC++ abi.dylib: chấm dứt với uncaught ngoại lệ của loại CKException –

4

Dưới đây là đoạn mã cho 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

là điều này làm việc trong ios 10.3? – RejoylinLokeshwaran

+0

Có, nó sẽ hoạt động trên iOS 10.3 –

+0

tôi nhận được lỗi như, Chấm dứt ứng dụng do ngoại lệ chưa nắm bắt 'CKException', lý do: 'Ứng dụng bị thiếu yêu cầu quyền lợi com.apple.developer.icloud-services' – RejoylinLokeshwaran

Các vấn đề liên quan