Docs Menu

동기화 오류 처리 - Swift SDK

Realm Mobile Sync를 사용하는 애플리케이션을 개발하는 동안 오류 핸들러를 설정해야 합니다. 이 오류 핸들러는 실패한 동기화 관련 API 호출을 감지하고 응답합니다.

일반적인 Device Sync 오류 목록과 처리하다 방법은 App Services Device Sync 문서에서 동기화 오류 를 참조하세요.

RLMSyncManager 싱글톤에 오류 핸들러를 설정합니다. 오류가 발생하면 Swift SDK 는 오류 객체 및 오류가 발생한 RLMSyncSession 을 사용하여 오류 핸들러를 호출합니다.

참고

Realm 은 도메인이 RLMSyncErrorDomain 인 NSError 객체를 통해 동기화 오류를 나타냅니다. 오류 코드에 학습 보려면 RLMSyncErrorRLMSyncAuthError의 정의를 확인하세요.

RLMApp *app = [RLMApp appWithId:YOUR_APP_ID];
// Access the sync manager for the app
RLMSyncManager *syncManager = [app syncManager];
syncManager.errorHandler = ^(NSError *error, RLMSyncSession *session) {
// handle error
};

SyncManager 싱글톤에 오류 핸들러를 설정합니다. SyncManager 싱글톤에 오류 핸들러를 설정합니다. 오류가 발생하면 Swift SDK는 오류 객체 및 오류가 발생한 SyncSession 을 사용하여 오류 핸들러를 호출합니다.

let app = App(id: YOUR_APP_SERVICES_APP_ID)
app.syncManager.errorHandler = { error, session in
// handle error
}

다음도 참조하세요.

클라이언트 로그 수준 설정 또는 로거 사용자 지정에 대한 자세한 내용은 클라이언트 로그 수준 설정 - Swift SDK를 참조하세요.

Device Sync 를 사용할 때 클라이언트 재설정 은 서버 의 특정 동기화 영역 이 더 이상 클라이언트 영역 과 동기화 할 수 없을 때 클라이언트 앱 이 수행해야 하는 오류 복구 작업 입니다. 이 경우 클라이언트 는 동기화 기능 을 복원 하기 위해 해당 영역 을 서버 와 일치하는 상태 로 재설정해야 합니다.

이 경우 클라이언트의 동기화할 수 없는 영역에 아직 서버와 동기화되지 않은 데이터가 포함될 수 있습니다. Realm SDK는 클라이언트 재설정 프로세스 중에 해당 데이터를 복구하거나 삭제할 수 있습니다.

클라이언트 재설정이 발생하는 원인에 대한 자세한 내용은 Go App Services 문서의 클라이언트 재설정을 참조하세요.

Realm SDK는 대부분의 클라이언트 재설정 오류를 자동으로 처리하는 클라이언트 재설정 모드 를 제공합니다. 자동 클라이언트 재설정 모드는 Realm을 닫거나 알림을 누락하지 않고 로컬 Realm 파일을 동기화 가능한 상태로 복원합니다.

.manual 를 제외한 모든 클라이언트 재설정 모드는 자동 클라이언트 재설정을 수행합니다. 모드 간의 차이점은 아직 백엔드에 동기화되지 않은 기기의 변경 사항을 처리하는 방법에 따라 달라집니다.

대부분의 클라이언트 재설정 시나리오를 자동으로 처리하려면 .recoverUnsyncedChanges 를 선택합니다. 이렇게 하면 클라이언트 재설정이 발생할 때 동기화되지 않은 변경 사항을 복구하려고 시도합니다.

경우에 따라 수동 클라이언트 재설정 처리기를 설정 해야 하거나 설정해야 할 수 있습니다. 앱에 자동으로 처리할 수 없는 특정 클라이언트 재설정 로직이 필요한 경우 이 작업을 수행할 수 있습니다.

버전 10.32.0에서 변경됨: 클라이언트 복구 추가, 폐기로컬 이름 변경됨

Swift SDK 는 SyncConfiguration 에서 클라이언트 재설정 모드 를 지정하는 옵션을 제공합니다. .clientResetMode 입니다. 속성.

// Specify the clientResetMode when you create the SyncConfiguration.
// If you do not specify, this defaults to `.recoverUnsyncedChanges` mode.
var configuration = user.flexibleSyncConfiguration(clientResetMode: .recoverUnsyncedChanges())

이 속성 은 다양한 클라이언트 재설정 모드를 나타내는 열거형 을 사용합니다.

  • .recoverUnsyncedChanges

  • .recoverOrDiscardUnsyncedChanges

  • .discardUnsyncedChanges

  • .manual

구성에서 .clientResetMode 을 지정하지 않으면 클라이언트 재설정 모드는 기본적으로 .recoverUnsyncedChanges 으로 설정됩니다.

자동 클라이언트 재설정 프로세스 중에 실행할 beforeafter 차단을 지정할 수 있습니다. 이를 사용하여 애플리케이션에 중요한 복구 로직을 수행할 수 있습니다.

// A block called after a client reset error is detected, but before the
// client recovery process is executed.
// This block could be used for any custom logic, reporting, debugging etc.
// This is one example, but your usage may vary.
let beforeClientResetBlock: (Realm) -> Void = { before in
var recoveryConfig = Realm.Configuration()
recoveryConfig.fileURL = myRecoveryPath
do {
try before.writeCopy(configuration: recoveryConfig)
// The copied realm could be used later for recovery, debugging, reporting, etc.
} catch {
// handle error
}
}
// A block called after the client recovery process has executed.
// This block could be used for custom recovery, reporting, debugging etc.
// This is one example, but your usage may vary.
let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in
// let res = after.objects(myClass.self)
// if (res.filter("primaryKey == %@", object.primaryKey).first != nil) {
// // ...custom recovery logic...
// } else {
// // ...custom recovery logic...
// }
// }
}
do {
let app = App(id: YOUR_APP_SERVICES_APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var configuration = user.flexibleSyncConfiguration(clientResetMode:
.recoverOrDiscardUnsyncedChanges(
beforeReset: beforeClientResetBlock,
afterReset: afterClientResetBlock))
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

앱에 특정 클라이언트 복구가 필요한 경우 .manual 클라이언트 재설정 모드를 지정하고 수동 클라이언트 재설정 핸들러 를 설정할 수 있습니다. 클라이언트 재설정 중에 앱이 수행해야 하는 특정 사용자 지정 로직이 있거나 클라이언트 복구 규칙 이 앱에서 작동하지 않는 경우 이 작업을 수행할 수 있습니다.

참고

앱에서 Swift SDK 버전 10.24.2 이하를 사용하는 경우 .clientResetMode 은(는) SyncConfiguration 에서 사용 가능한 속성이 아닙니다.

클라이언트 복구Device Sync를 구성 할 때 기본적으로 활성화되는 기능입니다. 클라이언트 복구가 활성화되면 Realm은 대부분의 경우 클라이언트 재설정 프로세스를 자동으로 관리할 수 있습니다. 스키마를 변경하는 경우:

  • 클라이언트는 스키마 변경이 없거나 손상적이지 않은 스키마 변경이 없는 경우 동기화되지 않은 변경 사항을 복구 할 수 있습니다.

  • 손상적인 스키마 변경이 발생하면 자동 클라이언트 재설정 모드는 수동 오류 처리기로 되돌아갑니다. 이 경우 수동 클라이언트 재설정 오류 처리기 를 설정할 수 있습니다. 앱에서 호환성이 손상되는 스키마 변경이 있을 때는 자동 클라이언트 복구를 수행할 수 없습니다.

단절적 스키마 변경과 단절적이지 않은 변경에 대한 자세한 내용은 단절적 변경과 단절적이지 않은 변경 비교를 참조하세요.

버전 10.32.0의 새로운 기능.

클라이언트 재설정 중에 클라이언트 애플리케이션은 아직 백엔드 와 동기화되지 않은 로컬 영역 의 데이터 복구를 시도할 수 있습니다. 동기화되지 않은 변경 사항을 복구하려면 기본값 으로 App Services App 에서 클라이언트 복구 를 활성화해야 합니다.

앱 에서 아직 동기화되지 않은 변경 사항을 복구하려면 SyncConfiguration 에서 .clientResetMode 를 다음 중 하나로 설정하다 합니다.

  • .recoverUnsyncedChanges: 이 모드를 선택하면 클라이언트는 동기화되지 않은 변경 사항을 복구하려고 시도합니다. 동기화되지 않은 변경 사항을 삭제하고 싶지 않을 때 이 모드를 선택하세요.

  • .recoverOrDiscardUnsyncedChanges: 클라이언트는 먼저 아직 동기화되지 않은 변경 사항을 복구하려고 시도합니다. 클라이언트가 동기화되지 않은 데이터를 복구할 수 없는 경우 동기화 되지 않은 변경 사항을 삭제 하지만 계속 자동으로 클라이언트 재설정을 수행합니다. 동기화되지 않은 변경 사항을 삭제하도록 자동 클라이언트 복구를 활성화하려면 이 모드를 선택합니다.

// Specify the clientResetMode when you create the SyncConfiguration.
// If you do not specify, this defaults to `.recoverUnsyncedChanges` mode.
var configuration = user.flexibleSyncConfiguration(clientResetMode: .recoverUnsyncedChanges())

손상적인 스키마 변경이 있거나 Device Sync 구성에서 클라이언트 복구 가 비활성화된 경우와 같이 동기화되지 않은 변경 사항 복구 모드에서 클라이언트 재설정 작업을 완료할 수 없는 경우가 있을 수 있습니다. 이 경우를 처리하기 위해 앱에서 수동 클라이언트 재설정 폴백을 구현할 수 있습니다.

클라이언트 복구가 활성화된 경우 이러한 규칙은 백엔드와 클라이언트가 모두 동일한 객체를 변경할 때 충돌을 해결하는 방법을 포함하여 객체가 통합되는 방식을 결정합니다.

  • 로컬에서 생성되었지만 클라이언트 재설정 전에 동기화되지 않은 객체는 동기화됩니다.

  • 객체가 서버에서 삭제되었지만 복구 클라이언트에서 수정된 경우 삭제가 우선적으로 적용되고 클라이언트는 업데이트를 삭제합니다.

  • 객체가 복구 중인 클라이언트에서는 삭제되고 서버에서는 삭제되지 않는 경우 클라이언트는 서버의 삭제 명령을 적용합니다.

  • 동일한 필드에 대한 업데이트가 충돌하는 경우 클라이언트 업데이트가 적용됩니다.

버전 10.32.0에서 변경됨: .discardLocal 로 변경되었습니다.discardUnsyncedChanges

동기화되지 않은 변경 사항 삭제 클라이언트 재설정 모드 는 마지막 동기화 에 성공적인 이후 이루어진 모든 동기화되지 않은 로컬 변경 사항을 영구적으로 삭제합니다. 앱 에 Device Sync 클라이언트 복구 규칙 과 일관적인 하지 않는 클라이언트 복구 로직이 필요한 경우 또는 동기화되지 않은 데이터를 복구하지 않으려는 경우 이 모드 를 사용할 수 있습니다.

애플리케이션에서 아직 백엔드에 동기화되지 않은 로컬 데이터를 잃을 수 없는 경우 동기화되지 않은 변경 사항 삭제 모드를 사용하지 마세요.

동기화되지 않은 변경 사항을 삭제하는 자동 클라이언트 재설정을 수행하려면 SyncConfiguration 에서 .clientResetMode.discardUnsyncedChanges 로 설정합니다.

do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .discardUnsyncedChanges())
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

참고

복구 후 삭제

동기화되지 않은 변경 사항을 복구하려고 시도하지만 복구할 수 없는 변경 사항을 삭제하려면 동기화되지 않은 변경 사항 복구에서 .recoverOrDiscardUnsyncedChanges 설명서를 참조하세요 .

손상적인 스키마 변경이 있는 경우와 같이 동기화되지 않은 변경 사항 삭제 모드에서 클라이언트 재설정 작업을 완료할 수 없는 경우가 있을 수 있습니다. 이 경우를 처리하기 위해 앱에서 수동 클라이언트 재설정 폴백을 구현할 수 있습니다.

.clientResetMode.manual 를 지정하는 경우 수동 클라이언트 재설정 핸들러를 구현해야 합니다.

.manual 모드 에서는 자체 클라이언트 재설정 핸들러를 정의합니다. 핸들러는 ErrorReportingBlock 을 취할 수 있습니다. 가능하면 자동 클라이언트 복구 모드 를 사용하고, 자동 복구 로직이 앱 에 적합하지 않은 경우에만 .manual 모드 를 선택하는 것이 좋습니다.

do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .manual())
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

이전 버전의 SDK를 사용 중이고 수동 클라이언트 재설정 에서 변경 사항을 수동으로 복구하는 방법의 예시 를 보려면 에서 이 Github예시 를 확인하세요.

손상적인 스키마 변경이 있는 경우와 같이 클라이언트 재설정 작업을 자동으로 완료할 수 없는 경우 클라이언트 재설정 프로세스는 수동 오류 처리기에게로 넘어갑니다. 이는 다음과 같은 자동 클라이언트 재설정 모드에서 발생할 수 있습니다.

  • .recoverUnsyncedChanges

  • .recoverOrDiscardUnsyncedChanges

  • .discardUnsyncedChanges

RLMApp 의 RLMSyncManager 인스턴스 를 통해 이 대체 사례에 대한 오류 핸들러를 설정하다 수 있습니다. 사용자에게 앱 을 업데이트 하거나 다른 조치 를 수행하도록 권장하는 치명적인 오류 복구 상황에서는 수동 처리기를 도구로 취급하는 것이 좋습니다.

RLMApp *app = [RLMApp appWithId:YOUR_APP_ID];
[[app syncManager] setErrorHandler:^(NSError *error, RLMSyncSession *session) {
if (error.code == RLMSyncErrorClientResetError) {
// TODO: Invalidate all open realm instances
// TODO: Restore the local changes backed up at [error rlmSync_clientResetBackedUpRealmPath]
[RLMSyncSession immediatelyHandleError:[error rlmSync_errorActionToken] syncManager:[app syncManager]];
return;
}
// Handle other errors...
}];

SyncManager 를 통해 이 대체 사례에 대한 오류 핸들러를 설정할 수 있습니다. 사용자에게 앱을 업데이트하거나 다른 조치를 수행하도록 권장하는 치명적인 오류 복구 상황에서는 수동 핸들러를 도구로 취급하는 것이 좋습니다.

func handleClientReset() {
// Report the client reset error to the user, or do some custom logic.
}
do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .recoverOrDiscardUnsyncedChanges())
// If client recovery fails,
app.syncManager.errorHandler = { error, session in
guard let syncError = error as? SyncError else {
fatalError("Unexpected error type passed to sync error handler! \(error)")
}
switch syncError.code {
case .clientResetError:
if let (path, clientResetToken) = syncError.clientResetInfo() {
handleClientReset()
SyncSession.immediatelyHandleError(clientResetToken, syncManager: app.syncManager)
}
default:
// Handle other errors...
()
}
}
} catch {
print("Error: \(error.localizedDescription)")
}

Device Sync를 종료했다가 다시 활성화하여 애플리케이션의 클라이언트 재설정 처리를 수동으로 테스트할 수 있습니다.

동기화를 종료했다가 다시 허용하면 이전에 동기화로 연결한 클라이언트는 클라이언트 재설정을 수행할 때까지 연결할 수 없습니다. 동기화를 종료하면 클라이언트의 동기화를 허용하는 메타데이터가 서버에서 삭제됩니다. 클라이언트는 서버에서 영역의 새 복사본을 다운로드해야 합니다. 서버는 이러한 클라이언트에 클라이언트 재설정 오류를 보냅니다. 따라서 동기화를 종료하면 trigger 클라이언트 재설정 조건이 됩니다.

클라이언트 재설정 처리를 테스트하려면 다음을 수행합니다.

  1. 클라이언트 애플리케이션에서 데이터를 쓰고 동기화될 때까지 기다립니다.

  2. Realm Mobile Sync를 종료했다가 다시 활성화합니다.

  3. 클라이언트 앱을 다시 실행합니다. 앱이 서버에 연결하려고 할 때 클라이언트 재설정 오류가 발생해야 합니다.

경고

클라이언트 애플리케이션에서 클라이언트 재설정 처리를 반복하는 동안 동기화를 종료했다가 다시 활성화해야 할 수 있습니다. 동기화를 종료했다가 다시 활성화하면 클라이언트 재설정을 완료할 때까지 기존의 모든 클라이언트를 동기화할 수 없습니다. 프로덕션 환경에서 이를 방지하려면 개발 환경에서 클라이언트 재설정 처리를 테스트하세요.