首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以某种方式导入ChatKit (即私有框架)或使用CKDBMessage

以某种方式导入ChatKit (即私有框架)或使用CKDBMessage
EN

Stack Overflow用户
提问于 2015-03-19 17:53:51
回答 2查看 2.3K关注 0票数 2

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

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

基本上,我需要在某种程度上插入一个CKDBMessage对象并从中获取内容。

我尝试过的第一种方法是能够调用以下方法:

代码语言:javascript
复制
    CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
    NSLog(@"GOT SMS: %@", msg.text);

我无法让它与这些解决方案的任何组合一起编译:

  • 只需将CKDBMessage.h添加到我的项目
  • 添加ChatKit.framework的所有标头
  • 还添加ChatKit.framework文件本身

我有Headers文件夹中的头文件和框架文件,我尝试在递归/非递归的情况下添加任何/所有这些构建设置:

  • 框架搜索路径-> $(PROJECT_DIR)/Headers
  • 头搜索路径->
    • $(SRCROOT)/Headers/ChatKit.framework/Headers
    • $(SRCROOT)/Headers

  • 用户头搜索路径->
    • $(SRCROOT)/Headers
    • $(SRCROOT)/Headers/ChatKit.framework/Headers

总是搜索用户路径总是在是的

我尝试的第二个是在运行时完成所有事情,这就是我所拥有的:

代码语言:javascript
复制
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);

这里我在invocationWithMethodSignature:上停留,因为NSClassFromString返回的是0而不是类..。

对这两种方法中的任何一种有什么想法?

这是用于非越狱的,iOS8(.2),使用Xcode6

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-22 06:43:10

好吧,没有多少人看过这个,但是为了我们的wiki社区,我通过将CKDBMessage.h文件添加到我的项目中(实际上我添加了ChatKit的所有头,但我不认为这是必要的)来解决这个问题,因为我像这样动态地用dlopen加载了框架:

代码语言:javascript
复制
dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY)

所以我的全部解决办法是:

代码语言:javascript
复制
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

代码语言:javascript
复制
//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获取消息内容..。

票数 4
EN

Stack Overflow用户

发布于 2019-04-24 05:40:04

目前,我正在使用XCode 10。这里我们可以在PrivateFrameworks路径中看到一个MessagesKit.frameworkMessagesKit.framework包含SOMessageHelper文件,在这里我们可以看到sendSMS函数。

职能:

代码语言:javascript
复制
(void)sendMessageText:(id)arg1 toRecipient:(id)arg2 withCompletionBlock:(CDUnknownBlockType)arg3;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29151710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档