gpt4 book ai didi

ios - 在 iOS "monitor"NSUserDefaults 读取和写入

转载 作者:行者123 更新时间:2023-12-01 19:59:23 27 4
gpt4 key购买 nike

在我的 iOS 项目中,我使用了第 3 方库 (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阅读电话。

方法调配,听起来像是一个可能的解决方案,但我不太确定它是如何工作的。

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

最佳答案

我设法通过方法调配来实现它:

#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

在您的 Controller 中:
- (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);
}

关于ios - 在 iOS "monitor"NSUserDefaults 读取和写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com