the_world_21
@the_world_21 (yamato takeru)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

iCloudのdatabaseを読み込めない(アカウント認証エラー?)

解決したいこと

iCloud連携するアプリを作ってみたくて勉強中なのですが、クラウドのデータベースからの読み込みができません。
ApplicationDataのinit()でデータベースの読み込みを行うようにしているのですが、シミュレータでビルドするとコンソールに読み込み失敗のエラーが出ます。
エラーメッセージを読む限りアカウント認証エラーのようなのですが、解決策を教えてください。

発生している問題・エラー

Error read country <CKError 0x600000c74b10: "Not Authenticated" (9/1002); "This request requires an authenticated account">

該当するソースコード

class ApplicationData:ObservableObject{
    @Published var countryList : [CountryViewModel] = []
    @Published var cityList : [CityViewModel] = []
    
    var database : CKDatabase!
    
    init(){
        let container = CKContainer(identifier: "cityList")
        database = container.privateCloudDatabase
        
        Task(priority:.high){
            await readCountries()
        }
    }
    func readCountries()async {
        let predicate = NSPredicate(format: "TRUEPREDICATE") // all true
        let query = CKQuery(recordType: "Countries", predicate: predicate)
        
        do{
            let list = try await database.records(matching: query,inZoneWith: nil,desiredKeys: nil,resultsLimit: 0)
            
            await MainActor.run{
                countryList = []
                for (_,result) in list.matchResults{
                    if let record = try? result.get(){
                        let newCountry = Country(name: record["name"], record: record)
                        let newItem = CountryViewModel(id: record.recordID, country: newCountry)
                        countryList.append(newItem)
                    }
                }
                countryList.sort(by: {$0.countryName < $1.countryName})
            }
        } catch {
            print("Error read country \(error)")
        }
    }
}
    

自分で試したこと

sign&capabilityパネルのcontainer名は赤字になっていないので、名称は問題ないと思います。
ただBundle Identifierをそっくり使うと赤字になってしまうので、少し変えています。

0

1Answer

アプリから iCloud にログインしていないからでは?
次の4行を追加して、ステータスを確認してはどうでしょうか。


    init(){
        let container = CKContainer(identifier: "cityList")
+       container.accountStatus { status, error in
+           if let error { print("error: \(error.localizedDescription)") }
+           else { print("account status: \(status)") }
+       }
        database = container.privateCloudDatabase
        
        Task(priority:.high){
            await readCountries()
        }
    }    

0Like

Comments

  1. @the_world_21

    Questioner

    コメントありがとうございます。
    追加してみました。
    account status: CKAccountStatus(rawValue: 3)
    とコンソールに表示されます。
    ログインできてるってことでしょうか?

  2. account status: CKAccountStatus(rawValue: 3)

    noAccount: The device doesn’t have an iCloud account. です。

    Settings(設定) → Apple Account → iCloud にログインしてからアプリを起動してはどうでしょうか。

Your answer might help someone💌