我知道在真正的应用程序中不允许这样做,有利于用户的隐私和安全.但是出于纯粹的学术目的,我试图发送消息而不像这样呈现MessageComposer UI.
MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];

if([MFMessageComposeViewController canSendText]) {
    picker.recipients = [NSArray arrayWithObject:@"1234"];
    picker.body = @"Hello";
    [picker performSelector:@selector(smsComposeControllerSendStarted:) withObject:[UIButton buttonWithType:UIButtonTypeCustom]];
}

结果没有任何结果.甚至在控制台上都没有失败异常.我都没有在短信应用上看到消息.我发送邮件的人也没有得到它.

可以在这里找到iMars和MFMessageComposeViewController方法的列表.

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MessageUI.framework/MFMessageComposeViewController.h

我写了一个快速代码来验证这些是否是MFMessageComposeViewController中实际存在的项目.

uint varCount = 0;
Class cls= [MFMessageComposeViewController class];
Ivar *vars =  class_copyIvarList(cls,&varCount);

for (uint i = 0; i < varCount; i++) {
   Ivar var = vars[i];
   const char* name = ivar_getName(var);
   const char* typeEncoding = ivar_getTypeEncoding(var);
   printf("iVar%i------------> %s\n",i+1,name);
}    
free(vars);

Method *imps = class_copyMethodList(cls,&varCount);
for (uint i = 0; i < varCount; i++) {
    SEL sel = method_getName(imps[i]);        
    printf("Method%i------------> %s\n",[(NsstringFromSelector(sel)) UTF8String]);
}

它产生以下输出:

iVar1------------> _messageComposeDelegate
iVar2------------> _recipients
iVar3------------> _body
iVar4------------> _subject
iVar5------------> _mutableAttachmentURLs
iVar6------------> _currentAttachedVideoCount
iVar7------------> _currentAttachedAudioCount
iVar8------------> _currentAttachedImageCount
iVar9------------> _temporaryAttachmentURLs
iVar10------------> _attachments
Method1------------> disableuserAttachments
Method2------------> setCurrentAttachedVideoCount:
Method3------------> setCurrentAttachedAudioCount:
Method4------------> setCurrentAttachedImageCount:
Method5------------> _MIMETypeForURL:
Method6------------> _isVideoMIMEType:
Method7------------> _isAudioMIMEType:
Method8------------> _isImageMIMEType:
Method9------------> mutableAttachmentURLs
Method10------------> _contentTypeForMIMEType:
Method11------------> _updateAttachmentCountForAttachmentURL:
Method12------------> _buildAttachmentInfoForAttachmentURL:andAlternameFilename:
Method13------------> temporaryAttachmentURLs
Method14------------> canAddAttachmentURL:
Method15------------> addAttachmentData:withAlternateFilename:
Method16------------> _setCanEditRecipients:
Method17------------> messageComposeDelegate
Method18------------> setMutableAttachmentURLs:
Method19------------> currentAttachedVideoCount
Method20------------> currentAttachedAudioCount
Method21------------> currentAttachedImageCount
Method22------------> setTemporaryAttachmentURLs:
Method23------------> dealloc
Method24------------> viewWillAppear:
Method25------------> initWithNibName:bundle:
Method26------------> automaticallyForwardAppearanceAndRotationMethodstochildViewControllers
Method27------------> setModalPresentationStyle:
Method28------------> body
Method29------------> setSubject:
Method30------------> subject
Method31------------> setMessageComposeDelegate:
Method32------------> setBody:
Method33------------> addAttachmentURL:withAlternateFilename:
Method34------------> addAttachmentData:typeIdentifier:filename:
Method35------------> attachmentURLs
Method36------------> attachments
Method37------------> recipients
Method38------------> smsComposeControllerCancelled:
Method39------------> smsComposeControllerSendStarted:
Method40------------> setRecipients:

在我看来,smsComposeControllerSendStarted:方法可能比启动消息发送的实际函数更多的是委托.在上面的方法列表中,没有一个方法签名看起来更接近sendMessage:或类似于实际发送消息的函数.

我的问题是:

1)所有真正的MFMessageComposeViewController都在幕后.或者它是否有一些无法通过运行时函数访问的类集群?

2)如何找出实际的messageSend方法及其实现的类?

任何想法将不胜感激.

谢谢.

解决方法

内部MFMessageComposeViewController使用CKSMSComposeController作为私人ChatKit.framework的实际UI,它使用一大堆其他类(CKSMSComposeQueuingRemoteViewControllerProxy,CKSMSComposeRemoteViewController,CKSMSComposeViewServiceController),包括xpc接口xpcProxy< CKSMSCompose>.

更新1

在阅读了quellish评论后我发现这个http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/看起来像MFMessageComposeViewController和类似的类为他们的目的启动另一个过程.这些进程是xpc服务,它们实现了应用程序与之通信的特定协议.这些流程使用所有必需的权利进行签名.可能/Applications/MessagesViewService.app/MessagesViewService实际上是发送短信的.这个二进制文件是用com.apple.messages.composeclient签名的,这是为了发送我在ChatKit.framework中找到的this代码所必需的.我认为有一种方法可以手动与该xpc服务进行通信以发送短信,但这将很困难.你不能用类转储和类似的简单工具来搞错,这些工具并没有给你太多的信息.

更新2

我已经成功了解了这一点.我扔掉了所有帮助程序类,所有UI内容都没有真正与xpc服务通信.剩下的就足以显示SMS视图控制器并将一些方法发送到xpc服务而不会有任何障碍.

当我们显示SMS组合UI时,iOS确实会启动/Applications/MessagesViewService.app/MessagesViewService进程.这是xpc服务.您可以尝试在应用程序显示时杀死它 – 您将获得黑屏,这意味着它是正确的.

CKSMSComposeRemoteViewController是显示SMS UI的视图控制器.它是_UIRemoteViewController类的子类.基本上,它管理我们的应用程序与在其他进程中在xpc服务中运行的实际UI之间的连接.这是我如何在我的 – (void)viewDidLoad方法中获取它的实例

_UIAsyncInvocation* cancelationInvocation = 
[CKSMSComposeRemoveViewController requestViewController:@"CKSMSComposeViewServiceController"
                        fromServiceWithBundleIdentifier:@"com.apple.mobilesms.compose"
                        connectionHandler:
^(CKSMSComposeRemoteViewController* obj,NSError* error){
    smsViewController = obj;
    [smsViewController setDelegate:self];

    smsViewControllerProxy = [smsViewController serviceViewControllerProxy];
}];

smsViewController是一个远程视图控制器实例. smsViewControllerProxy是xpcProxy< CKSMSCompose>实现CKSMSComposeViewServiceProtocol协议的实例 – 方法调用将被转发到xpc服务. xpcProxy并没有真正实现这些方法.它实现了forwardInvocation:方法,以便将调用转发到xpc连接.

_UIAsyncInvocation,查看ivar名称cancelationInvocation,用于取消xpc消息.它仅在CKSMSComposeController viewServiceDidTerminateWithError:方法中调用.

以下是我显示控制器的方法:

[self presentViewController:smsViewController animated:YES completion:NULL];

您可能注意到[smsViewController setDelegate:self].委托必须实现CKSMSComposeRemoteViewControllerDelegate协议或应用程序将崩溃异常(无法识别的选择器).这是我实施的:

-(void)smsComposeControllerAppeared
{
}

-(void)smsComposeControllerCancelled
{
}

-(void)smsComposeControllerDataInserted
{
}

这足以让你走了.

以下是我们如何向远程视图控制器发送消息:

[smsViewControllerProxy insertTextPart:@"Some text"];

这会将文本插入SMS文本字段并调用smsComposeControllerDataInserted委托方法.

考虑到所有这些,我不再认为我们可以在没有UI的情况下发送短信.实际UI正在另一个进程中运行,我们对它没有任何控制权.我们可以设置一些字段,但就是这样.我希望有一种方法,但事实是,难怪我们做不到.在iOS 6中引入了远程视图来解决这个确切的安全问题 – 在iOS 5上,有一种方法可以在没有用户许可的情况下发送SMS,而一些AppStore应用就是这样做的.所以对Apple赞不绝口.

更新3

我设法在我们与SMS UI交互时转储正在发送的xpc消息.关于日志格式的几句话.第一行 – 拦截消息的地方.它是函数名称或Incoming事件,这意味着它是来自服务的传入消息.连接名称只是xpc连接名称.消息是xpc消息字典内容.消息数据 – 一些xpc消息包含“d” – >“r”键的二进制数据.它是一个序列化的二进制属性列表,无法使用nspropertyListSerialization反序列化 – 它采用了一些新的格式.相反,你需要使用来自Foundation.framework的NSxpcDecoder – (id)_initWithRootxpcObject:(xpc_object_t).现在转储:

SMS UI正在呈现http://pastebin.com/NVEpujSh

按下“发送”按钮后的SMS UI http://pastebin.com/BYXd2djF

编辑SMS字段时会发送和接收消息,但它们仅对应于UI事件.例如,谁成为第一响应者,那些并不能真正说明SMS UI中发生了什么的东西.

ios – 黑客入侵MFMessageComposeViewController的更多相关文章

  1. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  4. HTML5中的Web Notification桌面通知功能的实现方法

    这篇文章主要介绍了HTML5中的Web Notification桌面通知功能的实现方法,需要的朋友可以参考下

  5. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  8. xcode找不到匹配的配置文件

    我有一个AdhociOS应用程序,它给了我“在xcode6中找不到匹配的配置文件”,我创建了一个Adhoc配置文件,下载它,双击它并在General–Identity下选择了一个团队.但我接着得到了那条消息,并尝试使用“修复问题”按钮没有帮助.在构建设置–供应配置文件–发布我有“自动”.任何人都可以帮助我,我完全迷失了……

  9. ios – Reactive Cocoa – 以编程方式设置文本时不会调用UITextView的rac_textSignal

    我正在实现一个聊天UI,并使用ReactiveCocoa根据用户的类型调整聊天气泡的大小.目前,我正在基于textview的rac_textSignal更新UI的布局.一切都很好–除了一点:当用户发送消息时,我以编程方式清除文本字段:…我是否需要拥有一个持有currentTypedString的Nsstring,并在该字符串更新时驱动UI更改?

  10. ios – 当我关闭应用程序时,我从调试器获得消息:由于信号15而终止

    我怎么能解决这个问题,我不知道这个链接MypreviousproblemaboutCoredata对我的问题有影响吗?当我cmd应用程序的Q时,将出现此消息.Messagefromdebugger:Terminatedduetosignal15如果谁知道我以前的问题的解决方案,请告诉我.解决方法>来自调试器的消息:每当用户通过CMD-Q(退出)或STOP手动终止应用程序(无论是在iOS模拟器中还是

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部