11

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

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

但它不发送任何内容并返回 NO。我将 nil 用于 arg2。

有人可以建议一种在 iOS 6 上执行此操作的方法吗?(对于越狱设备)

4

2 回答 2

15

找出为什么- (BOOL)sendSMSWithText:(id)arg1 serviceCenter:(id)arg2 toAddress:(id)arg3;自 iOS 6 以来无法正常工作。

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

  1. sendSMSWithText告诉你消息是否发送成功
  2. 使用发送的消息sendSMSWithText没有保存在 SMS 数据库中,并且在任何地方都看不到。另一方面,使用 XPC 方法发送的消息被保存在 SMS 数据库中,并且可以在 Messages 应用程序中看到。

所以,双赢。我强烈建议放弃 XPC 方法,因为它使用了相当低级的 API,可以在新的 iOS 版本中轻松更改。sendSMSWithText甚至可以在 iOS 7 中找到,我认为它不会很快被删除。

更新

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

于 2013-12-06T14:06:39.283 回答
6

直接来自 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你应该把实际的短信文本。不幸的是,我找不到检查短信是否发送成功的方法。

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

于 2013-05-08T23:21:38.233 回答