首先 - 我知道私有框架/API 不会让我进入 AppStore,这仅供私人使用/研究。
我无法编译我的项目ChatKit.framework
.
基本上我需要以某种方式初始化CKDBMessage
对象并从中获取东西。
The first我尝试的方法是能够这样调用:
CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
NSLog(@"GOT SMS: %@", msg.text);
我无法使用这些解决方案的任何组合来编译它:
- 只需简单添加即可
CKDBMessage.h
到我的项目
- 添加所有标题
ChatKit.framework
- 还添加
ChatKit.framework
文件本身
我有标题和框架文件Headers
文件夹,我尝试添加任何/所有这些构建设置,无论是递归/非递归:
- 框架搜索路径 ->
$(PROJECT_DIR)/Headers
- Header Search Paths ->
$(SRCROOT)/Headers/ChatKit.framework/Headers
$(SRCROOT)/Headers
- User Header Search Paths ->
$(SRCROOT)/Headers
$(SRCROOT)/Headers/ChatKit.framework/Headers
始终搜索用户路径始终为“是”
The second我尝试的事情是在运行时做所有事情,这就是我所拥有的:
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 返回 nil 而不是类...
对这两种方法有什么想法吗?
这适用于未越狱的 iOS 8(.2),使用 Xcode 6
好吧,没有多少人看到这个,但为了我们的维基社区,我设法通过添加来解决这个问题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
获取消息内容...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)