diff --git a/ios/RNCAsyncStorage.m b/ios/RNCAsyncStorage.m index 12bae0a9..2d72ac76 100644 --- a/ios/RNCAsyncStorage.m +++ b/ios/RNCAsyncStorage.m @@ -215,12 +215,32 @@ static void RCTStorageDirectoryCleanupOld(NSString *oldDirectoryPath) } } +static void _createStorageDirectory(NSString *storageDirectory, NSError **error) +{ + [[NSFileManager defaultManager] createDirectoryAtPath:storageDirectory + withIntermediateDirectories:YES + attributes:nil + error:error]; +} + static void RCTStorageDirectoryMigrate(NSString *oldDirectoryPath, NSString *newDirectoryPath, BOOL shouldCleanupOldDirectory) { NSError *error; // Migrate data by copying old storage directory to new storage directory location if (![[NSFileManager defaultManager] copyItemAtPath:oldDirectoryPath toPath:newDirectoryPath error:&error]) { - RCTStorageDirectoryMigrationLogError(@"Failed to copy old storage directory to new storage directory location during migration", error); + // the new storage directory "Application Support/[bundleID]/RCTAsyncLocalStorage_V1" seems unable to migrate + // because folder "Application Support/[bundleID]" doesn't exist.. create this folder and attempt folder copying again + if (error != nil && error.code == 4 && [newDirectoryPath isEqualToString:RCTGetStorageDirectory()]) { + NSError *error = nil; + _createStorageDirectory(RCTCreateStorageDirectoryPath(@""), &error); + if (error == nil) { + RCTStorageDirectoryMigrate(oldDirectoryPath, newDirectoryPath, shouldCleanupOldDirectory); + } else { + RCTStorageDirectoryMigrationLogError(@"Failed to create storage directory during migration.", error); + } + } else { + RCTStorageDirectoryMigrationLogError(@"Failed to copy old storage directory to new storage directory location during migration", error); + } } else if (shouldCleanupOldDirectory) { // If copying succeeds, remove old storage directory RCTStorageDirectoryCleanupOld(oldDirectoryPath); @@ -356,10 +376,7 @@ - (NSDictionary *)_ensureSetup NSError *error = nil; if (!RCTHasCreatedStorageDirectory) { - [[NSFileManager defaultManager] createDirectoryAtPath:RCTGetStorageDirectory() - withIntermediateDirectories:YES - attributes:nil - error:&error]; + _createStorageDirectory(RCTGetStorageDirectory(), &error); if (error) { return RCTMakeError(@"Failed to create storage directory.", error, nil); }