Загрузка маркеров извне комплекта приложений в iOS с помощью Qualcomm AR (QCAR)
Кто-нибудь знает, возможно ли загрузить config.xml и qcar-resources.dat (файлы, содержащие информацию о маркере) из-за пределов комплекта приложения?
Согласно официальным форумам и документации, это не так. Тем не менее, есть приложение под названием Blippar, которое, кажется, делает это. Я извлек папку "Приложение" из резервной копии iPhone, и там, похоже, есть файл config.xml, который имеет больше маркеров отслеживания, чем тот, который находится в комплекте приложений.
Как они могли это сделать, если QCAR SDK не позволяет вам указать местоположение файлов отслеживания?
Я попытался быть хакером и создать категорию на NSBundle, чтобы переопределить
- (NSString *)pathForResource:(NSString *) имя типа:(NSString *)ext;
вместо этого вернуть путь из папки документов, но это не сработало.
3 ответа
Хорошо, я решил это.
Сначала я создал категорию в 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
Страшно? Да.
Но это работает.
Я сейчас пытаюсь сделать то же самое. Ваш ответ кажется хорошим, но у меня есть другое предложение. API утверждает, что
Это означает, что вы можете загружать отслеживаемые данные в любой момент.
Если вам нужен динамический контент, создайте в вашем приложении служебную функцию, которая переименует нужные вам файлы в config и qcar-resources.dat. Например, предположим, у вас есть 20 различных файлов конфигурации и данных в виде config_x.xml и т. Д. В вашем комплекте приложений, затем вы просто удаляете текущие файлы данных конфигурации и qcar-ресурсов и копируете и переименовываете файлы, которые хотите использовать. Затем вы можете вызвать QCAR::Tracker::load(), и он загрузит эти файлы для вас. Это значительно безопаснее, чем ваш метод, который действительно является взломом, а не решением проблемы.
QCAR SDK 1.5 Beta теперь поддерживает замену наборов данных во время выполнения!:) Скачать