簡體   English   中英

使用 swift 以編程方式發送消息

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM