ios - 导入 ChatKit(即私有(private)框架)或以某种方式使用 CKDBMessage
<p><p>首先 - 我知道私有(private)框架/API 不会让我进入 AppStore,这仅供私有(private)使用/研究。</p>
<p>我无法使用 <code>ChatKit.framework</code> 编译我的项目。</p>
<p>基本上我需要以某种方式初始化一个 <code>CKDBMessage</code> 对象并从中获取内容。</p>
<p>我尝试的 <strong><em>first</em></strong> 方法是能够调用它:</p>
<pre><code> CKDBMessage* msg = [ initWithRecordID:lastID];
NSLog(@"GOT SMS: %@", msg.text);
</code></pre>
<p>我无法使用这些解决方案的任何组合对其进行编译:</p>
<ul>
<li>只需将 <code>CKDBMessage.h</code> 添加到我的项目中</li>
<li>添加<code>ChatKit.framework</code></li>的所有header
<li>同时添加 <code>ChatKit.framework</code> 文件本身</li>
</ul>
<p>我在 <code>Headers</code> 文件夹中有标题和框架文件,我尝试在递归/非递归上添加任何/所有这些build设置:</p>
<ul>
<li>框架搜索路径 -> <code>$(PROJECT_DIR)/Headers</code></li>
<li>标题搜索路径 ->
<ul>
<li><code>$(SRCROOT)/Headers/ChatKit.framework/Headers</code></li>
<li><code>$(SRCROOT)/Headers</code></li>
</ul></li>
<li>用户标题搜索路径 ->
<ul>
<li><code>$(SRCROOT)/Headers</code></li>
<li><code>$(SRCROOT)/Headers/ChatKit.framework/Headers</code></li>
</ul></li>
</ul>
<p>始终搜索用户路径始终为"is"</p>
<p>我尝试的<strong><em>第二</em></strong>件事是在运行时做所有事情,这就是我所拥有的:</p>
<pre><code>Class CKDBMessage = NSClassFromString(@"CKDBMessage");// objc_getClass("CKDBMessage");
SEL sel = @selector(initWithRecordID:);
NSMethodSignature *signature = ;
NSInvocation *invocation = ;
invocation.selector = sel;
;
;
NSObject * msgWeak = ;
;
NSObject *msg = msgWeak;
NSString *text = ;
NSLog(@"text: %@", text);
</code></pre>
<p>这里我在 <code>invocationWithMethodSignature:</code> 处崩溃,因为 NSClassFromString 返回 nil 而不是类...</p>
<p>对这两种方法有什么想法吗?</p>
<p>这是未越狱的,iOS8(.2),使用 Xcode6</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>好吧,没有多少人看过这个,但是为了我们的 wiki 社区,我设法通过将 <code>CKDBMessage.h</code> 文件添加到我的项目中来解决这个问题(实际上我添加了 <code>ChatKit</code> 但我认为没有必要),而不是像这样使用 <code>dlopen</code> 动态加载框架:</p>
<pre><code>dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY)
</code></pre>
<p>所以我的完整解决方案是:</p>
<pre><code>dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY);
Class CKDBMessageClass = NSClassFromString(@"CKDBMessage");
CKDBMessage *msg = [ initWithRecordID:lastID];
NSString *text = msg.text;
NSLog(@"text: %@", text);
</code></pre>
<p>获取最后一条消息的ID涉及到另一个框架:<code>IMDPersistence</code>:</p>
<pre><code>//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();
</code></pre>
<p>现在您可以使用 <code>lastID</code> 来获取消息内容...</p></p>
<p style="font-size: 20px;">关于ios - 导入 ChatKit(即私有(private)框架)或以某种方式使用 CKDBMessage,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/29151710/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/29151710/
</a>
</p>
页:
[1]