关于iOS“;“监测”;NSUserDefaults读取和写入

关于iOS“;“监测”;NSUserDefaults读取和写入,ios,nsuserdefaults,Ios,Nsuserdefaults,在我的iOS项目中,我使用的是第三方库(Google VR),它可以将内容读写到NSUserDefaults 我知道我可以阅读和打印所有用户默认设置(通过类似 NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; for(NSString* key in keys){ // your code here NSLog(@"value: %@ forKe

在我的iOS项目中,我使用的是第三方库(Google VR),它可以将内容读写到
NSUserDefaults

我知道我可以阅读和打印所有用户默认设置(通过类似

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

for(NSString* key in keys){
    // your code here
    NSLog(@"value: %@ forKey: %@",[[NSUserDefaults standardUserDefaults] valueForKey:key],key);
}
我需要的是看看图书馆在找什么而没有找到。
基本上,库通过检查userdefaults键来检查它之前是否进行过配置(与硬纸板耳机配对)。我想知道它何时发生以及是什么

我知道其中一种方法是进行区分,打印配对前后的所有用户默认值,并查看更改的内容,但我想知道是否有一种通用方法来监视
NSUserDefaults
read调用

方法swizzling,听起来像是一个可能的解决方案,但我不太确定这将如何工作


编辑:为了记录,我使用了下面@BlackM的答案,发现Google VR for Unity在iOS上查找
com.Google.cardbard.sdk.DeviceParamsAndTime
来检查它是否配置了耳机。

我通过方法swizzling实现了它:

#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

上面的注释在编辑之前,现在可用于读取。@rmaddy在此最新更改之前是正确的。
- (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);
}