[英]Sending message programmatically with swift
此代码打开消息应用程序并发送消息。 不幸的是,消息传递应用程序没有关闭。 总是要杀死应用程序。 消息应用程序被窃听。 取消按钮不起作用。 任何帮助表示赞赏。
图 1:这是初始屏幕。 可以取消,一切正常
图 2:这是在点击返回后发送消息。 Noice 取消选项是灰色的
图3:这是崩溃。 键盘没了,取消还是灰显,无法关闭这个 window
import SwiftUI
import MessageUI
struct Services: View {
@Binding var name: String
let urlString = URL (string: "tel://1234567")!
var body: some View {
NavigationView{
VStack {
VStack(alignment: .leading){
Text("text1" )
.padding(.vertical, 5.0)
}
Spacer()
HStack {
Button(action: {
UIApplication.shared.open(self.urlString)
}) {
Text("Call phone")
}
.frame(minWidth: 0, maxWidth: 150)
.font(.subheadline)
Button(action: {
presentMessageCompose(name: self.name)
}) {
Text("Text phone")
.font(.subheadline)
}
.frame(minWidth: 0, maxWidth: 150)
}
Spacer()
}
.navigationBarTitle("Title")
}
}
}
func presentMessageCompose(name:String) {
let messageComposeDelegate = MessageComposeDelegate()
guard MFMessageComposeViewController.canSendText() else {
return
}
let vc = UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = messageComposeDelegate
composeVC.recipients = ["1234567"]
composeVC.body = "Message to send to \(name))"
vc?.present(composeVC, animated: true, completion: nil)
}
我必须单独创建这个 class:MessageComposeDelegate
import Foundation
import MessageUI
class MessageComposeDelegate: NSObject, MFMessageComposeViewControllerDelegate {
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
// Customize here
controller.dismiss(animated: true)
}
}
我将与打开消息相关的代码移至新的 class:
import UIKit
import MessageUI
class DisplayMessageInterface: UIViewController, MFMessageComposeViewControllerDelegate {
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
switch (result) {
case .cancelled:
print("Message was cancelled")
dismiss(animated: true, completion: nil)
case .failed:
print("Message failed")
dismiss(animated: true, completion: nil)
case .sent:
print("Message was sent")
dismiss(animated: true, completion: nil)
default:
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func displayMessageInterface() {
let topVC = topMostController()
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = self
// Configure the fields of the interface.
composeVC.recipients = ["1234567"]
composeVC.body = "I love Swift!"
// Present the view controller modally.
if MFMessageComposeViewController.canSendText() {
topVC.present(composeVC, animated: true, completion: nil)
} else {
print("Can't send messages.")
}
}
func topMostController() -> UIViewController {
var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController!
while (topController.presentedViewController != nil) {
topController = topController.presentedViewController!
}
return topController
}
}
并将按钮操作更新为:
Button(action: {
let displaymessageinterface = DisplayMessageInterface()
displaymessageinterface.displayMessageInterface()
})
但我仍然遇到同样的问题
当我点击取消按钮时,会出现一个新错误:“线程 1:EXC_BAD_ACCESS (code=1, address=0x1c)”。 图四
您是否添加了messageComposeViewController:didFinishWithResult:
方法来了解用户何时完成撰写消息?
https://www.ioscreator.com/tutorials/send-imessage-ios-tutorial
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
switch (result) {
case .cancelled:
print("Message was cancelled")
dismiss(animated: true, completion: nil)
case .failed:
print("Message failed")
dismiss(animated: true, completion: nil)
case .sent:
print("Message was sent")
dismiss(animated: true, completion: nil)
default:
break
}
}
我在这里找到了解决方案
https://medium.com/@florentmorin/messageui-swiftui-and-uikit-integration-82d91159b0bd
不推荐使用 keywindow:
替换:让 vc = UIApplication.shared.keyWindow?.rootViewController
与:让vc = UIApplication.shared.windows.filter { $0.isKeyWindow }.first?.rootViewController!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.