• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 10:26:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

首先 - 我知道私有(private)框架/API 不会让我进入 AppStore,这仅供私有(private)使用/研究。

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

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

我尝试的 first 方法是能够调用它:

    CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
    NSLog(@"GOT SMS: %@", msg.text);

我无法使用这些解决方案的任何组合对其进行编译:

  • 只需将 CKDBMessage.h 添加到我的项目中
  • 添加ChatKit.framework
  • 的所有header
  • 同时添加 ChatKit.framework 文件本身

我在 Headers 文件夹中有标题和框架文件,我尝试在递归/非递归上添加任何/所有这些build设置:

  • 框架搜索路径 -> $(PROJECT_DIR)/Headers
  • 标题搜索路径 ->
    • $(SRCROOT)/Headers/ChatKit.framework/Headers
    • $(SRCROOT)/Headers
  • 用户标题搜索路径 ->
    • $(SRCROOT)/Headers
    • $(SRCROOT)/Headers/ChatKit.framework/Headers

始终搜索用户路径始终为"is"

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

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 performSelectorselector(text)];

NSLog(@"text: %@", text);

这里我在 invocationWithMethodSignature: 处崩溃,因为 NSClassFromString 返回 nil 而不是类...

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

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



Best Answer-推荐答案


好吧,没有多少人看过这个,但是为了我们的 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 来获取消息内容...

关于ios - 导入 ChatKit(即私有(private)框架)或以某种方式使用 CKDBMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151710/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap