diff --git a/iOS/Plugins/FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.m b/iOS/Plugins/FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.m index cae0e07ed..8a1704e7f 100644 --- a/iOS/Plugins/FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.m +++ b/iOS/Plugins/FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.m @@ -11,50 +11,63 @@ #import #import "FKUserDefaultsSwizzleUtility.h" +static NSString *const kStandardUserDefaultsName = @"Standard UserDefaults"; +static NSString *const kAppSuiteUserDefaultsName = @"App Suite UserDefaults"; + @interface FKUserDefaultsPlugin () @property (nonatomic, strong) id flipperConnection; -@property (nonatomic, strong) NSUserDefaults *userDefaults; +@property (nonatomic, strong) NSUserDefaults *standardUserDefaults; +@property (nonatomic, strong) NSUserDefaults *appSuiteUserDefaults; @property (nonatomic, copy) NSString *key; @property (nonatomic, copy) NSString *suiteName; @end @implementation FKUserDefaultsPlugin +- (instancetype)init { + if (self = [super init]) { + _standardUserDefaults = [NSUserDefaults standardUserDefaults]; + __weak typeof(self) weakSelf = self; + [FKUserDefaultsSwizzleUtility swizzleSelector:@selector(setObject:forKey:) class:[NSUserDefaults class] block:^(NSInvocation * _Nonnull invocation) { + __unsafe_unretained id firstArg = nil; + __unsafe_unretained id secondArg = nil; + [invocation getArgument:&firstArg atIndex:2]; + [invocation getArgument:&secondArg atIndex:3]; + [invocation invoke]; + [weakSelf userDefaults:([invocation.target isKindOfClass:[NSUserDefaults class]] ? invocation.target : nil) + changedWithValue:firstArg + key:secondArg]; + }]; + } + return self; +} + - (instancetype)initWithSuiteName:(NSString *)suiteName { - if (self = [super init]) { - _userDefaults = [NSUserDefaults standardUserDefaults]; - _suiteName = suiteName; - __weak typeof(self) weakSelf = self; - [FKUserDefaultsSwizzleUtility swizzleSelector:@selector(setObject:forKey:) class:[NSUserDefaults class] block:^(NSInvocation * _Nonnull invocation) { - __unsafe_unretained id firstArg = nil; - __unsafe_unretained id secondArg = nil; - [invocation getArgument:&firstArg atIndex:2]; - [invocation getArgument:&secondArg atIndex:3]; - [invocation invoke]; - [weakSelf userDefaultsChangedWithValue:firstArg key:secondArg]; - }]; + if (self = [self init]) { + _suiteName = suiteName; + if (_suiteName) { + _appSuiteUserDefaults = [[NSUserDefaults alloc] initWithSuiteName:_suiteName]; + } } return self; - } - (void)didConnect:(id)connection { self.flipperConnection = connection; [connection receive:@"getAllSharedPreferences" withBlock:^(NSDictionary *params, id responder) { - NSDictionary *userDefaults = @{ - @"Standard UserDefaults": [self.userDefaults dictionaryRepresentation] - }; - [responder success: userDefaults]; - }]; - - [connection receive:@"getSharedPreferences" withBlock:^(NSDictionary *params, id responder) { - [responder success:[self.userDefaults dictionaryRepresentation]]; + NSMutableDictionary *userDefaults = [NSMutableDictionary new]; + userDefaults[kStandardUserDefaultsName] = [self.standardUserDefaults dictionaryRepresentation]; + if (self.appSuiteUserDefaults) { + userDefaults[kAppSuiteUserDefaultsName] = [self.appSuiteUserDefaults dictionaryRepresentation]; + } + [responder success:userDefaults]; }]; [connection receive:@"setSharedPreference" withBlock:^(NSDictionary *params , id responder) { + NSUserDefaults *sharedPreferences = [self sharedPreferencesForParams:params]; NSString *preferenceName = params[@"preferenceName"]; - [self.userDefaults setObject:params[@"preferenceValue"] forKey:preferenceName]; - [responder success:[self.userDefaults dictionaryRepresentation]]; + [sharedPreferences setObject:params[@"preferenceValue"] forKey:preferenceName]; + [responder success:[sharedPreferences dictionaryRepresentation]]; }]; } @@ -68,7 +81,19 @@ #pragma mark - Private methods -- (void)userDefaultsChangedWithValue:(id)value key:(NSString *)key { +- (NSUserDefaults *)sharedPreferencesForParams:(NSDictionary *)params { + NSString *const sharedPreferencesNameKey = @"sharedPreferencesName"; + if (![params[sharedPreferencesNameKey] isKindOfClass:[NSString class]]) { + return _standardUserDefaults; + } + + NSString *sharedPreferencesName = params[sharedPreferencesNameKey]; + return ([sharedPreferencesName isEqualToString:kAppSuiteUserDefaultsName] + ? _appSuiteUserDefaults + : _standardUserDefaults); +} + +- (void)userDefaults:(NSUserDefaults *)userDefaults changedWithValue:(id)value key:(NSString *)key { NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000; NSString *intervalStr = [NSString stringWithFormat:@"%f", interval]; NSMutableDictionary *params = [@{@"name":key, @@ -80,7 +105,11 @@ } else { [params setObject:value forKey:@"value"]; } - [params setObject:@"Standard UserDefaults" forKey:@"preferences"]; + + NSString *sharedPreferencesName = (userDefaults == _standardUserDefaults + ? kStandardUserDefaultsName + : kAppSuiteUserDefaultsName); + [params setObject:sharedPreferencesName forKey:@"preferences"]; [self.flipperConnection send:@"sharedPreferencesChange" withParams:[params copy]]; }