I use Message and SwiftUI Environment display an App Store message,I want to know the event or callback when the App Store message action disappears
My project is UIKit frame,So I had to use UIKit call SwiftUI, I have a transparent UIHostingController and root view is SwiftUI,I want to pop this UIHostingController when the user dismiss the App Store message action。
import StoreKit
import SwiftUI
@available(iOS 16.0, *)
struct SwiftUIView: View {
@Environment(\.displayStoreKitMessage) private var displayStoreMessage
var body: some View {
HStack {
}
.onAppear() {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) {
YKAppStoreMessagesManager.sharedManager.displayAction = displayStoreMessage
}
}
}
}
public final class TransparentHostingController<Content: View>: UIHostingController<Content> {
public override func viewDidLoad() {
super.viewDidLoad()
view.isOpaque = false
view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3)
}
}
@available(iOS 16.0, *)
@objcMembers public class YKAppStoreMessagesManager: NSObject {
var pendingMessages: [Message] = []
var pendingMessageFlag: Bool = true
var topVC: UITableViewController?
var message: Message?
override init() {
}
public static let sharedManager = YKAppStoreMessagesManager()
@MainActor public var displayAction: DisplayMessageAction? {
didSet {
handlePendingMessages()
}
}
@MainActor private func handlePendingMessages() {
if let action = self.displayAction {
if let msg = self.message {
display(message: msg, with: action)
}
}
}
@MainActor private func display(message: Message, with display: DisplayMessageAction) {
do {
try display(message)
} catch {
}
}
public func beginListen() -> Void {
if self.pendingMessageFlag == false {
return
}
self.alarm(withBizType: "YKAppStoreMessage", errorCode: "beginListen", errorMsg: nil)
Task { @MainActor in
for await message in StoreKit.Message.messages {
if !self.pendingMessages.contains(message) {
self.pendingMessages.append(message)
}
}
}
}
@MainActor public func showStoreKitMessage() -> Void {
if self.pendingMessageFlag == false {
return
}
let pendingMessages = self.pendingMessages
self.pendingMessages = []
for message in pendingMessages {
self.message = message
self.displayMessage()
break
}
}
func alarm(withBizType type: String?, errorCode: String?, errorMsg: String?) -> Void {
let aType = type ?? "AppStoreMessage"
let aCode = errorCode ?? "StoreKit"
let aMsg = errorMsg ?? ""
}
@MainActor func displayMessage() -> Void {
if let topVC = self.topVC {
let vc = TransparentHostingController(rootView: SwiftUIView())
vc.modalPresentationStyle = .custom
topVC.present(vc, animated: false)
}
}
}
I was expecting some logging in the callback of the page disappearing or view disappearing,but it doesn't show。
My english is poor,so sorry。