diff --git a/ios/Classes/FlutterDownloaderPlugin.m b/ios/Classes/FlutterDownloaderPlugin.m index 9998d828..577138e3 100644 --- a/ios/Classes/FlutterDownloaderPlugin.m +++ b/ios/Classes/FlutterDownloaderPlugin.m @@ -299,7 +299,9 @@ - (void)sendUpdateProgressForTaskId: (NSString*)taskId inStatus: (NSNumber*) sta { NSArray *args = @[@(_callbackHandle), taskId, status, progress]; if (initialized && _callbackHandle != 0) { - [_callbackChannel invokeMethod:@"" arguments:args]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self-> _callbackChannel invokeMethod:@"" arguments:args]; + }); } else { [_eventQueue addObject:args]; } @@ -361,11 +363,7 @@ - (NSURL*)fileUrlOf:(NSString*)taskId taskInfo:(NSDictionary*)taskInfo downloadT if (filename == nil || ![filename isKindOfClass:[NSString class]] || [filename isEqualToString:@""]) { // If suggestedFilename is empty, use the last path component of the URL as the filename filename = [self sanitizeFilename:suggestedFilename]; - } else { - // Sanitize the suggestedFilename to remove unsafe characters - filename = [self sanitizeFilename:filename]; - } - + } // Update the taskInfo with the sanitized filename NSMutableDictionary *mutableTaskInfo = [taskInfo mutableCopy]; mutableTaskInfo[KEY_FILE_NAME] = filename; @@ -390,7 +388,25 @@ - (NSString*)absoluteSavedDirPathWithShortSavedDir:(NSString*)shortSavedDir sear - (NSString *)sanitizeFilename:(nullable NSString *)filename { // Define a list of allowed characters for filenames - NSCharacterSet *allowedCharacters = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_."]; + NSMutableCharacterSet *allowedCharacters = [[NSMutableCharacterSet alloc] init]; + + // Allow alphabetical characters (lowercase and uppercase) + [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet letterCharacterSet]]; + + // Allow digits + [allowedCharacters addCharactersInRange:NSMakeRange('0', 10)]; // ASCII digits + + // Allow additional characters: -_.() + [allowedCharacters addCharactersInString:@"-_.()"]; + + // Allow empty spaces + [allowedCharacters addCharactersInString:@" "]; + + // Remove the backslash (if you want to disallow it) + [allowedCharacters removeCharactersInString:@"\\"]; + + // Now, you have a character set that allows the specified characters + NSCharacterSet *finalCharacterSet = [allowedCharacters copy]; if (filename == nil || [filename isEqual:[NSNull null]] || [filename isEqualToString:@""]) { NSString *defaultFilename = @"default_filename"; return defaultFilename;