본문 바로가기
iOS

[또러블슈팅] CloudKit + CoreData 을 사용하는 App에서 iCloud 동기화가 안되는 문제

by SiO2whocode 2024. 12. 12.
728x90

CloudKit과 CoreData 사용시 iCloud 데이터 동기화가 자동으로 되지 않는 경우

 

내 경우

- CoreData를 사용해서 local data persistence storage를 사용하고 있었음

- CloudKit을 사용할 수 있도록 Capabilities에도 iCloud, container를 체크해둠

- CoreData Model 파일의 configuration에도 used with CloudKit 체크해둠

- AppDelegate 파일에도 "NSPersistentCloudKitContainer"로 되어있었음. 처음 앱을 출시했을 때도 이랬던걸로 보아 프로젝트를 생성할 때 use CloudKit에 체크를 했던 것 같다.

- 이 외에도 Background - remote notification 체크

등등 기본적으로 CloudKit을 사용하기 위해 필요한 셋팅들은 다 해둠. 아래 공식 문서 참고

https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/setting_up_core_data_with_cloudkit

 

그치만 실제로 다운받은 앱에서는 iCloud 계정을 공유하는 디바이스간 데이터 동기화가 되고 있지 않았다.

 

그런데 xcode에서 simulator로 앱을 실행했을 때는 시뮬레이터에 iCloud 계정으로 로그인을 하면 동기화가 됐다..!

그래서 이대로 배포하면 데이터 동기화가 될 줄 알고 Testflight에 미리 올려서 테스트해봤는데, Testflight에서는 또 동기화가 전혀 안되는 모습..

그래서 관련 키워드로 ("icloud sync not working on testflight" 이런식) 검색을 해보니까 stack overflow 랑 apple forum에 유사한 내용의 질문글이 많았음 아래는 해당 오류(?)를 해결하는 데 도움이 됐던 링크들

CloudKit dashboard에서 production 에 scheme deploy해야한다는 답변 
1) https://stackoverflow.com/questions/75763775/core-data-cloudkit-works-in-development-but-doesnt-work-on-production-after-d

2) https://stackoverflow.com/questions/68646989/unable-to-deploy-a-containers-schema-to-production-cloudkit-coredata

 

Unable to deploy a Container's Schema to Production - CloudKit, CoreData

As the title suggests I'm in the process of releasing an app which is using Core Data and CloudKit to sync user data across multiple devices. In order to distribute the app through TestFlight and l...

stackoverflow.com

 

이 내용과 관련해서는 아래 애플 공식 문서를 참고해보는 것도 좋을 것 같다. (CoreData with CloudKit 내용에 이것 까지 포함해야하는 거 아닌가 싶은 생각이 들었지만 뭐.. 그들도 생각이 있겠지)  https://developer.apple.com/documentation/cloudkit/managing_icloud_containers_with_cloudkit_database_app/deploying_an_icloud_container_s_schema

 

Deploying an iCloud Container’s Schema | Apple Developer Documentation

Reset your container’s state during development and deploy your container’s schema to production.

developer.apple.com

그리고 추가로, CloudKit의 data sync가 어떻게 이루어지는지 이해하기 위해서 아래와 같은 문서도 있음 (이건 나도 아직 다 읽어보지 못했는데, 앞으로 발생하는 오류 트래킹을 하려면 읽어봐야할 것 같다)

https://developer.apple.com/documentation/technotes/tn3163-understanding-the-synchronization-of-nspersistentcloudkitcontainer

 

TN3163: Understanding the synchronization of NSPersistentCloudKitContainer | Apple Developer Documentation

Explore the details inside the synchronization of by capturing and analyzing a sysdiagnose.

developer.apple.com

 

 

"the fix is that CloudKit.framework has to be included in the app target's "Frameworks, Libraries, and Embedded Content" section." app 타겟에서 Frameworks, Libraries, and Embedded Content 에 CloudKit.framework를 추가해야한다는 답변 

3) https://developer.apple.com/forums/thread/717838

 

정확히 나랑 상황이 같은 질문글 

4) https://forums.developer.apple.com/forums/thread/756893

 

CloudKit in TestFlight: No sync be… | Apple Developer Forums

The issue is now resolved, and the problem was neither in Core Data, nor in code / CloudKit. Simply the iCloud storage was full. But I didn't know that, because it was an account of the QA team member, not mine. And this is extremely tricky. So I want to k

forums.developer.apple.com

 

결론

결과적으로 production에 deploy한 게 큰 역할을 한 것 같다. 계속 development에만 올리고 테스트하니까 시뮬레이터에서는 잘 동작해도 testflight나 실제 앱에서는 동기화가 안됐던 것임..3번 답변도 반영하긴 했는데 이게 영향이 있었던 건지는 모른다. (ablation study를 해볼 수도 없고,,)

 

production deploy는 아래처럼 CloudKit Database 대시보드(via CloudKit console)에 들어가서 꼭 container 옆에 production으로 설정하고, 왼쪽 사이드바에서 'Deploy Scheme Changes...'를 눌러서 deploy하기!

 

주의할 점은 deploy 이후에 archive 하기 전까지는 이전 버전에서 동기화가 일어나지 않고 있는 듯 했는데,

archive하고 testflight로 밤에 테스트를 하고 나서 아침에 다시 앱스토어에서 기존 버전으로 앱을 설치하고 나니 icloud 동기화가 되는 모습..이게 내가 개발자모드로 테스트를 하고 있었어서 icloud 쌓인 데이터가 있어서 그랬을 것 같은데,

우선 production deploy 하고 나면 별도의 앱 재설치 or 업데이트 하지 않아도 동기화 기능이 활성화되는 것 같음.

(이 부분이 아직 걸려서 계속 찾아보고 GPT한테도 물어봤는데.. 얘가 이랬단 말이에여.. 암튼 그래서 서둘러서 앱 업데이트 제출함..

 

---- 여기부터 사담이자 기록 ----

드디어..숙원사업이었던 PHOKI iCloud 동기화 기능 업데이트를 했다..!

사실 보편적이고 핵심적인 문제는 아주 간단한 문제였지만

PHOKI 자료구조상 문제되는 부분이 있었어서 고치고 테스트했다.

그리고 그 과정에서 몇가지 오류가 발견돼서 그것들을 해결하느라 시간이 좀 더 걸렸다.

 

오류 내용

1) 데이터가 동기화되는데, 캘린더가 중복되고, 해당 캘린더에 들어가도 다른 데이터가 뜨는 상황 발생..

원인 : 지금 calendar마다 id가 부여가 되어있고 이걸로 캘린더를 식별하는데, 문제는 이 id가 기존에는 "현재 캘린더 개수 + 1"로 지정되고 있었음.. (진짜 어쩜 이런 코드를..id 중복이 충분히 발생할 수 있는 거 였는데..? 왜 멀쩡했을까..?)

해결방안 : id에 유니크한 값을 담고자 uuid와 timestamp를 합친 문자열로 재설정했다. 이러면 데이터 동기화가 발생해도 동일한 id를 가진 캘린더는 없다.

2) 캘린더 삭제시 홈화면 재로딩시 crash

캘린더 삭제할 때 (coredata recore 삭제) 바로 context save하지 않아서 반영이 느렸던 문제

해결방안 : 삭제 후에 함수 안에서 바로 context save

3) 메인화면에서 캘린더 내용이랑 title 불일치

원인 : 데이터가 동기화되면서 calendar list 는 변경되는데 collection view 는 reload 안돼서 발생하는 문제

해결방안 : view will appear에서 collection view도 reload (이거 추가적인 overhead 있을 것 같긴한데..일단..

4) 캘린더 삭제시 현재 보고있는 캘린더 변경 문제 (crash)

원인 : 캘린더를 삭제할 때 지금 삭제하는 캘린더가 메인화면에서 보고있는 캘린더 일 때만 current calendar index를 -1 % n 해줬는데, 이러면 현재 캘린더 범위보다 큰 인덱스를 가리키고 있었을 경우 해당 인덱스에 해당하는 캘린더가 없으므로 (앞으로 이동함) crash남.

해결방안 : 캘린더 delete하면 current cal index = 0

5) target ios version 9->12 (error는 아니고 warning 뜸)

6) GULAppEnvironmentUtil 관련 오류는 아래에 포스팅 함 (podfile re-install로 해결)

https://sio2whocode.tistory.com/250

 

[또러블슈팅] double-quoted include "헤더파일명" in framework header, expected angle-bracketed instead ERROR

또(트)러블슈팅 에러가 뜨게 된 상황1. 빌드 하고 실행하려고 했는데, 'GoogleUtilities/GULAppEnvironmentUtil.h' 파일에서 함수명() 이렇게 되어 있는 부분에 void를 추가하라는 문구가 뜸2. 추가하려고 Fix

sio2whocode.tistory.com

7 Final) CloudKit 관련 오류 해결 (위에서 설명)

 

PHOKI 다운로드 수는 계속 일정수치를 유지하고 있고,,블로그랑 메일, 앱스토어 리뷰로 피드백도 많이 와서,,이걸 안고칠 수는 없는데 시간은 안나고 방법은 모르겠고 하다가 몇주 각잡고 포키 업데이트를 끝장내기로 한 결과..후 문제를 그래도 해결할 수 있어서 얼마나 다행인지..

이제 iOS 다른 프로젝트를 마음 놓고 시작해볼 수 있겠다. 휴, 포키도 계속 요청받은 기능들 업데이트 할 예정..!

 

포키 관련 재밌는 점 - 포키가 월별 기록용 캘린더 앱이다보니 저렇게 우뚝 솟은 지점들이 월말과 월초이다.

ㅋㅋ 기가막히게 월말에 혹은 월초에 기록해봐야지!하고 포키를 찾는 경우가 많다는 것..! 재밌는 발견

 

아직 심사중이지만 곧 업데이트가 출시되길 바라며

엥 벌써 승인됐네 애플 심사 왜이렇게 빨라짐..? 기능 수정이 많이 없긴 했지만..

따듯한 연말 보내시길 바랍니다 :)

728x90