导入ChatKit(即私人框架)或使用CKDBMessage莫名其妙
首先 – 我知道私人框架/ API不会让我到AppStore,这是只供私人使用/研究。
我不能让我的项目与ChatKit.framework
编译。
基本上我需要以某种方式初始化CKDBMessage
对象并从中获取东西。
我尝试的第一种方法是能够调用这个:
CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID]; NSLog(@"GOT SMS: %@", msg.text);
我不能用这些解决scheme的任何组合来编译它:
- 只需将
CKDBMessage.h
添加到我的项目中 - 添加
ChatKit.framework
所有标题 - 也添加
ChatKit.framework
文件本身
我有Headers
文件夹中的Headers
文件和框架文件,我尝试添加任何/所有这些构build设置,无论是recursion/非recursion:
- 框架searchpath – >
$(PROJECT_DIR)/Headers
- 标题searchpath – >
-
$(SRCROOT)/Headers/ChatKit.framework/Headers
-
$(SRCROOT)/Headers
-
- 用户标题searchpath – >
-
$(SRCROOT)/Headers
-
$(SRCROOT)/Headers/ChatKit.framework/Headers
-
始终search用户path始终为YES
我尝试的第二件事是在运行时做所有事情,这就是我所拥有的:
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返回零,而不是类…
任何两种方法的任何想法?
这是使用Xcode6的nonjailbroken,iOS8(.2)
没有多less人看到这个,但为了我们的wiki社区,我设法通过将CKDBMessage.h
文件添加到我的项目(实际上我添加了所有的ChatKit
的标题,但我不认为这是必要的)来解决这个问题,比我用dlopen
dynamic加载框架是这样的:
dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY)
所以我的完整解决scheme是:
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
来获取消息内容…