Ios 导入聊天包(即私有框架)或以某种方式使用CKDBMessage

Ios 导入聊天包(即私有框架)或以某种方式使用CKDBMessage,ios,objective-c,iphone,xcode6,iphone-privateapi,Ios,Objective C,Iphone,Xcode6,Iphone Privateapi,首先,我知道私有框架/API不会让我进入AppStore,这只是供私人使用/研究 我无法使用ChatKit.framework编译我的项目 基本上,我需要以某种方式初始化一个CKDBMessage对象并从中获取内容 我尝试的第一种方法是能够将其称为: CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID]; NSLog(@"GOT SMS: %@", msg.text); 我无法用这些解决方案的任何组合编

首先,我知道私有框架/API不会让我进入AppStore,这只是供私人使用/研究

我无法使用
ChatKit.framework
编译我的项目

基本上,我需要以某种方式初始化一个
CKDBMessage
对象并从中获取内容

我尝试的第一种方法是能够将其称为:

    CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
    NSLog(@"GOT SMS: %@", msg.text);
我无法用这些解决方案的任何组合编译它:

  • 只需将
    CKDBMessage.h
    添加到我的项目中即可
  • 添加ChatKit.framework的所有标题
  • 还添加
    ChatKit.framework
    文件本身
我在
headers
文件夹中有头文件和框架文件,我尝试添加任何/所有这些构建设置,都是在递归/非递归上:

  • 框架搜索路径->
    $(项目目录)/标题
  • 标题搜索路径->
    • $(SRCROOT)/Headers/ChatKit.framework/Headers
    • $(SRCROOT)/Headers
  • 用户标题搜索路径->
    • $(SRCROOT)/Headers
    • $(SRCROOT)/Headers/ChatKit.framework/Headers
“始终搜索用户路径”始终处于“是”状态

我尝试的第二件事是在运行时做所有事情,这就是我所做的:

Class CKDBMessage = NSClassFromString(@"CKDBMessage");// objc_getClass("CKDBMessage");

SEL sel = @selector(initWithRecordID:);

NSMethodSignature *signature = [CKDBMessage methodSignatureForSelector:sel];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.selector = sel;
[invocation setArgument:&lastID atIndex:2];
[invocation invoke];

NSObject * msgWeak = [CKDBMessage alloc];
[invocation getReturnValue:&msgWeak];
NSObject *msg = msgWeak;

NSString *text = [msg performSelector:@selector(text)];

NSLog(@"text: %@", text);
在这里,我在调用MethodSignature:时崩溃,因为NSClassFromString返回nil而不是类

对这两种方法有什么想法吗


这是为了不越狱,iOS8(.2),使用Xcode6,没有多少人看到过这一点,但是为了我们的wiki社区,我设法解决了这个问题,将
CKDBMessage.h
文件添加到我的项目中(实际上我添加了
ChatKit
的所有标题,但我认为没有必要),然后我用
dlopen
动态加载框架,如下所示:

dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY)
因此,我的完整解决方案是:

dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY);

Class CKDBMessageClass = NSClassFromString(@"CKDBMessage");
CKDBMessage *msg = [[CKDBMessageClass alloc] initWithRecordID:lastID];

NSString *text = msg.text;
NSLog(@"text: %@", text);
获取最后一条消息的ID涉及另一个框架:
IMDPersistence

//SomeFile.h
// ...
//declare the function:
static int (*IMDMessageRecordGetMessagesSequenceNumber)();

// SomeFile.m
// ...
//open IMDPersistence framework
void *libHandleIMD = dlopen("/System/Library/PrivateFrameworks/IMDPersistence.framework/IMDPersistence", RTLD_LAZY);

//make/get symbol from framework + name
IMDMessageRecordGetMessagesSequenceNumber = (int (*)())dlsym(libHandleIMD, "IMDMessageRecordGetMessagesSequenceNumber");

// get id of last SMS from symbol
int lastID = IMDMessageRecordGetMessagesSequenceNumber();

现在您可以使用
lastID
获取消息内容…

目前,我使用的是XCode 10。在这里,我们可以在
privateframes
路径中看到一个
MessagesKit.framework
MessagesKit.framework
包含S
OMessageHelper
文件,我们可以在其中看到
sendSMS
函数

功能:

(void)sendMessageText:(id)arg1 toRecipient:(id)arg2 withCompletionBlock:(CDUnknownBlockType)arg3;

嗨,你能分享更多细节吗?dlopen,RTLD_LAZY显示错误。未声明的标识您必须包含#包含dlopen。在我这方面,我想知道你是从哪里得到lastID的?应该是
CKDBMessage*msg=…
Hey@AvielGross这在iOS 10及以下版本上非常有效。但在最新的iOS 11测试版上,我看到了这样一个:
数据库“:\uu xpcimdmessagesoresendxpcmessage失败
。你在那里试过吗?有没有办法让它在11号上工作?谢谢@简:我不得不承认,我很惊讶苹果一直到11岁才解决这个问题。。。我真的不再处理这个问题了,所以不幸的是,我不知道该怎么做。。。您可以查看iOS 11的类转储,查看消息传递的内容等。