imessage 扩展应用程序组对话发送在第一次运行时失败

如何解决imessage 扩展应用程序组对话发送在第一次运行时失败

我有一个 imessage 扩展应用程序,除了第一次发送到群组之外,它运行良好。
iOS 14.4 多设备 8、8plus、10... Xcode 12.4

代码直接从发送闭包(成功)到 didResignActive。该应用程序应该保持活动状态。任何地方都没有解雇。我已经调试了连接的设备并逐步执行了代码,它直接从日志行转到 didResignActive。

如果我在同一组中再次启动该应用程序,它就可以正常工作。仅当我开始新的群组对话,然后单击托盘中的应用程序并调用发送时,该应用程序才会失败。

注意:这只发生在组发送中,并且仅在第一次创建组时发生。

       thisConversation.send(message) { error in
            if let error = error {
                os_log("submitMessage(%@): initial send error: %@",log: .default,type: .debug,type,error.localizedDescription)
            } else {
                os_log("submitMessage(%@): initial send success!",type)
            }
        }

解决方法

编辑: 只是更新... 我被告知要为此提交错误报告(我做了)。

我还提供了一个演示如何重现错误的视频。

这是支持人员发回的消息...

嗨,

感谢您联系 Apple 开发者技术支持 (DTS)。

DTS 无法为反馈 ID #FB9049862 提供解决方法;它 仍在调查中。请继续通过以下方式跟踪问题 错误报告。 ...

我能够创建一个重现这个问题的测试应用程序,我认为用最少的代码来演示。希望这能带来解决方案!

//
//  MessagesViewController.swift
//  testGroupSend MessagesExtension
//

import UIKit
import Messages
import os

class MessagesViewController: MSMessagesAppViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    // MARK: - Conversation Handling
    func composeSelectionMsg(on conversation: MSConversation,in
        session: MSSession) -> MSMessage {
         
        let layout = MSMessageTemplateLayout()
        layout.caption = "caption..."

        let message = MSMessage(session: session)
        message.layout = layout
        message.summaryText = "summary text..."
        
        var components = URLComponents()
        var queryItems = [URLQueryItem]()
        
        queryItems.append(URLQueryItem(name: "MessageType1",value: "msgType"))
        queryItems.append(URLQueryItem(name: "Encode-Name",value: "Encode-Value"))


        components.queryItems = queryItems
        message.url = components.url!
        
        return message
    }

    func submitMessage() {
        guard let conversation = activeConversation else {
            os_log("submitMessage(): guard on conversation falied!",log: .default,type: .debug)
            return
        }
        var session : MSSession
        if let tSess = conversation.selectedMessage?.session {
            session = tSess
            os_log("submitMessage() got a session!...",type: .debug)
        } else {
            os_log("###### submitMessage() did NOT get a session,creating new MSSession() #####",type: .debug)
            session = MSSession()
        }
        var message: MSMessage
         
        message = composeSelectionMsg(on: conversation,in: session)
            
            //  conversation.insert(message) { error in
        conversation.send(message) { error in
                if let error = error {
                    os_log("submitMessage(): initial send error: %@",type: .debug,error.localizedDescription)
                } else {
                    os_log("submitMessage(): initial send success!",type: .debug)
                }
            }
    }

    fileprivate func loadContentView() {
        os_log("loadContentView()...",type: .debug)
       let childViewCtrl = ContentViewHostController()
        
        childViewCtrl.delegate = self
        childViewCtrl.view.layoutIfNeeded() // avoids snapshot warning?
        
        if let window = self.view.window {
            childViewCtrl.myWindow = window
            window.rootViewController = childViewCtrl
        }
    }
    
    override func willBecomeActive(with conversation: MSConversation) {
        loadContentView()
    }
    
    override func didResignActive(with conversation: MSConversation) {
        os_log("didResignActive()...",type: .debug)

    }
}
//
//
import SwiftUI
import Messages
import os

final class ContentViewHostController: UIHostingController<ContentView> {
    weak var delegate: ContentViewHostControllerDelegate?
    weak var myWindow: UIWindow?

    init() {
        
        super.init(rootView: ContentView())
        rootView.submitMessage = submitMessage
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder,rootView: ContentView())
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    
    func submitMessage() {
        os_log("ContentViewHostController::submitMessage(): submit message...",type: .debug)
        delegate?.contentViewHostControllerSubmitMessage(self)
    }
}

struct ContentView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var submitMessage: (() -> Void)?
       
    var body: some View {
        VStack {
            VStack {
                HStack {
                    Button(action: { self.cancel() } ) { Image(systemName: "chevron.left") }
                        .padding()
                    
                    Spacer()
               
                    Button(action: { self.submit() } ) {
                        Text("Send...")
                    }
                    .padding()
                    
                } // HStack
            } // VStack
        } // outside most VStack

    } // body
  
    private func cancel() {
        presentationMode.wrappedValue.dismiss()
    }
    
    private func submit() {
        submitMessage!()
        presentationMode.wrappedValue.dismiss()
    }
} // ContentView


//
//

import SwiftUI
import Messages
import os

extension MessagesViewController: ContentViewHostControllerDelegate {
        // MARK: - ContenHost delegate

        func contentViewHostControllerSubmitMessage(_ controller: ContentViewHostController) {
            os_log("delegateSubmitMessage:...")
            
            submitMessage()
        }

}

//
//
import SwiftUI
import Messages

protocol ContentViewHostControllerDelegate: class  {
    func contentViewHostControllerSubmitMessage( _ controller: ContentViewHostController )
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?