公式SDK / Cocoa Touchを使用して、からプログラムでSMSを送信することが可能かどうか、またその方法を知っている人はいますか?iPhone
18 に答える
制限
iPhone のプログラム内で SMS を送信できれば、バックグラウンドで人々にスパムを送信するゲームを作成できます。「この新しいゲームを試してみてください! これで私のボクサーがロクサーになり、あなたのボクサーもそうなるでしょう! 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 のない携帯電話では機能せず、おそらく iOS 5 を除いて、iPod touch や iPad でも機能しないことに注意してください。これを使用する前に、デバイスと iOS の制限を検出する必要があります。または、最近アップグレードされた 3G、3GS、および 4 つの iPhone にアプリを制限するリスクがあります。
ただし、SMS を送信する中間サーバーは、インターネットにアクセスできる限り、これらのすべての iOS デバイスが SMS を送信できるようにするため、多くのアプリケーションにとっては、依然としてより優れたソリューションとなる可能性があります。または、両方を使用し、デバイスがサポートしていない場合にのみオンライン SMS サービスにフォールバックします。
これがあなたが探していることを正確に行うチュートリアルです: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
- MessageUI.framework を Xcode プロジェクトに追加する必要があります
#import <MessageUI/MessageUI.h>
ヘッダー ファイルに を含めます- これらのデリゲートをヘッダー ファイルに追加してください
MFMessageComposeViewControllerDelegate
&UINavigationControllerDelegate
- あなたのメソッドで言う
IBAction
のインスタンスを宣言しますMFMessageComposeViewController
messageInstance
- お使いのデバイスが if 条件で使用するテキストを送信できるかどうかを確認する
[MFMessageComposeViewController canSendText]
には、Yes/No を返します。 条件でこれらを実行し
if
ます。あなたの最初のボディを次のように設定します
messageInstance
:messageInstance.body = @"Hello from Shah";
次に、メッセージの受信者を次のように決定します。
messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil];
次のように messageInstance にデリゲートを設定します。
messageInstance.messageComposeDelegate = self;
最後の行で次のようにします。
[self presentModalViewController:messageInstance animated:YES];
URLを使用しsms:[target phone number]
てSMSアプリケーションを開くことはできますが、SMS本文にテキストを事前に入力する方法についての指示はありません。
MacOS のプロセス間通信システムの 1 つに XPC があります。このシステム層は、libSystem と launchd を使用した plist 構造の転送に基づくプロセス間通信用に開発されました。実際、辞書などの構造体の交換を介してプロセスを管理できるインターフェイスです。遺伝により、iOS 5 もこのメカニズムを備えています。
この紹介で私が何を意味するかは、すでにお分かりかもしれません。はい、XPC 通信用のツールを含む iOS のシステム サービスがあります。そして、SMS 送信用のデーモンを使用した作業を例示したいと思います。ただし、この機能は iOS 6 で修正されていますが、iOS 5.0 ~ 5.1.1 に関連することに注意してください。Jailbreak、Private Framework、およびその他の違法なツールは、その悪用には必要ありません。ディレクトリ /usr/include/xpc/* からの一連のヘッダー ファイルのみが必要です。
iOS で SMS を送信するための要素の 1 つは、システム サービス com.apple.chatkit です。このサービスのタスクには、短いテキスト メッセージの生成、管理、および送信が含まれます。制御を容易にするために、公開されている通信ポート com.apple.chatkit.clientcomposeserver.xpc を備えています。XPC サブシステムを使用すると、ユーザーの承認なしにメッセージを生成して送信できます。</p>
さて、接続を作成してみましょう。
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 を送信しました。
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];
}
この手順に従ってください
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];
}
ランアンドゴー!
//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];
}
iOS 4 には、アプリケーションからの本文と受信者を含むメッセージの送信をサポートするクラスがあります。メールの送信と同じように機能します。ここでドキュメントを見つけることができます:リンクテキスト
必要に応じて、クラスCoreTelephony
を呼び出したプライベート フレームワークを使用できます。CTMessageCenter
SMSの送信方法はいくつかあります。
これを使って:
- (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];
}
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]]
これが最善かつ最短の方法です。
You can present MFMessageComposeViewController, which can send SMS, but with user prompt(he taps send button). No way to do that without user permission. On iOS 11, you can make extension, that can be like filter for incoming messages , telling iOS either its spam or not. Nothing more with SMS cannot be done
独自のアプリでメッセージの作成と送信を表示する場合は、 MFMessageComposeViewControllerを使用する必要があります。
それ以外の場合は、sharedApplicationメソッドを使用できます。