2016-11-17 8 views
1

私のiOSプロジェクトでは、第三者のライブラリ(Google VR)を使用しています。これはNSUserDefaultsに読み書きします。iOS上で "monitor" NSUserDefaults読み込みと書き込み

は私が読んで、私はライブラリが見つからない探しとされていないかを確認することです必要なもの

NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; 

for(NSString* key in keys){ 
    // your code here 
    NSLog(@"value: %@ forKey: %@",[[NSUserDefaults standardUserDefaults] valueForKey:key],key); 
} 

のようなもので(すべてのユーザーのデフォルトを印刷することができます知っている。
基本的には、ライブラリーのチェックを設定が完了した場合(段ボールのヘッドセットとのペア設定)に、ユーザーのデフォルトキーを確認して、何が起きているのかを知りたい場合は

私はdiffを実行すること、ペアリングの前後でユーザーのデフォルトが変更されていることを確認しますが、一般的なWAがあるかどうかを知りたいy NSUserDefaultsの呼び出しを監視する。

方法はすばらしい解決策のように聞こえるが、私はそれがどのように機能するかについてはあまりよく分かっていない。

EDIT:レコードの、私は以下の@BlackMで解答を使用し、UnityのためそのGoogleのVRを発見、iOSの上で、それはヘッドセットかどうかを設定しているかどうかを確認するためにcom.google.cardboard.sdk.DeviceParamsAndTimeを探します。

答えて

2

は、私は、メソッドのスウィズリングでそれを実装するために管理します。

#import <objc/runtime.h> 

@implementation NSUserDefaults (Read) 
+(void)load { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     Class class = [self class]; 

     //Swizzling objectForKey 
     SEL originalSelectorVWA = @selector(objectForKey:); 
     SEL swizzledSelectorVWA = @selector(swizzled_objectForKey:); 

     Method originalMethodVWA = class_getInstanceMethod(class, originalSelectorVWA); 
     Method swizzledMethodVWA = class_getInstanceMethod(class, swizzledSelectorVWA); 

     BOOL didAddMethodVWA = 
     class_addMethod(class, 
         originalSelectorVWA, 
         method_getImplementation(swizzledMethodVWA), 
         method_getTypeEncoding(swizzledMethodVWA)); 

     if (didAddMethodVWA) { 
      class_replaceMethod(class, 
           swizzledSelectorVWA, 
           method_getImplementation(originalMethodVWA), 
           method_getTypeEncoding(originalMethodVWA)); 
     } else { 
      method_exchangeImplementations(originalMethodVWA, swizzledMethodVWA); 
     } 

    }); 
} 

#pragma mark - Method Swizzling 
- (id)swizzled_objectForKey:(NSString *)defaultName { 

    id data = [self swizzled_objectForKey:defaultName]; 

    if (!data) { 
     NSDictionary *infoDict = [NSDictionary dictionaryWithObject:defaultName forKey:@"key"]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"readNSUserDefaults" object:nil userInfo:infoDict]; 
    } 

    return data; 
} 
@end 

お使いのコントローラでは:

書き込みのためだけだ
- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSString *valueToSave = @"someValue"; 

    [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"someKey"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readNSUSerDefaults:) name:@"readNSUserDefaults" object:nil]; 

     [[NSUserDefaults standardUserDefaults] stringForKey:@"someKey"]; 
[[NSUserDefaults standardUserDefaults] stringForKey:@"thisKeyDoesntExistKey"]; 
} 

-(void)readNSUSerDefaults:(NSNotification*)notification { 

    NSString *key = [notification.userInfo objectForKey:@"key"]; 
    NSLog(@"Read key %@ returned nil NSUserDefaults",key); 
} 
+1

、読み込みません。 – rmaddy

+1

上記のコメントは編集前のものでしたが、今は読み込みにも役立ちます。 @rmaddyはこの最新の変更前に正しかった。 – Ali

関連する問題