546 Stimmen

Wie kann man programmgesteuert SMS auf dem iPhone versenden?

Weiß jemand, ob und wie es möglich ist, programmgesteuert eine SMS von der iPhone , mit dem offiziellen SDK / Cocoa Touch?

418voto

Adam Davis Punkte 89506

Beschränkungen

Wenn man eine SMS innerhalb eines Programms auf dem iPhone versenden kann, kann man Spiele schreiben, die im Hintergrund Spam versenden. Ich bin mir sicher, dass du wirklich gerne Spams von deinen Freunden hättest: "Probier dieses neue Spiel aus! Es roxxert meine Boxxer, und deine werden es auch sein! roxxersboxxers.com!!!! Wenn du dich jetzt anmeldest, bekommst du 3.200 RB-Punkte!!!"

Apple hat Einschränkungen für automatisierte (oder sogar teilweise automatisierte) SMS- und Wählvorgänge. (Stellen Sie sich vor, das Spiel würde stattdessen zu einer bestimmten Tageszeit den Notruf wählen)

Am besten richten Sie einen Zwischenserver im Internet ein, der einen Online-SMS-Versanddienst nutzt, und senden die SMS über diesen Weg, wenn Sie eine vollständige Automatisierung wünschen. (d. h., Ihr Programm auf dem iPhone sendet ein UDP-Paket an Ihren Server, der die eigentliche SMS sendet)

iOS 4 Aktualisierung

iOS 4 bietet nun jedoch eine viewController die Sie in Ihre Anwendung importieren können. Sie füllen die SMS-Felder aus und der Benutzer kann dann den SMS-Versand innerhalb des Controllers initiieren. Im Gegensatz zur Verwendung des "SMS:..."-URL-Formats kann Ihre Anwendung geöffnet bleiben, und Sie können sowohl die zu und die Körper Felder. Sie können sogar mehrere Empfänger angeben.

Dadurch wird verhindert, dass Anwendungen automatisierte SMS versenden, ohne dass der Nutzer dies ausdrücklich bemerkt. Es ist immer noch nicht möglich, vollautomatische SMS vom iPhone selbst zu versenden, dazu ist eine gewisse Benutzerinteraktion erforderlich. Aber so können Sie wenigstens alles ausfüllen und vermeiden, dass die Anwendung geschlossen wird.

El MFMessageComposeViewController Klasse ist gut dokumentiert, und Tutorials zeigen, wie einfach es zu implementieren ist.

iOS 5 Aktualisierung

iOS 5 umfasst Messaging für iPod touch- und iPad-Geräte. Obwohl ich dies noch nicht selbst getestet habe, kann es sein, dass alle iOS-Geräte in der Lage sein werden, SMS über MFMessageComposeViewController zu senden. Wenn dies der Fall ist, dann betreibt Apple einen SMS-Server, der Nachrichten im Namen von Geräten sendet, die kein Mobilfunkmodem haben.

iOS 6 Update

Keine Änderungen in dieser Klasse.

iOS 7 Aktualisierung

Sie können nun prüfen, ob das von Ihnen verwendete Nachrichtenmedium einen Betreff oder Anhänge akzeptiert und welche Art von Anhängen es akzeptiert. Sie können den Betreff bearbeiten und Anhänge zur Nachricht hinzufügen, sofern das Medium dies zulässt.

iOS 8 Update

Keine Änderungen in dieser Klasse.

iOS 9 Aktualisierung

Keine Änderungen in dieser Klasse.

iOS 10 Update

Keine Änderungen in dieser Klasse.

iOS 11 Update

Keine wesentlichen Änderungen in dieser Klasse

Einschränkungen für diese Klasse

Denken Sie daran, dass dies nicht auf Handys ohne iOS 4 funktioniert, und auch nicht auf dem iPod touch oder dem iPad, außer vielleicht unter iOS 5. Sie müssen entweder das Gerät und die iOS-Einschränkungen erkennen, bevor Sie diesen Controller verwenden, oder Sie riskieren, dass Ihre App auf kürzlich aktualisierte iPhones der Typen 3G, 3GS und 4 beschränkt ist.

Ein Zwischenserver, der SMS sendet, ermöglicht es jedoch allen iOS-Geräten, SMS zu senden, solange sie einen Internetzugang haben, und kann daher für viele Anwendungen die bessere Lösung sein. Alternativ können Sie auch beides verwenden und nur dann auf einen Online-SMS-Dienst zurückgreifen, wenn das Gerät diesen nicht unterstützt.

146voto

Daniel Amitay Punkte 6667

Hier ist eine Anleitung, die genau das tut, wonach Sie suchen: die MFMessageComposeViewController .

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

Im Wesentlichen:

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];
}

Und ein Link zu den Dokumenten.

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

100voto

Najeebullah Shah Punkte 4154
  1. Sie müssen das MessageUI.framework zu Ihrem Xcode-Projekt hinzufügen
  2. Fügen Sie eine #import <MessageUI/MessageUI.h> in Ihrer Header-Datei
  3. Fügen Sie diese Delegierten zu Ihrer Header-Datei hinzu MFMessageComposeViewControllerDelegate & UINavigationControllerDelegate
  4. In Ihrem IBAction Methode deklarieren Instanz von MFMessageComposeViewController sagen messageInstance
  5. Um zu überprüfen, ob Ihr Gerät Text senden kann, verwenden Sie [MFMessageComposeViewController canSendText] in einer Wenn-Bedingung, wird Ja/Nein zurückgegeben
  6. In der if Bedingung dies tun:

    1. Erster Satz Körper für Ihr messageInstance als:

      messageInstance.body = @"Hello from Shah";
    2. Bestimmen Sie dann die Empfänger für die Nachricht als:

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
    3. Setzen Sie einen Delegaten auf Ihre messageInstance als:

      messageInstance.messageComposeDelegate = self;
    4. In der letzten Zeile tun Sie dies:

      [self presentModalViewController:messageInstance animated:YES];

49voto

millenomi Punkte 6561

Sie können eine sms:[target phone number] URL, um die SMS-Anwendung zu öffnen, aber es gibt keine Hinweise darauf, wie eine SMS mit Text vorausgefüllt werden kann.

25voto

isox Punkte 539

Eines der Systeme für die Kommunikation zwischen Prozessen in MacOS ist XPC. Diese Systemschicht wurde für die prozessübergreifende Kommunikation auf der Grundlage der Übertragung von Plist-Strukturen unter Verwendung von libSystem und launchd entwickelt. Es handelt sich dabei um eine Schnittstelle, die die Verwaltung von Prozessen über den Austausch von Strukturen wie z.B. Dictionaries ermöglicht. Aufgrund der Vererbung verfügt auch iOS 5 über diesen Mechanismus.

Vielleicht verstehen Sie schon, was ich mit dieser Einleitung meine. Ja, es gibt Systemdienste in iOS, die Werkzeuge für die XPC-Kommunikation enthalten. Und ich möchte die Arbeit an einem Daemon für den SMS-Versand veranschaulichen. Es sollte jedoch erwähnt werden, dass diese Fähigkeit in iOS 6 behoben ist, aber für iOS 5.0-5.1.1 relevant ist. Jailbreak, Private Framework und andere illegale Tools sind für die Ausnutzung dieser Fähigkeit nicht erforderlich. Es werden lediglich die Header-Dateien aus dem Verzeichnis /usr/include/xpc/* benötigt.

Eines der Elemente für den SMS-Versand in iOS ist der Systemdienst com.apple.chatkit, zu dessen Aufgaben die Erstellung, Verwaltung und der Versand von Kurznachrichten gehören. Zur einfachen Steuerung verfügt er über den öffentlich verfügbaren Kommunikationsport com.apple.chatkit.clientcomposeserver.xpc. Mit dem XPC-Subsystem können Sie Nachrichten ohne die Zustimmung des Benutzers erstellen und versenden.

Lassen Sie uns versuchen, eine Verbindung herzustellen.

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);

Jetzt haben wir die XPC-Verbindung myConnection auf den Dienst des SMS-Versands eingestellt. Die XPC-Konfiguration sieht jedoch vor, dass suspendierte Verbindungen erstellt werden können - wir müssen einen weiteren Schritt für die Aktivierung unternehmen.

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);

Die Verbindung wird aktiviert. Genau in diesem Moment zeigt iOS 6 im Telefonprotokoll eine Meldung an, dass diese Art der Kommunikation verboten ist. Nun müssen wir ein Wörterbuch ähnlich dem xpc_dictionary mit den für den Nachrichtenversand erforderlichen Daten erstellen.

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!");

Bleibt nur noch, die Nachricht an den XPC-Port zu senden und sicherzustellen, dass sie zugestellt wird.

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

Das war's schon. SMS gesendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X