1

config.xmlとqcar-resources.dat(マーカー情報を含むファイル)をアプリバンドルの外部からロードできるかどうか誰かが知っていますか?

公式フォーラムとドキュメントによると、そうではありません。しかし、それをやっているように見えるBlipparと呼ばれるアプリがそこにあります。iPhoneのバックアップからアプリのドキュメントフォルダーを抽出しましたが、アプリのバンドルにあるものよりも多くの追跡マーカーが含まれているconfig.xmlが含まれているようです。

QCAR SDKで追跡ファイルの場所を指定できない場合、どうすればこれを実行できたでしょうか。

ハッキーになってNSBundleにカテゴリを作成してオーバーライドしてみました

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

代わりにドキュメントフォルダからパスを返すようにしましたが、それはうまくいかなかったようです。

4

3 に答える 3

2

わかりました、私はそれを解決しました。

まず、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);
}

私はここでの答えから得ました:iPhoneデバイスのメソッドSwizzle

怖い?はい。

しかし、それは機能します。

于 2011-11-17T03:08:45.563 に答える
0

私は現在同じことをしようとしています。あなたの答えは良いようですが、私は別の提案があります。APIは次のように述べています

ここに画像の説明を入力してください

つまり、これは、追跡可能なデータをいつでもロードできることを意味します。

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

于 2011-11-17T21:57:51.463 に答える
0

QCAR SDK 1.5 Betaは、実行時のデータセットの交換をサポートするようになりました。:)ダウンロード

于 2011-12-27T15:05:08.100 に答える