菜鸟教程小白 发表于 2022-12-13 10:26:38

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(@&#34;GOT SMS: %@&#34;, 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(@&#34;CKDBMessage&#34;);// objc_getClass(&#34;CKDBMessage&#34;);

SEL sel = @selector(initWithRecordID:);

NSMethodSignature *signature = ;
NSInvocation *invocation = ;
invocation.selector = sel;
;
;

NSObject * msgWeak = ;
;
NSObject *msg = msgWeak;

NSString *text = ;

NSLog(@&#34;text: %@&#34;, 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(&#34;/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit&#34;, RTLD_LAZY)
</code></pre>

<p>所以我的完整解决方案是:</p>

<pre><code>dlopen(&#34;/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit&#34;, RTLD_LAZY);

Class CKDBMessageClass = NSClassFromString(@&#34;CKDBMessage&#34;);
CKDBMessage *msg = [ initWithRecordID:lastID];

NSString *text = msg.text;
NSLog(@&#34;text: %@&#34;, 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(&#34;/System/Library/PrivateFrameworks/IMDPersistence.framework/IMDPersistence&#34;, RTLD_LAZY);

//make/get symbol from framework + name
IMDMessageRecordGetMessagesSequenceNumber = (int (*)())dlsym(libHandleIMD, &#34;IMDMessageRecordGetMessagesSequenceNumber&#34;);

// 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]
查看完整版本: ios - 导入 ChatKit(即私有(private)框架)或以某种方式使用 CKDBMessage