@@ -374,17 +374,20 @@ - (void)setUniversalLinkUrl:(NSString *)universalLinkUrl {
374374}
375375
376376- (NSString *)sessionParams {
377- if (_sessionParams) {
378- _sessionParams = [self readStringFromDefaults: BRANCH_PREFS_KEY_SESSION_PARAMS];
377+ @synchronized (self) {
378+ if (!_sessionParams) {
379+ _sessionParams = [self readStringFromDefaults: BRANCH_PREFS_KEY_SESSION_PARAMS];
380+ }
381+ return _sessionParams;
379382 }
380-
381- return _sessionParams;
382383}
383384
384385- (void )setSessionParams : (NSString *)sessionParams {
385- if (![_sessionParams isEqualToString: sessionParams]) {
386- _sessionParams = sessionParams;
387- [self writeObjectToDefaults: BRANCH_PREFS_KEY_SESSION_PARAMS value: sessionParams];
386+ @synchronized (self) {
387+ if (![_sessionParams isEqualToString: sessionParams]) {
388+ _sessionParams = sessionParams;
389+ [self writeObjectToDefaults: BRANCH_PREFS_KEY_SESSION_PARAMS value: sessionParams];
390+ }
388391 }
389392}
390393
@@ -606,42 +609,48 @@ - (NSDictionary *)getContentAnalyticsManifest {
606609 return (NSDictionary *)[self readObjectFromDefaults: BRANCH_PREFS_KEY_ANALYTICS_MANIFEST];
607610}
608611
612+
609613#pragma mark - Writing To Persistence
610614
615+
611616- (void )writeIntegerToDefaults : (NSString *)key value : (NSInteger )value {
612- self.persistenceDict [key] = @(value);
613- [self persistPrefsToDisk ];
617+ [self writeObjectToDefaults: key value: @(value)];
614618}
615619
616620- (void )writeBoolToDefaults : (NSString *)key value : (BOOL )value {
617- self.persistenceDict [key] = @(value);
618- [self persistPrefsToDisk ];
621+ [self writeObjectToDefaults: key value: @(value)];
619622}
620623
621624- (void )writeObjectToDefaults : (NSString *)key value : (NSObject *)value {
622- if (value) {
623- self.persistenceDict [key] = value;
624- }
625- else {
626- [self .persistenceDict removeObjectForKey: key];
625+ @synchronized (self) {
626+ if (value) {
627+ self.persistenceDict [key] = value;
628+ }
629+ else {
630+ [self .persistenceDict removeObjectForKey: key];
631+ }
632+ [self persistPrefsToDisk ];
627633 }
628-
629- [self persistPrefsToDisk ];
630634}
631635
632636- (void )persistPrefsToDisk {
633637 @synchronized (self) {
634- NSDictionary *persistenceDict = [self .persistenceDict copy ];
638+ if (!self.persistenceDict ) return ;
639+ NSData *data = nil ;
640+ @try {
641+ data = [NSKeyedArchiver archivedDataWithRootObject: self .persistenceDict];
642+ }
643+ @catch (id exception) {
644+ data = nil ;
645+ [self logWarning:
646+ [NSString stringWithFormat: @" Exception creating preferences data: %@ ." ,
647+ exception]];
648+ }
649+ if (!data) {
650+ [self logWarning: @" Can't create preferences data." ];
651+ return ;
652+ }
635653 NSBlockOperation *newPersistOp = [NSBlockOperation blockOperationWithBlock: ^ {
636- NSData *data = nil ;
637- @try {
638- data = [NSKeyedArchiver archivedDataWithRootObject: persistenceDict];
639- } @catch (id n) {
640- }
641- if (!data) {
642- [self logWarning: @" Can't create preferences archive." ];
643- return ;
644- }
645654 NSError *error = nil ;
646655 [data writeToURL: self .class.URLForPrefsFile
647656 options: NSDataWritingAtomic error: &error];
@@ -651,7 +660,7 @@ - (void)persistPrefsToDisk {
651660 @" Failed to persist preferences to disk: %@ ." , error]];
652661 }
653662 }];
654- [self .persistPrefsQueue addOperation: newPersistOp];
663+ [self .persistPrefsQueue addOperation: newPersistOp];
655664 }
656665}
657666
@@ -717,35 +726,64 @@ + (NSString *)prefsFile_deprecated {
717726 return path;
718727}
719728
720- + (NSURL *) URLForBranchDirectory {
729+ + (NSURL * _Nonnull) URLForBranchDirectory {
730+ NSSearchPathDirectory kSearchDirectories [] = {
731+ NSApplicationSupportDirectory,
732+ NSCachesDirectory,
733+ NSDocumentDirectory,
734+ };
735+
736+ #define _countof (array ) (sizeof (array)/sizeof (array[0 ]))
737+
738+ for (NSSearchPathDirectory directory = 0 ; directory < _countof (kSearchDirectories ); directory++) {
739+ NSURL *URL = [self createDirectoryForBranchURLWithPath: kSearchDirectories [directory]];
740+ if (URL) return URL;
741+ }
742+
743+ #undef _countof
744+
745+ // Worst case backup plan:
746+ NSString *path = [@" ~/Library/io.branch" stringByExpandingTildeInPath ];
747+ NSURL *branchURL = [NSURL fileURLWithPath: path isDirectory: YES ];
748+ NSFileManager *fileManager = [NSFileManager defaultManager ];
721749 NSError *error = nil ;
722- NSURL *URL =
723- [[NSFileManager defaultManager ]
724- URLForDirectory: NSApplicationSupportDirectory
725- inDomain: NSUserDomainMask
726- appropriateForURL: nil
727- create: YES
750+ BOOL success =
751+ [fileManager
752+ createDirectoryAtURL: branchURL
753+ withIntermediateDirectories: YES
754+ attributes: nil
728755 error: &error];
729- if (error) {
730- NSLog (@" Error creating URLForPrefsDirectory: %@ ." , error);
731- return nil ;
756+ if (!success) {
757+ NSLog (@" Worst case CreateBranchURL error: %@ URL: %@ ." , error, branchURL);
732758 }
733- URL = [URL URLByAppendingPathComponent: @" io.branch" ];
734- [[NSFileManager defaultManager ]
735- createDirectoryAtURL: URL
736- withIntermediateDirectories: YES
737- attributes: nil
738- error: &error];
739- if (error) {
740- NSLog (@" Error creating URLForPrefsDirectory: %@ ." , error);
741- return nil ;
759+ return branchURL;
760+ }
761+
762+ + (NSURL * _Null_unspecified) createDirectoryForBranchURLWithPath : (NSSearchPathDirectory )directory {
763+ NSFileManager *fileManager = [NSFileManager defaultManager ];
764+ NSArray *URLs = [fileManager URLsForDirectory: directory inDomains: NSUserDomainMask | NSLocalDomainMask];
765+
766+ for (NSURL *URL in URLs) {
767+ NSError *error = nil ;
768+ NSURL *branchURL = [URL URLByAppendingPathComponent: @" io.branch" isDirectory: YES ];
769+ BOOL success =
770+ [fileManager
771+ createDirectoryAtURL: branchURL
772+ withIntermediateDirectories: YES
773+ attributes: nil
774+ error: &error];
775+ if (success) {
776+ return branchURL;
777+ } else {
778+ NSLog (@" CreateBranchURL error: %@ URL: %@ ." , error, branchURL);
779+ }
742780 }
743- return URL ;
781+ return nil ;
744782}
745783
746- + (NSURL *) URLForPrefsFile {
784+ + (NSURL * _Nonnull ) URLForPrefsFile {
747785 NSURL *URL = [self URLForBranchDirectory ];
748- URL = [URL URLByAppendingPathComponent: BRANCH_PREFS_FILE];
786+ URL = [URL URLByAppendingPathComponent: BRANCH_PREFS_FILE isDirectory: NO ];
749787 return URL;
750788}
751789
0 commit comments