如何解决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 举报,一经查实,本站将立刻删除。