【问题标题】:Loading markers from outside the app bundle in iOS with Qualcomm AR (QCAR)使用 Qualcomm AR (QCAR) 从 iOS 中的应用程序包外部加载标记
【发布时间】:2011-12-30 22:40:09
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我面临着完全相同的事情。您能否再详细说明一下您将这些功能和 Swizzle 放在哪里?它似乎覆盖了 NSBundle?非常感谢!
  • 仅供查看此内容的任何人参考,这不再是必要的,因为他们在 QCAR/Viewforia SDK 中添加了对执行此操作的支持。

标签: ios qcar-sdk


【解决方案1】:

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

【讨论】:

  • 使用 QCAR SDK 1.5 beta,它在一些简单的形状标记上崩溃!!!所以使用旧的 1.0 版本。
【解决方案2】:

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

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

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

【讨论】:

  • load 似乎只从应用程序包中加载 config.xml 和 qcar-resources.dat 吗?并且您无法删除或重命名您的 app bundle 中的文件?
  • 您在问题中说 Blippar 在他们的文档文件夹中有一个不同的配置文件,所以这是否意味着他们正在从那里获取数据?
  • 是的,但这就是我试图解决的全部问题 - 如何让 QCAR 从文档文件夹而不是应用程序包加载。因为你可以在运行时更新文档文件夹,所以你不能更新包。
  • 在这种情况下,您的答案是唯一有效的答案。顺便说一句,干得好!
【解决方案3】:

好的,我已经解决了。

首先,我在 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];
    }
}

然后,通过方法调配的魔力:

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

可怕吗?是的。

但它有效。

【讨论】:

  • 你把上面的 Swizzle 方法放在哪里了?在 main.m?你是从哪里给 Swizzle 打电话的?
  • 太棒了 :) 想知道你是否通过了 AppStore 的审核?
  • 从未发现。目前的 QCAR 测试版允许您在运行时加载新数据。
猜你喜欢
  • 2012-03-31
  • 2011-11-03
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多