プログラムでiPhoneにSMSを送信する方法は?


526

公式のSDK / Cocoa Touchを使用してからプログラムでSMSを送信することが可能かどうか、またどのようにして送信できるかは誰かが知っていiPhoneますか?


Ios 4の場合コードでSMSを送信できますが、問題はアプリケーションが終了することです
Pankaj Kainthla

公式SDKを使用する必要がない場合は、Twilioを使用してこれを行う方法を示すためにこの投稿を書きました:twilio.com/blog/2016/11/…
ミーガンSpeir

GmailからGoogleスプレッドシートを作成し、必要なフィールドを作成しtools->script editorてから、POSTリクエストでMailApp.sendEmailAPIを使用して電話番号にメールを送信できます。att'sはYOURNUMBER @ mms.att.net、tmobile'sはYOURNUMBER@tmomail.netです(すべて無料)
Coty Embry

回答:


404

制限事項

iPhoneのプログラム内でSMSを送信できれば、バックグラウンドで人々をスパムするゲームを書くことができます。「この新しいゲームを試してみてください。私のboxxersをroxxersし、あなたもそうします!roxxersboxxers.com !!!!今すぐサインアップすると、3,200 RBを獲得できます。ポイント!!」

Appleには、自動化された(または部分的に自動化された)SMSおよびダイヤル操作に対する制限があります。(ゲームが代わりに特定の時間に911をダイヤルした場合を想像してください)

あなたの最善の策は、オンラインSMS送信サービスを使用するインターネット上に中間サーバーをセットアップし、完全な自動化が必要な場合はそのルートを介してSMSを送信することです。(つまり、iPhone上のプログラムがUDPパケットをサーバーに送信し、サーバーが実際のSMSを送信します)

iOS 4アップデート

ただし、iOS 4ではviewController、アプリケーションにインポートできるようになりました。SMSフィールドに事前入力すると、ユーザーはコントローラー内でSMS送信を開始できます。「SMS:...」URL形式を使用する場合とは異なり、これによりアプリケーションを開いたままにして、両方の toフィールドとbodyフィールドの。複数の受信者を指定することもできます。

これにより、ユーザーが明示的に気づかないうちにアプリケーションが自動SMSを送信することを防ぎます。それでも、iPhone自体から完全に自動化されたSMSを送信することはできません。ユーザーの操作が必要です。ただし、これにより、少なくともすべてのデータを入力でき、アプリケーションの終了を回避できます。

MFMessageComposeViewControllerのクラスが十分に文書化されており、チュートリアルは、それが実装するのがいかに簡単であるかを示しています。

iOS 5アップデート

iOS 5には、iPod touchおよびiPadデバイス用のメッセージングが含まれているため、私はまだこれをテストしていませんが、すべてのiOSデバイスがMFMessageComposeViewControllerを介してSMSを送信できる可能性があります。この場合、AppleはSMSサーバーを実行しており、セルラーモデムを持たないデバイスに代わってメッセージを送信します。

iOS 6アップデート

このクラスに変更はありません。

iOS 7アップデート

これで、使用しているメッセージメディアが件名または添付ファイルを受け入れるかどうか、およびそれが受け入れる添付ファイルの種類を確認できます。件名を編集して、メディアが許可するメッセージに添付ファイルを追加できます。

iOS 8アップデート

このクラスに変更はありません。

iOS 9アップデート

このクラスに変更はありません。

iOS 10アップデート

このクラスに変更はありません。

iOS 11アップデート

このクラスに大きな変更はありません

このクラスの制限

これはiOS 4を搭載していない電話では機能せず、iPod touchやiPadでは機能しないことに注意してください。ただし、おそらくiOS 5を除きます。これを使用する前に、デバイスとiOSの制限を検出する必要がありますコントローラ、またはアプリを最近アップグレードされた3G、3GS、および4つのiPhoneに制限するリスクがあります。

ただし、SMSを送信する中間サーバーでは、これらのiOSデバイスのすべてがインターネットにアクセスできる限りSMSを送信できます。そのため、多くのアプリケーションにとってはより良いソリューションである可能性があります。または、両方を使用し、デバイスがサポートしていない場合にのみオンラインSMSサービスにフォールバックします。


12
そして、あなたがそのドメインを購入した場合、私は二度と同じようにあなたを見ることができなくなります。
アダムデービス

79
誰かがこの投稿をスパムとして報告したのは皮肉なことだと思います。行間、人々の間でお読みください!
Randolpho

2
これは推測として読み取るため、-1。また、アプリ内SMSの送信方法については、JusのWondrinとrydgazeの回答もご覧ください。
Frank Shearar

8
@フランク-新しいiOS 4機能を反映するように私の記事を更新しました。ウィッシーウォッシーの表現を削除しました。
Adam Davis

13
この投稿をiOSの新しいバージョンに合わせて更新し続けることを心から感謝しています。:)
シリヨン2016年

143

これは、まさにあなたが探しているものを実行するチュートリアルですMFMessageComposeViewController

http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/

基本的に:

MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];
if([MFMessageComposeViewController canSendText])
{
    controller.body = @"SMS message here";
    controller.recipients = [NSArray arrayWithObjects:@"1(234)567-8910", nil];
    controller.messageComposeDelegate = self;
    [self presentModalViewController:controller animated:YES];
}

そして、ドキュメントへのリンク。

https://developer.apple.com/documentation/messageui/mfmessagecomposeviewcontroller


それでも、SMSフォームはポップアップする必要があります。バックグラウンドで送信する方法はありますか?
ラプター2012

5
Twilioなどのサービスを使用してバックグラウンドでSMSを確実に送信できますが、ユーザーの電話番号から送信する場合は、上記の方法でSMSを承認する必要があります。
Daniel Amitay、2012

3
上記のコードを使用してMFMessageComposeViewController *controller = ...いる人は、ifブロック内に配置することを検討することをお勧めします。(クラスメソッドは、テストを実行するためにインスタンスを持つ必要はありません)
同期さ

リンクhttp://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/に私のラップトップで「502 Bad Gateway」と表示されています。リンクが壊れている可能性があります。
Nikita Vlasenko、2015年

99
  1. MessageUI.frameworkをXcodeプロジェクトに追加する必要があります
  2. #import <MessageUI/MessageUI.h>ヘッダーファイルにを含める
  3. あなたのヘッダファイルにこれらのデリゲートを追加MFMessageComposeViewControllerDelegateUINavigationControllerDelegate
  4. あなたのIBActionメソッドでMFMessageComposeViewControllersayのインスタンスを宣言しますmessageInstance
  5. お使いのデバイスが[MFMessageComposeViewController canSendText]if条件でテキスト使用を送信できるかどうかを確認するには、はい/いいえを返します
  6. if条件これらの操作を行います。

    1. 最初にあなたの体を設定してくださいmessageInstance

      messageInstance.body = @"Hello from Shah";
    2. 次に、メッセージの受信者を次のように決定します。

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
    3. 次のようにデリゲートをmessageInstanceに設定します。

      messageInstance.messageComposeDelegate = self;
    4. 最後の行でこれを行います:

      [self presentModalViewController:messageInstance animated:YES];

2
バージョンに関する注意:presentModalViewController:animated:廃止予定です。presentViewController:animated:completion:代わりに使用してください。また、- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result結果を知りたい場合は、デリゲートメソッドを必ず定義してください。
ラプター

テスト用のコードを入力してください。@Najeebullah Shahはここまたはgithubにあります。

50

sms:[target phone number]URLを使用してSMSアプリケーションを開くことができますが、SMSの本文にテキストを事前に入力する方法は示されていません。


react-native-communicationsは&body =パラメーターを使用して、iOSのsms:targetphonenumber&body = textyouwanttoprefillwithを開くときにテキストを事前入力します
Doug Voss

私はこれを私のiphone 8で試したところ、うまくいきました...ありがとう!
Brad Parks、

特定の番号にSMSを送信する必要がありますが、本文は事前に定義(プレフィル)されています。本文は、4つの可能なオプションから手動で選択する必要があります。たとえば、アプリが開いてポップアップ「理由を選択」します。次に、4つのオプションを使用できます。次に、ユーザーはこれらの4つのオプションのいずれかを選択し、ユーザーの選択を本文テキストとして持つ自動SMSが送信されます。ヒントは?
seralouk

25

MacOSのプロセス間通信のシステムの1つはXPCです。このシステム層は、libSystemとlaunchdを使用したplist構造の転送に基づくプロセス間通信用に開発されました。実際、これは、辞書などの構造の交換を介してプロセスを管理できるインターフェースです。遺伝のため、iOS 5にもこのメカニズムがあります。

この紹介で私が何を意味しているのかすでに理解しているかもしれません。はい、iOSにはXPC通信用のツールを含むシステムサービスがあります。また、SMS送信用のデーモンを使用した作業を例示したいと思います。ただし、この機能はiOS 6で修正されていますが、iOS 5.0〜5.1.1に関連していることに注意してください。脱獄、プライベートフレームワーク、およびその他の違法なツールは、その悪用に必要ではありません。/ usr / include / xpc / *ディレクトリのヘッダーファイルのセットのみが必要です。

iOSでのSMS送信の要素の1つは、システムサービスcom.apple.chatkitです。そのタスクには、ショートテキストメッセージの生成、管理、送信が含まれます。制御を容易にするために、一般に利用可能な通信ポートcom.apple.chatkit.clientcomposeserver.xpcを備えています。XPCサブシステムを使用すると、ユーザーの承認なしにメッセージを生成して送信できます。 

さて、接続を作成してみましょう。

xpc_connection_t myConnection;

dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc", DISPATCH_QUEUE_CONCURRENT);

myConnection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);

これで、XPC接続myConnectionがSMS送信のサービスに設定されました。ただし、XPC構成では、中断された接続の作成が提供されています。アクティブ化には、もう1つの手順を実行する必要があります。

xpc_connection_set_event_handler(myConnection, ^(xpc_object_t event){
xpc_type_t xtype = xpc_get_type(event);
if(XPC_TYPE_ERROR == xtype)
{
NSLog(@"XPC sandbox connection error: %s\n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
}
// Always set an event handler. More on this later.

NSLog(@"Received a message event!");

});

xpc_connection_resume(myConnection);

接続がアクティブ化されます。現時点では、iOS 6はこのタイプの通信が禁止されているというメッセージを電話ログに表示します。次に、メッセージの送信に必要なデータを使用して、xpc_dictionaryと同様の辞書を生成する必要があります。

NSArray *recipient = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];

NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:recipient format:200 options:0 error:NULL];

xpc_object_t mydict = xpc_dictionary_create(0, 0, 0);
xpc_dictionary_set_int64(mydict, "message-type", 0);
xpc_dictionary_set_data(mydict, "recipients", [ser_rec bytes], [ser_rec length]);
xpc_dictionary_set_string(mydict, "text", "hello from your application!");

あと少しです。メッセージをXPCポートに送信し、配信されたことを確認してください。

xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});

それで全部です。SMSを送信しました。


1
SMSの送信にXPCを使用しないでください。作成されたアプリはAppleによって承認されません。代わりにMessageUI Frameworkを使用してください
Raptor

組織で使用しているアプリでこのテクニックを使用していて、アプリがアプリストアを経由していない場合、心配はありません。
Martin Berger

これはiOSバージョン10以降で動作しますか?
Martin Berger

iOS 12で「XPCサンドボックス接続エラー:接続が無効です」
Martin Berger

23

MessageUI.Frameworkを追加し、次のコードを使用します

#import <MessageUI/MessageUI.h> 

その後:

if ([MFMessageComposeViewController canSendText]) {
  MFMessageComposeViewController *messageComposer =
  [[MFMessageComposeViewController alloc] init];
  NSString *message = @"Your Message here";
  [messageComposer setBody:message];
  messageComposer.messageComposeDelegate = self;
  [self presentViewController:messageComposer animated:YES completion:nil];
}

とデリゲートメソッド-

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
             didFinishWithResult:(MessageComposeResult)result {
      [self dismissViewControllerAnimated:YES completion:nil];
 }

いいですね。でも、この機能をバックグラウンドから実行できますか?
Raj

3
Appleはユーザーの承認なしにメッセージを送信することを許可しません。彼は手動でボタンを押してメッセージ/メールを送信する必要があります。または、メール/番号をバックエンドに送信して送信することにより、カスタムサービスを使用できます。あなたはiPhone上で直接これを行うことはできませんが
バーラトGulati

21

このアプローチを使用できます。

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:MobileNumber"]]


iOSは、アプリからメッセージアプリのメッセージ作成ページに自動的に移動します。URLのスキームはsms:で始まるので、これはメッセージアプリによって認識されて起動するタイプとして識別されます。


12
//Add the Framework in .h file

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

//Set the delegate methods

UIViewController<UINavigationControllerDelegate,MFMessageComposeViewControllerDelegate>

//add the below code in .m file


- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    MFMessageComposeViewController *controller = 
    [[[MFMessageComposeViewController alloc] init] autorelease];

    if([MFMessageComposeViewController canSendText])
    { 
        NSString *str= @"Hello";
        controller.body = str;
        controller.recipients = [NSArray arrayWithObjects:
                                 @"", nil];
        controller.delegate = self;
        [self presentModalViewController:controller animated:YES];  
    }


}

- (void)messageComposeViewController:
(MFMessageComposeViewController *)controller
                 didFinishWithResult:(MessageComposeResult)result 
{
    switch (result)
    {
        case MessageComposeResultCancelled:  
            NSLog(@"Cancelled");    
            break; 
        case MessageComposeResultFailed:
            NSLog(@"Failed");
            break;   
        case MessageComposeResultSent:      
            break; 
        default:  
            break;  
    }  
    [self dismissModalViewControllerAnimated:YES]; 
}

あなたはこのリンクを見るはずです: blog.mugunthkumar.com/coding/… それはあなたを助けるでしょう
Banker Mittal

12

この手順に従ってください

1。MessageUI.Frameworkプロジェクトに追加ここに画像の説明を入力してください

2。#import <MessageUI/MessageUI.h>.hファイルにインポートします。

3。メッセージを送信するためにこのコードをコピーします

 if ([MFMessageComposeViewController canSendText]) {
    MFMessageComposeViewController *messageComposer =
    [[MFMessageComposeViewController alloc] init];
    NSString *message = @"Message!!!";
    [messageComposer setBody:message];
    messageComposer.messageComposeDelegate = self;
    [self presentViewController:messageComposer animated:YES completion:nil];
}

4。delegate必要に応じてメソッドを実装します。

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{


   ///your stuff here 

    [self dismissViewControllerAnimated:YES completion:nil];
}

実行してGO!


おそらく、コールバックメソッド[self dismissViewControllerAnimated:YES completion:nil];内で実行することをお勧めしますmessageComposeViewController: didFinishWithResult:。それ以外の場合は、そこにぶら下がるだけです。
SaltyNuts 2014年

5

これは、iOSでSMSを送信するためのコードのSwiftバージョンです。実際のデバイスでのみ機能することに注意してください。iOS 7以降でテストされたコード。詳しくはこちらをご覧ください

1)MFMessageComposeViewControllerDelegateとNSObjectを継承する新しいクラスを作成します。

import Foundation
import MessageUI

class MessageComposer: NSObject, MFMessageComposeViewControllerDelegate {
    // A wrapper function to indicate whether or not a text message can be sent from the user's device
    func canSendText() -> Bool {
        return MFMessageComposeViewController.canSendText()
    }

    // Configures and returns a MFMessageComposeViewController instance
    func configuredMessageComposeViewController(textMessageRecipients:[String] ,textBody body:String) -> MFMessageComposeViewController {
        let messageComposeVC = MFMessageComposeViewController()
        messageComposeVC.messageComposeDelegate = self  //  Make sure to set this property to self, so that the controller can be dismissed!
        messageComposeVC.recipients = textMessageRecipients
        messageComposeVC.body = body
        return messageComposeVC
    }

    // MFMessageComposeViewControllerDelegate callback - dismisses the view controller when the user is finished with it
    func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
        controller.dismissViewControllerAnimated(true, completion: nil)
        }
}

2)このクラスの使用方法:

func openMessageComposerHelper(sender:AnyObject ,withIndexPath indexPath: NSIndexPath) {
    var recipients = [String]()

    //modify your recipients here

    if (messageComposer.canSendText()) {
        println("can send text")
        // Obtain a configured MFMessageComposeViewController
        let body = Utility.createInvitationMessageText()

        let messageComposeVC = messageComposer.configuredMessageComposeViewController(recipients, textBody: body)

        // Present the configured MFMessageComposeViewController instance
        // Note that the dismissal of the VC will be handled by the messageComposer instance,
        // since it implements the appropriate delegate call-back
        presentViewController(messageComposeVC, animated: true, completion: nil)
    } else {
        // Let the user know if his/her device isn't able to send text messages
        self.displayAlerViewWithTitle("Cannot Send Text Message", andMessage: "Your device is not able to send text messages.")
    }
}

3

iOS 4には、アプリケーションからの本文とレシピエントを含むメッセージの送信をサポートするクラスがあります。メールの送信と同じように機能します。ドキュメントはここにあります:リンクテキスト


3
- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    UIImage *ui =resultimg.image;
    pasteboard.image = ui;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}

4
パラメータはどの程度役に立ちますか?
martinsurleweb 2015年

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@ "sms:"]];
Amr Angry

3

//名前と番号でメソッドを呼び出す。

-(void)openMessageViewWithName:(NSString*)contactName withPhone:(NSString *)phone{

CTTelephonyNetworkInfo *networkInfo=[[CTTelephonyNetworkInfo alloc]init];

CTCarrier *carrier=networkInfo.subscriberCellularProvider;

NSString *Countrycode = carrier.isoCountryCode;

if ([Countrycode length]>0)     //Check If Sim Inserted
{

    [self sendSMS:msg recipientList:[NSMutableArray arrayWithObject:phone]];
}
else
{

    [AlertHelper showAlert:@"Message" withMessage:@"No sim card inserted"];
}

}

//メッセージを送信する方法

- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSMutableArray *)recipients{  
 MFMessageComposeViewController *controller1 = [[MFMessageComposeViewController alloc] init] ;
 controller1 = [[MFMessageComposeViewController alloc] init] ;
 if([MFMessageComposeViewController canSendText])
{
    controller1.body = bodyOfMessage;
    controller1.recipients = recipients;
    controller1.messageComposeDelegate = self;
    [self presentViewController:controller1 animated:YES completion:Nil];
 }
}

2

必要に応じて、クラスCoreTelephonyを呼び出したプライベートフレームワークを使用できますCTMessageCenter。SMSを送信する方法はいくつかあります。


1
彼は、公式のSDKを使用してこれが可能かどうかを具体的に尋ねました。
クエンタミア

1
プライベートAPIに関する詳細情報を提供できますか?App Storeに公開する必要がないため、プライベートフレームワークを使用しても問題ありません。
Bagusflyer 2014年

1

これを使って:

- (void)showSMSPicker
{
    Class messageClass = (NSClassFromString(@"MFMessageComposeViewController"));

    if (messageClass != nil) {          
        // Check whether the current device is configured for sending SMS messages
        if ([messageClass canSendText]) {
           [self displaySMSComposerSheet];
        }   
    }
}

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{       
    //feedbackMsg.hidden = NO;
    // Notifies users about errors associated with the interface
    switch (result)
    {
        case MessageComposeResultCancelled:
        {   
            UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending canceled!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert1 show];
            [alert1 release];
        }   

        // feedbackMsg.text = @"Result: SMS sending canceled";
        break;

        case MessageComposeResultSent:
        {
            UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert2 show];
            [alert2 release];
        }   

        // feedbackMsg.text = @"Result: SMS sent";
        break;

        case MessageComposeResultFailed:
        {   
            UIAlertView *alert3 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending failed!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert3 show];
            [alert3 release];
        }   

        // feedbackMsg.text = @"Result: SMS sending failed";
        break;

        default:
        {   
            UIAlertView *alert4 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS not sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert4 show];
            [alert4 release];
        }   

        // feedbackMsg.text = @"Result: SMS not sent";
        break;
    }

    [self dismissModalViewControllerAnimated: YES];
}

1
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

これは、それを行うための最良の短い方法です。


1

SMSを送信できるMFMessageComposeViewControllerを提示できますが、ユーザープロンプトを使用できます(送信ボタンをタップします)。ユーザーの許可なしにそれを行う方法はありません。iOS 11では、受信メッセージのフィルターのような拡張機能を作成して、iOSにスパムかどうかを通知できます。SMSでこれ以上何もできない


新鮮な答え!
Fattie 2018年

0

MFMessageComposeViewControllerを使用する必要があります独自のアプリでのメッセージの作成と送信を表示する場合ます。

それ以外の場合は、sharedApplicationメソッドを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.