使用Qualcomm AR(QCAR)从iOS应用程序包外部加载标记

时间:2011-11-17 01:03:44

标签: ios qcar-sdk

是否有人知道是否可以从应用包外部加载config.xml和qcar-resources.dat(包含标记信息的文件)?

根据官方论坛和文件,它不是。然而,有一个名为Blippar的应用程序似乎正在这样做。我从iPhone备份中提取了应用程序文档文件夹,并且它们似乎有一个config.xml,其跟踪标记比应用程序包中的跟踪标记更多。

如果QCAR SDK不允许您指定跟踪文件的位置,他们怎么能这样做?

我尝试过hacky并在NSBundle上创建一个类别来覆盖

  • (NSString *)pathForResource:(NSString *)name ofType:(NSString *)ext;

从文档文件夹返回路径,但这似乎不起作用。

3 个答案:

答案 0 :(得分:2)

好的,我已经解决了。

首先我在NSBundle上创建了一个类别,并创建了几乎所有与从bundle中加载文件相关的方法的新实现,直到我找到了一个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);
}

我从答案中得到了:Method Swizzle on iPhone device

可怕?是。

但它有效。

答案 1 :(得分:0)

我目前正在尝试做同样的事情。你的答案似乎很好,但我有另一个建议。 API声明

enter image description here

这意味着您可以在任何给定时刻加载可跟踪数据。

如果您需要动态内容,请在您的应用中创建一个实用程序功能,该功能会将您需要的文件重命名为config和qcar-resources.dat。 例如,假设您在应用程序包中以config_x.xml等形式拥有20个不同的config和dat文件,那么您只需删除当前配置和qcar-resource数据文件,然后复制并重命名要使用的文件。然后你可以调用QCAR :: Tracker :: load(),它会为你加载这些文件。这比你的方法更安全,这实际上是一个黑客而不是解决方案。

答案 2 :(得分:0)

QCAR SDK 1.5 Beta现在支持在运行时交换数据集! :) Download