Загрузка маркеров извне комплекта приложений в iOS с Qualcomm AR (QCAR) - PullRequest
1 голос
/ 17 ноября 2011

Кто-нибудь знает, возможно ли загрузить config.xml и qcar-resources.dat (файлы, содержащие информацию о маркере) из-за пределов комплекта приложения?

По официальным форумам и документации это не так. Тем не менее, есть приложение под названием Blippar, которое, кажется, делает это. Я извлек папку «Приложение» из резервной копии iPhone, и там, похоже, есть файл config.xml, в котором больше маркеров отслеживания, чем в комплекте приложений.

Как они могли это сделать, если QCAR SDK не позволяет вам указать местоположение файлов отслеживания?

Я попытался стать хакером и создать категорию в NSBundle для переопределения

  • (NSString *) pathForResource: (NSString *) имя типа: (NSString *) ext;

чтобы вернуть путь из папки с документами, но это не сработало.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Хорошо, я решил это.

Сначала я создал категорию в NSBundle и создал новые реализации почти каждого метода, связанного с загрузкой файлов из пакета, пока не обнаружил, что Qualcomm использует один, то есть:

- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)ext inDirectory:(NSString *)subpath;

Как только я получил это, я изменил метод моей категории на:

#define XFILPATH4DOCUMENT(_value) [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:_value]

- (NSString *)pathForResourceOverride:(NSString *)name ofType:(NSString *)ext inDirectory:(NSString *)subpath
{
    if (([name isEqualToString:@"config"] && [ext isEqualToString:@"xml"]) || ([name isEqualToString:@"qcar-resources"] && [ext isEqualToString:@"dat"]))
    {
        // OMG
        NSString *fileName = [NSString stringWithFormat:@"%@.%@", name, ext];
        NSString *path = XFILPATH4DOCUMENT(fileName);
        NSLog(@"%@", path);
        return path;
    }
    else
    {
        return [self pathForResourceOverride:name ofType:ext inDirectory:subpath];
    }
}

Затем, через магию метода метания:

Swizzle([NSBundle class], @selector(pathForResource:ofType:inDirectory:), @selector(pathForResourceOverride:ofType:inDirectory:));

Используя этот метод:

#import <objc/runtime.h> 
#import <objc/message.h>

void Swizzle(Class c, SEL orig, SEL replacement)
{
    Method origMethod = class_getInstanceMethod(c, orig);
    Method newMethod = class_getInstanceMethod(c, replacement);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, replacement, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    else
        method_exchangeImplementations(origMethod, newMethod);
}

Что я получил из ответа здесь: Метод Swizzle на устройстве iPhone

Страшно?Да.

Но это работает.

0 голосов
/ 27 декабря 2011

QCAR SDK 1.5 Beta теперь поддерживает замену наборов данных во время выполнения! :) Скачать

0 голосов
/ 18 ноября 2011

Я сейчас пытаюсь сделать то же самое.Ваш ответ кажется хорошим, но у меня есть другое предложение.API утверждает, что

enter image description here

Таким образом, это означает, что вы можете загружать отслеживаемые данные в любой момент.

Если вам нужен динамический контент, создайте в вашем приложении служебную функцию, которая переименует нужные вам файлы в config и qcar-resources.dat.Например, допустим, у вас есть 20 различных файлов конфигурации и данных в виде config_x.xml и т. Д. В вашем комплекте приложений, затем вы просто удаляете текущие файлы данных конфигурации и qcar-ресурсов и копируете и переименовываете файлы, которые хотите использовать.Затем вы можете вызвать QCAR :: Tracker :: load (), и он загрузит эти файлы для вас.Это значительно безопаснее, чем ваш метод, который действительно является взломом, а не решением проблемы.

...