Kiểm soát thông báo App Store trong iOS SDK

App Store đôi khi cần hiển thị thông báo cho người dùng về gói đăng ký của họ: yêu cầu họ đồng ý tăng giá, thông báo về sự cố thanh toán, hoặc trình bày ưu đãi thu hút khách hàng cũ. Theo mặc định, StoreKit tự hiển thị những thông báo này khi ứng dụng đang mở — kể cả khi đang hiển thị paywall, onboarding, hoặc màn hình thanh toán.

Để tự chọn thời điểm hiển thị, hãy chuyển Adapty SDK sang chế độ xử lý thông báo thủ công. Khi đó, SDK sẽ thêm từng thông báo vào danh sách chờ, và ứng dụng của bạn hiển thị danh sách đó khi gọi showStoreMessages.

Warning

Trong chế độ thủ công, StoreKit sẽ không tự hiển thị thông báo. Nếu ứng dụng của bạn không bao giờ gọi showStoreMessages, người dùng sẽ không bao giờ thấy yêu cầu chấp thuận tăng giá hoặc thông báo về vấn đề thanh toán.

Trước khi bắt đầu

Bạn cần:

  • Adapty iOS SDK 4.2 trở lên: Các phiên bản cũ hơn không có API thông báo từ cửa hàng.
  • iOS 16, Mac Catalyst 16, hoặc visionOS 1 trở lên trên thiết bị của người dùng: StoreKit không gửi thông báo đến ứng dụng trên các phiên bản cũ hơn. API thông báo từ cửa hàng không khả dụng trên macOS.

Bật xử lý thủ công

Để bắt các thông báo từ App Store, hãy đặt storeMessagesHandling thành .manual khi bạn kích hoạt SDK:

let configurationBuilder = AdaptyConfiguration
    .builder(withAPIKey: "YOUR_PUBLIC_SDK_KEY")
    .with(storeMessagesHandling: .manual) // .auto is the default

SDK bắt đầu ghi lại các message khi bạn kích hoạt nó, và giữ chúng trong bộ nhớ cho phiên ứng dụng hiện tại. Với giá trị mặc định .auto, SDK không ghi lại bất cứ thứ gì, và getPendingStoreMessageTypes cùng showStoreMessages sẽ không có tác dụng gì.

Lấy danh sách loại tin nhắn đang chờ

Để kiểm tra xem có tin nhắn nào đang chờ không, hãy gọi getPendingStoreMessageTypes. Hàm này trả về các loại tin nhắn đang chờ mà không hiển thị hay xóa chúng:

let pendingTypes = await Adapty.getPendingStoreMessageTypes()

if pendingTypes.contains(.billingIssue) {
    // For example, skip the upsell and show the billing message first
}

Mỗi tin nhắn thuộc một trong các loại sau:

LoạiThông báo
.genericThông báo chung từ App Store.
.priceIncreaseConsentYêu cầu đồng ý tăng giá gói đăng ký.
.billingIssueThông báo về sự cố thanh toán gói đăng ký. Có sẵn trên iOS 16.4 trở lên.
.winBackOfferMột ưu đãi thu hút khách hàng cũ đủ điều kiện. Có sẵn trên iOS 18 trở lên.

Loại thông báo mà SDK không nhận ra sẽ có giá trị thô là storekit_<number>.

Hiển thị tin nhắn đang chờ

Khi ứng dụng của bạn đến một thời điểm mà hộp thoại hệ thống sẽ không làm gián đoạn người dùng — ví dụ như sau khi người dùng đóng một flow hoặc hoàn thành onboarding — hãy gọi showStoreMessages:

SDK hiển thị các thông báo lần lượt từng cái một. Sau khi StoreKit hiển thị một thông báo, SDK sẽ xóa nó khỏi danh sách chờ. Nếu StoreKit không hiển thị được thông báo, SDK sẽ ghi lỗi vào log của Adapty, giữ lại thông báo đó cho lần gọi tiếp theo, và tiếp tục xử lý các thông báo còn lại.

Chỉ hiển thị một số loại thông báo nhất định

Để chỉ hiển thị một số thông báo đang chờ, hãy truyền các loại vào for. Các thông báo còn lại vẫn ở trạng thái chờ:

try await Adapty.showStoreMessages(
    for: [.billingIssue, .priceIncreaseConsent],
    using: displayStoreKitMessage
)

Nếu không có for, SDK sẽ hiển thị tất cả các thông báo đang chờ, kể cả những loại mà nó không nhận ra.

Lỗi

showStoreMessages ném ra AdaptyError với một trong các mã lỗi sau:

MãTênNguyên nhân
3201operationInProgressMột lệnh gọi showStoreMessages khác vẫn đang hiển thị thông báo. Hãy chờ nó hoàn tất rồi thử lại.
3202resolverFailureChỉ dành cho UIKit: bạn chưa truyền scene, và SDK không tìm thấy scene nào đang hoạt động ở foreground. Gọi lại phương thức khi ứng dụng đang ở foreground, hoặc truyền scene một cách tường minh.
9000operationInterruptedTask đã gọi phương thức này bị huỷ.