2015-03-19 6 views
2

Во-первых - я знаю, что частные фреймворки/API не приведут меня в AppStore, это только для частного использования/исследования.Импорт ChatKit (т. Е. Private Framework) ИЛИ с использованием CKDBMessage как-то

Я не могу получить свой проект для компиляции с ChatKit.framework.

В принципе мне нужно как-то инициализировать объект CKDBMessage и получить от него материал.

первый подход, который я попробовал, чтобы быть в состоянии назвать это:

CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID]; 
    NSLog(@"GOT SMS: %@", msg.text); 

Я не мог заставить его компиляции с любой комбинацией этих решений:

  • Просто добавить только CKDBMessage.h в мой проект
  • Добавить все заголовки ChatKit.framework
  • Добавить также ChatKit.framework самого файл

У меня есть заголовки и рамка файл в Headers папке, и я попробовал добавлять любой/все эти построения настройки, как на рекурсивном/нерекурсивно:

  • Рамочные Пути поиска ->$(PROJECT_DIR)/Headers
  • Заголовок Пути поиска ->
    • $(SRCROOT)/Headers/ChatKit.framework/Headers
    • $(SRCROOT)/Headers
  • пользователя Header Пути поиска ->
    • $(SRCROOT)/Headers
    • $(SRCROOT)/Headers/ChatKit.framework/Headers

Всегда поиск путей пользователя всегда на ДА

второй вещь, которую я попытался было сделать все во время выполнения, это то, что у меня есть:

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 возвращает ноль вместо класса ...

Любые идеи по любому из эти два подхода?

Это для nonjailbroken, iOS8 (.2), используя Xcode6

ответ

4

Ну не многие рассматривали это, но ради нашей вики-сообщества, мне удалось решить эту проблему путем добавления файла 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); 

Получение идентификатора последнего сообщения включает в себя другую структуру: 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, чтобы получить содержимое сообщения ...

+0

Привет, вы можете поделиться более подробную информацию? dlopen, RTLD_LAZY показывает ошибки. необъявленный идентификатор – Durgaprasad

+0

Вы должны включить #include для dlopen. На моей стороне я хотел знать, откуда у тебя последний идентификатор? – jrmgx

+0

@jrmgx отредактировал мой ответ ... удачи (: –