在越狱设备上以编程方式发送短信

时间:2013-04-08 06:22:56

标签: ios objective-c sms jailbreak

我正在使用iOS 6 iphone 4S,我希望能够发送未被注意的短信。 因此,在这种情况下使用标准视图控制器将不起作用。 我尝试使用

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

但它不发送任何内容并返回NO。我使用nil作为arg2。

有人可以建议在iOS 6上进行此操作吗?(对于越狱设备)

2 个答案:

答案 0 :(得分:15)

找出自iOS 6以来- (BOOL)sendSMSWithText:(id)arg1 serviceCenter:(id)arg2 toAddress:(id)arg3;无效的原因。

此API受权利com.apple.CommCenter.Messages-send保护。只需将此权利设置为true即可签署您的应用。它比我的另一个答案(XPC方法)要好得多,原因有两个:

  1. sendSMSWithText告诉您邮件已成功发送
  2. 使用sendSMSWithText发送的邮件未保存在SMS数据库中,无法在任何地方看到。另一方面,使用XPC方法发送的消息正保存在SMS数据库中,可以在消息应用程序中看到。
  3. 所以,赢了。我强烈建议删除XPC方法,因为它使用的是非常低级别的API,可以在新的iOS版本中轻松更改。即使在iOS 7中也可以找到sendSMSWithText,我认为它不会很快被删除。

    <强>更新

    要在iOS 7及更高版本上使用此API,您需要添加另一个权限,并将bool值设置为true - com.apple.coretelephony.Identity.get

答案 1 :(得分:5)

直接来自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包含序列化的属性列表,其中包含您要向其发送短信的电话号码数组 - 12212只是电话号码的示例。而不是SMS text您应该放置实际的SMS文本。不幸的是,我找不到检查SMS是否成功发送的方法。

要使用此代码发送消息,您的应用程序权利应具有com.apple.messages.composeclient键,其布尔值设置为true。否则你会在控制台中收到错误,说应用程序缺少权利。