0

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。

0 Answers0