1

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

根据官方论坛和文档,事实并非如此。但是,有一个名为 Blippar 的应用程序似乎正在这样做。我从 iPhone 备份中提取了 app Documents 文件夹,其中似乎有一个 config.xml,其中的跟踪标记比 app bundle 中的要多。

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

我试着在 NSBundle 上创建一个类别来覆盖

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

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

4

3 回答 3

2

好的,我已经解决了。

首先,我在 NSBundle 上创建了一个类别,并创建了与从包中加载文件相关的几乎所有方法的新实现,直到我找到高通正在使用的方法,即:

- (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];
    }
}

然后,通过方法 swizzling 的魔力:

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);
}

我从这里得到的答案:iPhone 设备上的 Method Swizzle

害怕?是的。

但它有效。

于 2011-11-17T03:08:45.563 回答
0

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

于 2011-12-27T15:05:08.100 回答
0

我目前正在尝试做同样的事情。你的回答似乎不错,但我有另一个建议。API 指出

在此处输入图像描述

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

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

于 2011-11-17T21:57:51.463 回答