Отправить программно SMS на устройстве джейлбрейка

Я использую iOS 6 iphone 4S, и я хочу иметь возможность отправлять незаметные sms-сообщения. Поэтому использование стандартного контроллера представления не будет работать в этом случае. Я попытался использовать

- (BOOL)sendSMSWithText:(id)arg1 serviceCenter:(id)arg2 toAddress:(id)arg3;

но он ничего не отправляет и возвращает NO. Я использовал nil для arg2.

Может кто-нибудь предложить способ сделать это на iOS 6? (для джейлбрейк-устройств)

Ответ 1

Узнал, почему - (BOOL)sendSMSWithText:(id)arg1 serviceCenter:(id)arg2 toAddress:(id)arg3; не работает с iOS 6.

Этот API защищен правом com.apple.CommCenter.Messages-send. Просто подпишите свое приложение с этим правом, установленным в true. Это намного лучше, чем мой другой ответ здесь (метод XPC) из-за двух основных причин:

  • sendSMSWithText сообщает, что сообщение отправлено успешно
  • Сообщения, отправленные с помощью sendSMSWithText, не сохраняются в базе данных SMS и нигде не видны. С другой стороны, сообщения, отправленные с использованием метода XPC, сохраняются в базе данных SMS и видны в приложении "Сообщения".

Итак, выиграй. Я настоятельно рекомендую отказаться от XPC-метода также потому, что он использует довольно низкий уровень API, который может легко измениться в новой версии iOS. sendSMSWithText можно найти даже в iOS 7, и я не думаю, что он скоро будет удален.

UPDATE

Чтобы использовать этот API для iOS 7 и выше, вам нужно добавить другое право с значением bool, установленным в true - com.apple.coretelephony.Identity.get.

Ответ 2

Прямо из ChatKit.framework

dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc_connection_queue", DISPATCH_QUEUE_SERIAL);
xpc_connection_t connection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, 0);
xpc_connection_set_event_handler(connection, ^(xpc_object_t){});
xpc_connection_resume(connection);
dispatch_release(queue);

xpc_object_t dictionary = xpc_dictionary_create(0, 0, 0);
xpc_dictionary_set_int64(dictionary, "message-type", 0);
NSData* recipients = [NSPropertyListSerialization dataWithPropertyList:[NSArray arrayWithObject:@"12212"] format:NSPropertyListBinaryFormat_v1_0 options:0 error:NULL];
xpc_dictionary_set_data(dictionary, "recipients", recipients.bytes, recipients.length);
xpc_dictionary_set_string(dictionary, "markup", "SMS text");

xpc_connection_send_message(connection, dictionary);
xpc_release(dictionary);

recipients содержит сериализованный список свойств с массивом телефонных номеров, на которые вы хотите отправить свое SMS-сообщение - 12212 - это всего лишь пример номера телефона. Вместо SMS text вы должны поместить фактический текст SMS. К сожалению, я не смог найти способ проверить, успешно ли отправлено SMS.

Чтобы отправить сообщение с использованием этого кода, ваши права на приложение должны иметь ключ com.apple.messages.composeclient с логическим значением, установленным в true. В противном случае вы получите ошибку в консоли, заявив, что приложение не имеет права.