the_world_21
@the_world_21 (yamato takeru)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

Q&A

Closed

解決したいこと

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 にログインしてからアプリを起動してはどうでしょうか。

  3. @the_world_21

    Questioner

    設定アプリからログインしてアプリ起動すると
    account status: CKAccountStatus(rawValue: 1)
    になりました。
    ありがとうございます!

    Error read country
    と出るようになりました。
    多分conteinerの名称が悪そうですね。。

  4. Error read country
    と出るようになりました。

    ↓ 一つ前のQ&Aのことでしょうか?

  5. print("Error read country (error)")

    errorの内容を見せてください

  6. @the_world_21

    Questioner

    エラーの中身をうまく書けていなかったですね。すみません。
    CKError 0x600000c7df80: "Bad Container" (5/1014); "Couldn't get container configuration from the server for container "cityList""
    というメッセージになります。

  7. @the_world_21

    Questioner

    一つ前のQ&Aは、全く同じ内容なのですが、投稿時に「時間がかかってます」と表示されっぱなしになっていたので、重ねて本質問をしてしまったものです。

  8. CKError 0x600000c7df80: "Bad Container" (5/1014); "Couldn't get container configuration from the server for container "cityList""

    container名は、iCloud.で始まる必要がありませんか?

    コンテナの名前は、「iCloud」の接頭辞が付いたアプリのバンドル識別子です。


    一つ前のQ&Aは、全く同じ内容なのですが、投稿時に「時間がかかってます」と表示されっぱなしになっていたので、重ねて本質問をしてしまったものです。

    削除(質問の取り消し)してしまってはどうですか?

  9. @the_world_21

    Questioner

    度々ありがとうございます。
    コンテナ名を
    iCloud.com.example.CityList
    に変更してみましたが、同じエラーが出ます。
    account status: CKAccountStatus(rawValue: 1)
    CKError 0x600000c7d740: "Bad Container" (5/1014); "Couldn't get container configuration from the server for container "iCloud.com.example.CityList""
    難しいもんですね。なんだかもう少しな感じもしますが。。

  10. @the_world_21

    Questioner

    もう一つの質問の方はクローズしました。
    ありがとうございました。

  11. iCloud.com.example.CityList
    に変更してみましたが、同じエラーが出ます。

    それは違う気がします。

    開発しているアプリのBundleIDはなんでしょうか?

    ↓ このサンプルだと、BundleIDはcom.nak435.QA4なので、コンテナ名はiCloud.com.nak435.QA4にするものと思います。

    scr1.png

  12. @the_world_21

    Questioner

    コンテナ名を
    iCloud.com.example.CityList
    にした際にBundleIDを
    com.example.CityList
    にしています。
    そこは間違っていないと思うのですが。。

  13. そこは間違っていないと思うのですが。。

    なるほど・・・

    https://icloud.developer.apple.com/にログインして、CloudKit Databaseを確認してみてはどうですか。

    View your container in CloudKit Console
    CloudKit Console is a web-based tool that lets you manage your app’s iCloud containers. It appears within the Apple Developer web portal, and you can use it to ensure that your container exists.
    Using a web browser, such as Safari, navigate to the CloudKit Console webpage at https://icloud.developer.apple.com/.
    If you’re asked to sign in, enter your credentials and click Sign In.
    On the subsequent page, verify that your container appears in the container list.

  14. @the_world_21

    Questioner

    コメントありがとうございます。
    お返事遅くなってすみません。
    まだ少ししか見れてないですが、今のところ特に問題なさそうです。
    年末でちょっとバタバタしてまして、また年明けに確認させていただきます。

  15. @the_world_21

    Questioner

    明けましておめでとうございます。
    何が悪かったか分からないですが、再起動などしていたらいつの間にか正常に動くようになりました。
    cloudkit databaseも問題なさそうに見えます。
    何が悪かったか分からないのがちょっと気持ち悪いで、分かったら報告させていただきたいと思います。

  16. 解決でよろしければ、当Q&Aはクローズしてもらっても問題ありません。
    クローズ後でも、アップデートは可能です。

  17. @the_world_21

    Questioner

    了解です。
    ありがとうございました。
    とっても助かりました。
    クローズさせていただきます。

Your answer might help someone💌