导入 ChatKit(即私有框架)或以某种方式使用 CKDBMessage
Import ChatKit (i.e., Private Framework) OR using CKDBMessage somehow
首先 - 我知道私人 frameworks/APIs 不会让我进入 AppStore,这仅适用于私人 use/research。
我无法使用 ChatKit.framework
.
编译我的项目
基本上我需要以某种方式初始化 CKDBMessage
object 并从中获取内容。
我尝试的第一个方法是能够调用这个:
CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
NSLog(@"GOT SMS: %@", msg.text);
我无法使用这些解决方案的任意组合进行编译:
- 只需将
CKDBMessage.h
添加到我的项目
- 添加
ChatKit.framework
的所有 headers
- 同时添加
ChatKit.framework
文件本身
我在 Headers
文件夹中有 headers 和框架文件,我尝试在 recursive/non-recursive:[=24= 上添加这些构建设置的 any/all ]
- 框架搜索路径 ->
$(PROJECT_DIR)/Headers
- Header 搜索路径 ->
$(SRCROOT)/Headers/ChatKit.framework/Headers
$(SRCROOT)/Headers
- 用户 Header 搜索路径 ->
$(SRCROOT)/Headers
$(SRCROOT)/Headers/ChatKit.framework/Headers
始终搜索用户路径始终处于“是”状态
我尝试的 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 returns nil 而不是 class...
对这两种方法有什么想法吗?
这是针对未越狱的,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。这里我们可以在PrivateFrameworks
路径中看到一个MessagesKit.framework
。 MessagesKit.framework
包含 SOMessageHelper
文件,我们可以在其中看到 sendSMS
函数。
函数:
(void)sendMessageText:(id)arg1 toRecipient:(id)arg2 withCompletionBlock:(CDUnknownBlockType)arg3;
首先 - 我知道私人 frameworks/APIs 不会让我进入 AppStore,这仅适用于私人 use/research。
我无法使用 ChatKit.framework
.
基本上我需要以某种方式初始化 CKDBMessage
object 并从中获取内容。
我尝试的第一个方法是能够调用这个:
CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID];
NSLog(@"GOT SMS: %@", msg.text);
我无法使用这些解决方案的任意组合进行编译:
- 只需将
CKDBMessage.h
添加到我的项目 - 添加
ChatKit.framework
的所有 headers
- 同时添加
ChatKit.framework
文件本身
我在 Headers
文件夹中有 headers 和框架文件,我尝试在 recursive/non-recursive:[=24= 上添加这些构建设置的 any/all ]
- 框架搜索路径 ->
$(PROJECT_DIR)/Headers
- Header 搜索路径 ->
$(SRCROOT)/Headers/ChatKit.framework/Headers
$(SRCROOT)/Headers
- 用户 Header 搜索路径 ->
$(SRCROOT)/Headers
$(SRCROOT)/Headers/ChatKit.framework/Headers
始终搜索用户路径始终处于“是”状态
我尝试的 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 returns nil 而不是 class...
对这两种方法有什么想法吗?
这是针对未越狱的,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。这里我们可以在PrivateFrameworks
路径中看到一个MessagesKit.framework
。 MessagesKit.framework
包含 SOMessageHelper
文件,我们可以在其中看到 sendSMS
函数。
函数:
(void)sendMessageText:(id)arg1 toRecipient:(id)arg2 withCompletionBlock:(CDUnknownBlockType)arg3;