Отправить программно 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. В противном случае вы получите ошибку в консоли, заявив, что приложение не имеет права.