[英]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.