¿Alguien sabe si es posible y cómo, mediante programación, enviar un SMS desde iPhone
, con el SDK / Cocoa Touch oficial?
fuente
¿Alguien sabe si es posible y cómo, mediante programación, enviar un SMS desde iPhone
, con el SDK / Cocoa Touch oficial?
Si pudieras enviar un SMS dentro de un programa en el iPhone, podrás escribir juegos que envíen spam a las personas en segundo plano. Estoy seguro de que realmente quieres recibir spam de tus amigos: "¡Prueba este nuevo juego! Roxxers mis boxxers, ¡y el tuyo también! Roxxersboxxers.com !!!! Si te registras ahora obtendrás 3.200 RB ¡¡puntos!!"
Apple tiene restricciones para las operaciones automáticas (o incluso parcialmente automatizadas) de SMS y marcado. (Imagínese si el juego marcó 911 en un momento determinado del día)
Su mejor opción es configurar un servidor intermedio en Internet que utilice un servicio de envío de SMS en línea y enviar el SMS a través de esa ruta si necesita una automatización completa. (es decir, su programa en el iPhone envía un paquete UDP a su servidor, que envía el SMS real)
iOS 4, sin embargo, ahora proporciona una viewController
que puede importar a su aplicación. Usted rellena previamente los campos de SMS, luego el usuario puede iniciar el envío de SMS dentro del controlador. A diferencia con el "SMS: ..." formato de URL, lo que permite su aplicación a permanecer abierto, y permite rellenar tanto la a y la carrocería campos. Incluso puede especificar múltiples destinatarios.
Esto evita que las aplicaciones envíen SMS automáticos sin que el usuario lo sepa explícitamente. Aún no puede enviar SMS totalmente automatizados desde el iPhone mismo, requiere cierta interacción del usuario. Pero esto al menos le permite llenar todo y evita cerrar la aplicación.
La clase MFMessageComposeViewController está bien documentada y los tutoriales muestran lo fácil que es implementarla.
iOS 5 incluye mensajes para dispositivos iPod touch y iPad, por lo que aunque todavía no lo he probado, es posible que todos los dispositivos iOS puedan enviar SMS a través de MFMessageComposeViewController. Si este es el caso, Apple está ejecutando un servidor de SMS que envía mensajes en nombre de los dispositivos que no tienen un módem celular.
No hay cambios en esta clase.
Ahora puede verificar si el medio de mensaje que está utilizando aceptará un asunto o archivos adjuntos, y qué tipo de archivos adjuntos aceptará. Puede editar el asunto y agregar archivos adjuntos al mensaje, donde el medio lo permita.
No hay cambios en esta clase.
No hay cambios en esta clase.
No hay cambios en esta clase.
No hay cambios significativos en esta clase.
Tenga en cuenta que esto no funcionará en teléfonos sin iOS 4, y no funcionará en el iPod touch o iPad, excepto, tal vez, en iOS 5. Debe detectar el dispositivo y las limitaciones de iOS antes de usar esto controlador, o corre el riesgo de restringir su aplicación a 3G, 3GS y 4 iPhones recientemente actualizados.
Sin embargo, un servidor intermedio que envía SMS permitirá que todos y cada uno de estos dispositivos iOS envíen SMS siempre que tengan acceso a Internet, por lo que aún puede ser una mejor solución para muchas aplicaciones. Alternativamente, use ambos, y solo recurra a un servicio de SMS en línea cuando el dispositivo no lo admita.
Aquí hay un tutorial que hace exactamente lo que está buscando: el MFMessageComposeViewController
.
http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/
Esencialmente:
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];
}
Y un enlace a los documentos.
https://developer.apple.com/documentation/messageui/mfmessagecomposeviewcontroller
MFMessageComposeViewController *controller = ...
bloque if dentro. (el método de clase no necesita tener una instancia para hacer la prueba)
http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/
dice "502 Bad Gateway" en mi computadora portátil. Tal vez el enlace está roto.
#import <MessageUI/MessageUI.h>
en su archivo de encabezadoMFMessageComposeViewControllerDelegate
yUINavigationControllerDelegate
IBAction
método, declare la instancia de MFMessageComposeViewController
saymessageInstance
[MFMessageComposeViewController canSendText]
en una condición if, devolverá Sí / NoEn la if
condición de hacer esto:
Primero establezca el cuerpo para su messageInstance
como:
messageInstance.body = @"Hello from Shah";
Luego, decida los destinatarios del mensaje como:
messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil];
Establezca un delegado a su mensajeInstance como:
messageInstance.messageComposeDelegate = self;
En la última línea haz esto:
[self presentModalViewController:messageInstance animated:YES];
presentModalViewController:animated:
está en desuso; utilizar presentViewController:animated:completion:
en su lugar. Además, recuerde definir el método delegado - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
si desea conocer los resultados.
Puede usar una sms:[target phone number]
URL para abrir la aplicación de SMS, pero no hay indicaciones sobre cómo rellenar un cuerpo de SMS con texto.
Uno de los sistemas de comunicación entre procesos en MacOS es XPC. Esta capa del sistema se ha desarrollado para la comunicación entre procesos basada en la transferencia de estructuras plist mediante libSystem y launchd. De hecho, es una interfaz que permite gestionar procesos mediante el intercambio de estructuras tales como diccionarios. Debido a la herencia, iOS 5 también posee este mecanismo.
Es posible que ya entiendas lo que quiero decir con esta introducción. Sí, hay servicios de sistema en iOS que incluyen herramientas para la comunicación XPC. Y quiero ejemplificar el trabajo con un demonio para el envío de SMS. Sin embargo, debe mencionarse que esta capacidad se repara en iOS 6, pero es relevante para iOS 5.0—5.1.1. Jailbreak, Private Framework y otras herramientas ilegales no son necesarias para su explotación. Solo se necesita el conjunto de archivos de encabezado del directorio / usr / include / xpc / *.
Uno de los elementos para el envío de SMS en iOS es el servicio del sistema com.apple.chatkit, cuyas tareas incluyen la generación, gestión y envío de mensajes de texto cortos. Para facilitar el control, tiene el puerto de comunicación disponible públicamente com.apple.chatkit.clientcomposeserver.xpc. Usando el subsistema XPC, puede generar y enviar mensajes sin la aprobación del usuario.
Bueno, intentemos crear una conexión.
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);
Ahora tenemos la conexión XPC myConnection configurada para el servicio de envío de SMS. Sin embargo, la configuración de XPC proporciona la creación de conexiones suspendidas; debemos dar un paso más para la activación.
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);
La conexión está activada. Justo en este momento, iOS 6 mostrará un mensaje en el registro telefónico de que este tipo de comunicación está prohibida. Ahora necesitamos generar un diccionario similar a xpc_dictionary con los datos requeridos para el envío del mensaje.
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!");
Queda poco: envíe el mensaje al puerto XPC y asegúrese de que se entregue.
xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});
Eso es todo. SMS enviados
Agregue el MessageUI.Framework y use el siguiente código
#import <MessageUI/MessageUI.h>
Y entonces:
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];
}
y el método delegado
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
didFinishWithResult:(MessageComposeResult)result {
[self dismissViewControllerAnimated:YES completion:nil];
}
Puedes usar este enfoque:
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:MobileNumber"]]
iOS navegará automáticamente desde su aplicación a la página de redacción de mensajes de la aplicación de mensajes. Dado que el esquema de la URL comienza con sms :, esto se identifica como un tipo que la aplicación de mensajes reconoce y lo inicia.
//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];
}
Sigue estos procedimientos
1. Añadir MessageUI.Framework
al proyecto
2) Importar #import <MessageUI/MessageUI.h>
en archivo .h.
3) Copia este código para enviar el mensaje
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) Implemente el delegate
método si lo desea.
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
///your stuff here
[self dismissViewControllerAnimated:YES completion:nil];
}
Corre y vete!
[self dismissViewControllerAnimated:YES completion:nil];
en el interior messageComposeViewController: didFinishWithResult:
método de devolución de llamada. De lo contrario, simplemente colgará allí.
Aquí está la versión de código Swift para enviar SMS en iOS. Tenga en cuenta que solo funciona en dispositivos reales. Código probado en iOS 7+. Puedes leer más aquí .
1) Cree una nueva clase que herede MFMessageComposeViewControllerDelegate y 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) Cómo usar esta clase:
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.")
}
}
Hay una clase en iOS 4 que admite el envío de mensajes con cuerpo y recetas desde su aplicación. Funciona igual que enviar correo. Puede encontrar la documentación aquí: texto del enlace
- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
UIImage *ui =resultimg.image;
pasteboard.image = ui;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}
// llama al método con nombre y número.
-(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"];
}
}
// Método para enviar el mensaje
- (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];
}
}
Si lo desea, puede usar el marco privado CoreTelephony
que se llama CTMessageCenter
clase. Existen algunos métodos para enviar sms.
Utilizar este:
- (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"]]
Esta sería la mejor y corta forma de hacerlo.
Puede presentar MFMessageComposeViewController, que puede enviar SMS, pero con el aviso del usuario (toca el botón Enviar). No hay forma de hacerlo sin el permiso del usuario. En iOS 11, puede hacer una extensión, que puede ser como un filtro para los mensajes entrantes, diciéndole a iOS si es spam o no. No se puede hacer nada más con SMS
Debe usar MFMessageComposeViewController si desea mostrar la creación y el envío del mensaje en su propia aplicación.
De lo contrario, puede usar el método sharedApplication .
tools->script editor
y en una solicitud POST usarMailApp.sendEmail
api para enviar correos electrónicos a un número de teléfono. att's es YOURNUMBER@mms.att.net, tmobile's es YOURNUMBER@tmomail.net Creo (TODO GRATIS)