Swift로 iOS에서 SMS 보내기


78

우선, Objective-C에서이 문제를 해결하는 수많은 스택 오버플로 질문이 있기 때문에 이것이 중복되지 않는다는 사실에 정말 놀랐습니다.하지만 아직 Swift를 사용한 좋은 답변을 보지 못했습니다.

내가 찾고있는 것은 주어진 전화 번호에 임의의 문자열을 문자 메시지의 본문으로 보내는 Swift의 코드 스 니펫입니다. 기본적으로 내가 좋아하는 뭔가 싶습니다 애플의 공식 문서에서,하지만 스위프트 대신 오브젝티브 C이다.

Android에서 단 몇 줄의 코드로 수행 할 수 있기 때문에 이것이 그렇게 어렵지 않다고 생각합니다.

편집 : 내가 찾고있는 것은 5-20 줄의 Swift 코드이며 이것이 너무 광범위하다는 데 동의하지 않습니다. Java (Android 용)에서 솔루션은 다음과 같습니다.

package com.company.appname;
import android.app.Activity;
import android.telephony.SmsManager;
public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        public static final mPhoneNumber = "1111111111";
        public static final mMessage = "hello phone";
        SmsManager.getDefault().sendTextMessage(mPhoneNumber, null, mMessage, null, null);
     }
}

이제 이것은 안드로이드 솔루션이며 11 줄 밖에 없습니다. Java는 Swift보다 훨씬 더 장황한 경향이 있으므로 제가 요청한 내용이 "너무 광범위"한 것인지 의심합니다. Objective-C MessageComposer 객체를 사용하는 방법을 모를 가능성이 높습니다. 위의 내용은 Swift에서의 사용과 관련하여 명확하지 않습니다.


2
게시물을 편집했는데 제가 묻고 자하는 질문이 너무 광범위하지 않다고 생각합니다. 이 질문을 닫는 것을 다시 고려하거나 범위를 너무 넓게 만드는 세부 사항을 명확하게 요청하여 도와주세요.
johncorser 2014-10-13

2
나는 또한 이 질문 이 Objective-C에 대한 동일한 질문이고 300 개 이상의 찬성 투표를 받았으며 중재자에 의해 보호 되었다는 사실을 지적하고 싶습니다 . 저는이 질문이 실제로 커뮤니티에 상당히 가치가 있다고 믿습니다.
johncorser 2014 년

6
알겠습니다. 저는 iOS 초보자이고 Objective C를 배울 기회가 없었습니다. 번역 방법을 알고 나면 번역이 쉬울 수 있지만 어떻게 완료되었는지 모르겠습니다. 스 니펫은 저와 같은 많은 사람들이 사용할 가능성이 높습니다.
johncorser 2014 년

1
물론입니다.하지만 적어도 Swift 코드를 작성하고 Objective-C 답변을 참조하는 것은 이상하게 보입니다. 그러면 독자는 스 니펫을 재사용하는 대신 변환을 수행해야합니다. StackOverflow에서 Swift 답변의 레퍼토리를 구축하는 것은 Swift가 결국 iOS 앱을 작성하는 기본 언어가 될 수 있으므로 향후 커뮤니티에만 도움이 될 것입니다.
johncorser 2014 년

2
제가 연결 한 질문은 6 살이지만 Swift 언어는 훨씬 더 젊습니다. 이 질문의 빠른 버전은 6 년 전에는 묻지 않았을 것입니다.
johncorser 2014-10-14

답변:


129

정말 답을 얻었는지 확실하지 않습니다. 나는 비슷한 사냥을하고 있었고이 해결책을 발견했고 그것을 작동 시켰습니다.

import UIKit
import MessageUI

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {

    @IBOutlet weak var phoneNumber: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func sendText(sender: UIButton) {
        if (MFMessageComposeViewController.canSendText()) {
            let controller = MFMessageComposeViewController()
            controller.body = "Message Body"
            controller.recipients = [phoneNumber.text]
            controller.messageComposeDelegate = self
            self.presentViewController(controller, animated: true, completion: nil)
        }
    }

    func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
        //... handle sms screen actions
        self.dismissViewControllerAnimated(true, completion: nil)
    }

    override func viewWillDisappear(animated: Bool) {
        self.navigationController?.navigationBarHidden = false
    }
}

이 문자 메시지 또는 iMessage를 보낼 것
오렌 Edrich

2
메시지 앱으로 이동합니다. 앱은 그것이 메시지인지 iMessage인지 결정합니다.
sivag1

URL과 텍스트를 공유하는 방법은 무엇입니까?
kishor0011

Swift for 업데이트를 고려하십시오. 예를 들어, 지금이다 : (_ 컨트롤러 : MFMessageComposeViewController, ...) FUNC의 messageComposeViewController
crimson_penguin

약간의 편집으로 나를 위해 일했습니다. controller.recipients = ([self.phoneNumber.text] as! [String])
Rakshitha Muranga Rodrigo

29

Swift 3.0 솔루션 :

func sendSMSText(phoneNumber: String) {
        if (MFMessageComposeViewController.canSendText()) {
            let controller = MFMessageComposeViewController()
            controller.body = ""
            controller.recipients = [phoneNumber]
            controller.messageComposeDelegate = self
            self.present(controller, animated: true, completion: nil)
        }
    }

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        //... handle sms screen actions
        self.dismiss(animated: true, completion: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        self.navigationController?.isNavigationBarHidden = false
    }

15

Swift 5 에서 iMessage를 보내기 위해 다음 코드를 사용합니다.

그냥 MessageUI의 패키지와 구현 MFMessageComposeViewControllerDelegate을

import UIKit
import MessageUI

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func sendNewIMessage(_ sender: Any) {
        let messageVC = MFMessageComposeViewController()
        messageVC.body = "Enter a message details here";
        messageVC.recipients = ["recipients_number_here"]
        messageVC.messageComposeDelegate = self
        self.present(messageVC, animated: true, completion: nil)
    }

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        switch (result) {
        case .cancelled:
            print("Message was cancelled")
        case .failed:
            print("Message failed")
        case .sent:
            print("Message was sent")
        default:
            return
        }
        dismiss(animated: true, completion: nil)
    }
}

나는 라인에 컨트롤러를 추가 할 필요가 있도록, 그러나 메시지 팝업, 해고하지 않습니다 감사합니다 : controller.dismiss을 (애니메이션 : 사실, 완료 : 무기 호)
데이비드 샌포드

5

UIViewController에 의존하지 않으려면 Swift 3.0 솔루션을 따르십시오 .

import UIKit
import MessageUI

class ECMMessageComposerBuilder: NSObject {

    private dynamic var customWindow: UIWindow?
    private var body: String?
    private var phoneNumber: String?
    fileprivate var messageController: MFMessageComposeViewController?

    var canCompose: Bool {
        return MFMessageComposeViewController.canSendText()
    }

    func body(_ body: String?) -> ECMMessageComposerBuilder {
        self.body = body
        return self
    }

    func phoneNumber(_ phone: String?) -> ECMMessageComposerBuilder {
        self.phoneNumber = phone
        return self
    }

    func build() -> UIViewController? {
        guard canCompose else { return nil }

        messageController = MFMessageComposeViewController()
        messageController?.body = body
        if let phone = phoneNumber {
            messageController?.recipients = [phone]
        }
        messageController?.messageComposeDelegate = self

        return messageController
    }

    func show() {
        customWindow = UIWindow(frame: UIScreen.main.bounds)
        customWindow?.rootViewController = MNViewController()

        // Move it to the top
        let topWindow = UIApplication.shared.windows.last
        customWindow?.windowLevel = (topWindow?.windowLevel ?? 0) + 1

        // and present it
        customWindow?.makeKeyAndVisible()

        if let messageController = build() {
            customWindow?.rootViewController?.present(messageController, animated: true, completion: nil)
        }
    }

    func hide(animated: Bool = true) {
        messageController?.dismiss(animated: animated, completion: nil)
        messageController = nil
        customWindow?.isHidden = true
        customWindow = nil
    }
}

extension ECMMessageComposerBuilder: MFMessageComposeViewControllerDelegate {

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        controller.dismiss(animated: true, completion: nil)
        hide()
    }
}

다음과 같이 작곡가를 호출합니다.

let phoneNumber = "987654321"
let composer = MNMessageComposerBuilder()
composer.phoneNumber(phoneNumber).show()

또는 lazy var 사용

let phoneNumber = "987654321"
private lazy var messageComposer: MNMessageComposerBuilder = {
    let composer = MNMessageComposerBuilder()
    return composer
}()
messageComposer.phoneNumber(phoneNumber).show()

5

스위프트 3, 4, 5

@IBAction func sendSmsClick(_ sender: AnyObject) {
        guard MFMessageComposeViewController.canSendText() else {
            return
        }

        let messageVC = MFMessageComposeViewController()

        messageVC.body = "Enter a message";
        messageVC.recipients = ["Enter tel-nr"]
        messageVC.messageComposeDelegate = self;

        self.present(messageVC, animated: false, completion: nil)
    }

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        switch (result.rawValue) {
            case MessageComposeResult.cancelled.rawValue:
            print("Message was cancelled")
            self.dismiss(animated: true, completion: nil)
        case MessageComposeResult.failed.rawValue:
            print("Message failed")
            self.dismiss(animated: true, completion: nil)
        case MessageComposeResult.sent.rawValue:
            print("Message was sent")
            self.dismiss(animated: true, completion: nil)
        default:
            break;
        }
    }

UI는 다음과 같습니다. 여기에 이미지 설명 입력


0

더 간단한 솔루션은 html 링크를 여는 것입니다.

let mPhoneNumber = "1111111111";
let mMessage = "hello%20phone";
if let url = URL(string: "sms://" + mPhoneNumber + "&body="+mMessage) {
    UIApplication.shared.open(url)
}

공백을 "% 20"으로 바꾸 었는지 확인하십시오.


-1
@IBAction func sendMessageBtnClicked(sender: AnyObject) {
    var messageVC = MFMessageComposeViewController()

    messageVC.body = "Enter a message";
    messageVC.recipients = ["Enter tel-nr"]
    messageVC.messageComposeDelegate = self;

    self.presentViewController(messageVC, animated: false, completion: nil)
}

func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
    switch (result.value) {
    case MessageComposeResultCancelled.value:
      println("Message was cancelled")
      self.dismissViewControllerAnimated(true, completion: nil)
    case MessageComposeResultFailed.value:
      println("Message failed")
      self.dismissViewControllerAnimated(true, completion: nil)
    case MessageComposeResultSent.value:
      println("Message was sent")
     self.dismissViewControllerAnimated(true, completion: nil)
    default:
      break;
    }
}

확인하지 않기 때문에 시뮬레이터에서 충돌이 발생 canSendText()합니다. 또한 recipients작성 창에 배치됩니다. 대부분의 장치에서 MMS는 자리 표시 자 텍스트가 녹색으로 바뀌고 연락처의 번호와 일치하지 않는 다음 사용자가 샘플 텍스트로 메시지를 보내도록 허용합니다. (이동 통신사가 요금을 부과하는 경우 장치 사용자에게 메시지 비용이 발생할 수 있습니다.)
benc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.