Skip to main content
Xcode 26 compatibility is fully restored in v8. The cache layer has been migrated from Realm to Core Data, eliminating all Realm dependencies and removing the need for per-Xcode-version SDK variants.
Code blocks in this migration guide compare v7 and v8 shapes. v7 snippets intentionally reference removed APIs; use the v8 snippets for new code.

What changed in v8

SDK v8 is a major release focused on three goals:
  1. Remove Realm — the cache layer is now powered by Core Data, restoring Xcode forward compatibility and removing a heavyweight dependency from your project.
  2. Modernise the API surface — constructors, async methods, and model objects follow consistent, Swift-idiomatic patterns.
  3. Expand product tagging and room capabilities — new APIs for product tags, room management, and co-host permissions.

Installation

SDK

Realm and RealmSwift are no longer required as of v8. Minimum iOS target: 14.0

UIKit

Minimum iOS target: 14.0

Global breaking changes

These patterns apply across the entire SDK. Per-class sections below only document changes beyond these rules.

1. Client removed from constructors

All repositories and managers no longer accept an AmityClient parameter. The SDK manages the client internally.

2. Mutating methods return Void

Methods that previously returned Bool to indicate success now return Void. A successful call means success; any failure throws an error.

3. Completion handlers replaced with async/await

Use async/await directly instead of callback-based completion handlers when enabling features or reading settings.

4. Model objects are immutable value snapshots

  • model and client properties removed from all model classes.
  • All properties changed from var to let. Exceptions are noted per class.
  • Timestamp properties (createdAt, updatedAt, editedAt, etc.) changed from Date to Date?.

5. AmityCollection observe callback signature changed

AmityCollectionChange has been removed. The callback no longer delivers per-change index information.

Renamed classes


New classes


Removed APIs


Per-class changes

Only changes beyond the global breaking changes are listed here.
Init signature changed: init(channelId: String) — no client parameter.
Init signature changed: init(channelId: String) — no client parameter.
  • Init signature changed: init(channelId: String)
  • getSettings() return type is now AmityChannelNotificationSettings
All options must now be provided at initialisation rather than mutated after the fact.
editUser(_:) parameter type changed: AmityUserUpdateBuilderAmityUserUpdateOptions
  • links: [AmityLink] added
  • isInvalidated removed
links: [AmityLink]? added.
pageSize: Int = 20 added.
links: [AmityLink]? added.
  • user: AmityUser? added (the community creator/owner)
  • event property removed
  • Init signature changed: init(communityId: String)
  • getMembers(...) and searchMembers(...) gain excludingRoles: [String] = []
Init signature changed: init(communityId: String) — no client parameter.
Init signature changed: init(communityId: String)
getFile(fileId:) return type changed: AmityRawFileAmityFile
Typo fixed: tartgetIdtargetId. Update all call sites.
setVideoStreamId(_:) is deprecated. Use setRoomId(_:) instead.
Still available but deprecated. Migrate to AmityMetadataMapper.AmityMetadataMapper also adds hashtags(fromMetadata:) -> [AmityHashtag].
  • postData type renamed: AmityPost.DataAmityPost.PostData
  • pinnedProductId: String? added
  • eventId: String? added
  • isInvalidated removed
  • Remaining mutable properties: postData, analytics, syncState, mentionees, links
untilAt: Date? added.
All createXxxPost(...) and editPost(...) methods gain:
  • productTags: [AmityTextProductTag]?
  • attachmentProductTags: AmityAttachmentProductTags? (where applicable)
Additional changes:
  • thumbnail: AmityImageData? added
  • liveThumbnailUrl: String? added
  • liveResolution: AmityRoomResolution? added
  • recordedResolution: AmityRoomResolution? added
  • isInvalidated removed
  • channel and post are now externally read-only (public private(set) var)
canManageProductTags: Bool added.
Init signature changed: init(roomId: String) — no client parameter.
New method: updateCohostPermissions(roomId:cohostId:canManageProductTags:) async throws -> AmityRoom
disposeStream(withId:completion:)disposeStream(withId:) async throws -> AmityStream
Init gains new parameters: init(channelId:isDeleted:excludeDefaultSubChannel:) — both new parameters default to false.
  • isBanned removed
  • Added: internalId: String, permissions: [String], path: String, blockedAt: Date?, avatar: AmityImageData?
  • enable(for modules:) returns Void
  • disableAllNotifications() returns Void
  • follow(withUserId:), unfollow(withUserId:), acceptMyFollower(withUserId:), declineMyFollower(withUserId:) — return type changed from (Bool, AmityFollowResponse) to AmityFollowResponse
  • blockUser(userId:) and unblockUser(userId:) are now @MainActor
Typo fixed: tartgetIdtargetId. Update all call sites.