2011-11-17 8 views
1

でiOSのアプリバンドルの外側からマーカーを読み込むアプリの外からconfig.xmlとqcar-resources.dat(マーカー情報を含むファイル)を読み込むことができるかどうかは誰にも知られていませんバンドル?Qualcomm AR(QCAR)

公式フォーラムとドキュメントによると、そうではありません。しかし、それをやっているようなBlipparというアプリがあります。私は、iPhoneのバックアップからアプリケーションのドキュメントフォルダを抽出し、そこには、アプリケーションバンドルにあるよりも多くのトラッキングマーカーを持つconfig.xmlがあるようです。

QCAR SDKでトラッキングファイルの場所を指定できない場合、どうすればできますか?

私はハックさと

  • (NSStringの*)pathForResource上書きするNSBundleのカテゴリを作成してみました:(NSStringの*)名前のofType:(NSStringの*)EXTを。

代わりにドキュメントフォルダからパスを返しますが、動作していないようです。

+0

私はまったく同じことに直面しています。 これらの機能とスウィズルをどこに置いたらいいのでしょうか? NSBundleを上書きするようですか?どうもありがとう! –

+0

QCAR/Viewforia SDKでこれを行うためのサポートが追加されたので、これを見ている人にとっては、これはもう必要ありません。 – tomwilson

答えて

2

私はそれを解決しました。

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

Iたら:私は1クアルコム使用しているが、見つけるまで

まず私は、NSBundleのカテゴリを作成し、バンドルからロードするファイルに関連するほとんどすべてのメソッドの新しい実装を作成しました

Swizzle([NSBundle class], @selector(pathForResource:ofType:inDirectory:), @selector(pathForResourceOverride:ofType:inDirectory:)); 
:メソッドのスウィズリングの魔法によって、その後

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

:私はあることを私のカテゴリの方法を変更し、ということでした

#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

怖い

このメソッドを使用していますか?はい。

しかし、それは動作します。

+0

上記のSwizzleメソッドはどこに配置しましたか? main.mで?そして、あなたはスウィズルをどこから電話しましたか? – twerdster

+0

awesome :)これでAppStoreのレビューを過ぎてしまったのかな? –

+0

決して見つかりませんでした。 QCARの最新ベータ版では、実行時に新しいデータをロードできます。 – tomwilson

0

現在、同じことをやろうとしています。あなたの答えは良いようですが、別の提案があります。 APIだから、これはあなたが任意の時点で追跡可能なデータをロードすることができることを意味

enter image description here

と述べています。

動的コンテンツが必要な場合は、アプリで、必要なファイルの名前をconfigおよびqcar-resources.datに変更するユーティリティー関数を作成します。 たとえば、アプリケーションバンドルにconfig_x.xmlなどの形式で20種類のconfigファイルとdatファイルがあり、現在のconfigファイルとqcar-resourceデータファイルを削除し、使用するファイルをコピーして名前を変更するだけです。次に、QCAR :: Tracker :: load()を呼び出すと、それらのファイルがロードされます。これはあなたの方法よりもかなり安全です。これは本当にハックであり、解決策ではありません。

+0

ロードは、アプリケーションバンドルからconfig.xmlとqcar-resources.datをロードするようですが?また、あなたのアプリケーションバンドルのファイルを削除したり名前を変更することはできませんか? – tomwilson

+0

あなたはあなたの質問にBlipparがドキュメントフォルダに別の設定ファイルを持っていたと言っていますので、そこからデータを取得していますか? – twerdster

+0

はい、それは私が解決しようとしていた問題全体です。つまり、アプリケーションバンドルではなくドキュメントフォルダからQCARをロードする方法です。実行時にドキュメントフォルダを更新できるので、バンドルできません。 – tomwilson

0

QCAR SDK 1.5ベータ版では、実行時にデータセットを交換できるようになりました。:) Download

+0

QCAR SDK 1.5ベータ版を使用すると、単純な形状マーカーでクラッシュします。 古い1.0バージョンを使用しています。 –