Структуры
This commit is contained in:
1 parent
06b08f1efe
commit
1b578067f3
82 files changed
+2692
-944
No files matched your search
@@ -0,0 +1,155 @@
|
||||
#if UNITY_EDITOR || UNITY_IOS
|
||||
using UnityEngine;
|
||||
|
||||
namespace NativeFilePickerNamespace
|
||||
{
|
||||
public class FPResultCallbackiOS : MonoBehaviour
|
||||
{
|
||||
private static FPResultCallbackiOS instance;
|
||||
|
||||
private NativeFilePicker.FilePickedCallback pickCallback;
|
||||
private NativeFilePicker.MultipleFilesPickedCallback pickCallbackMultiple;
|
||||
private NativeFilePicker.FilesExportedCallback exportCallback;
|
||||
|
||||
private float nextBusyCheckTime;
|
||||
|
||||
public static bool IsBusy { get; private set; }
|
||||
|
||||
[System.Runtime.InteropServices.DllImport( "__Internal" )]
|
||||
private static extern int _NativeFilePicker_IsFilePickerBusy();
|
||||
|
||||
public static void Initialize( NativeFilePicker.FilePickedCallback pickCallback, NativeFilePicker.MultipleFilesPickedCallback pickCallbackMultiple, NativeFilePicker.FilesExportedCallback exportCallback )
|
||||
{
|
||||
if( IsBusy )
|
||||
return;
|
||||
|
||||
if( instance == null )
|
||||
{
|
||||
instance = new GameObject( "FPResultCallbackiOS" ).AddComponent<FPResultCallbackiOS>();
|
||||
DontDestroyOnLoad( instance.gameObject );
|
||||
}
|
||||
|
||||
instance.pickCallback = pickCallback;
|
||||
instance.pickCallbackMultiple = pickCallbackMultiple;
|
||||
instance.exportCallback = exportCallback;
|
||||
|
||||
instance.nextBusyCheckTime = Time.realtimeSinceStartup + 1f;
|
||||
IsBusy = true;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if( IsBusy )
|
||||
{
|
||||
if( Time.realtimeSinceStartup >= nextBusyCheckTime )
|
||||
{
|
||||
nextBusyCheckTime = Time.realtimeSinceStartup + 1f;
|
||||
|
||||
if( _NativeFilePicker_IsFilePickerBusy() == 0 )
|
||||
OnOperationCancelled( null );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
public void OnFilePicked( string path )
|
||||
{
|
||||
IsBusy = false;
|
||||
|
||||
if( string.IsNullOrEmpty( path ) )
|
||||
path = null;
|
||||
|
||||
NativeFilePicker.FilePickedCallback _pickCallback = pickCallback;
|
||||
pickCallback = null;
|
||||
|
||||
if( _pickCallback != null )
|
||||
_pickCallback( path );
|
||||
}
|
||||
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
public void OnMultipleFilesPicked( string paths )
|
||||
{
|
||||
IsBusy = false;
|
||||
|
||||
string[] _paths = SplitPaths( paths );
|
||||
if( _paths != null && _paths.Length == 0 )
|
||||
_paths = null;
|
||||
|
||||
NativeFilePicker.MultipleFilesPickedCallback _pickCallbackMultiple = pickCallbackMultiple;
|
||||
pickCallbackMultiple = null;
|
||||
|
||||
if( _pickCallbackMultiple != null )
|
||||
_pickCallbackMultiple( _paths );
|
||||
}
|
||||
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
public void OnFilesExported( string message )
|
||||
{
|
||||
IsBusy = false;
|
||||
|
||||
NativeFilePicker.FilesExportedCallback _exportCallback = exportCallback;
|
||||
exportCallback = null;
|
||||
|
||||
if( _exportCallback != null )
|
||||
_exportCallback( message == "1" );
|
||||
}
|
||||
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
public void OnOperationCancelled( string message )
|
||||
{
|
||||
IsBusy = false;
|
||||
|
||||
NativeFilePicker.FilePickedCallback _pickCallback = pickCallback;
|
||||
NativeFilePicker.MultipleFilesPickedCallback _pickCallbackMultiple = pickCallbackMultiple;
|
||||
NativeFilePicker.FilesExportedCallback _exportCallback = exportCallback;
|
||||
|
||||
pickCallback = null;
|
||||
pickCallbackMultiple = null;
|
||||
exportCallback = null;
|
||||
|
||||
if( _pickCallback != null )
|
||||
_pickCallback( null );
|
||||
|
||||
if( _pickCallbackMultiple != null )
|
||||
_pickCallbackMultiple( null );
|
||||
|
||||
if( _exportCallback != null )
|
||||
_exportCallback( false );
|
||||
}
|
||||
|
||||
private string[] SplitPaths( string paths )
|
||||
{
|
||||
string[] result = null;
|
||||
if( !string.IsNullOrEmpty( paths ) )
|
||||
{
|
||||
string[] pathsSplit = paths.Split( '>' );
|
||||
|
||||
int validPathCount = 0;
|
||||
for( int i = 0; i < pathsSplit.Length; i++ )
|
||||
{
|
||||
if( !string.IsNullOrEmpty( pathsSplit[i] ) )
|
||||
validPathCount++;
|
||||
}
|
||||
|
||||
if( validPathCount == 0 )
|
||||
pathsSplit = new string[0];
|
||||
else if( validPathCount != pathsSplit.Length )
|
||||
{
|
||||
string[] validPaths = new string[validPathCount];
|
||||
for( int i = 0, j = 0; i < pathsSplit.Length; i++ )
|
||||
{
|
||||
if( !string.IsNullOrEmpty( pathsSplit[i] ) )
|
||||
validPaths[j++] = pathsSplit[i];
|
||||
}
|
||||
|
||||
pathsSplit = validPaths;
|
||||
}
|
||||
|
||||
result = pathsSplit;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b11d2999e16ca864f8974988d73c2017
|
||||
timeCreated: 1519060539
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 173238
|
||||
packageName: Native File Picker for Android & iOS
|
||||
packageVersion: 1.4.1
|
||||
assetPath: Assets/Plugins/NativeFilePicker/iOS/FPResultCallbackiOS.cs
|
||||
uploadId: 757770
|
||||
@@ -0,0 +1,213 @@
|
||||
#import <MobileCoreServices/MobileCoreServices.h>
|
||||
|
||||
extern UIViewController* UnityGetGLViewController();
|
||||
|
||||
@interface UNativeFilePicker:NSObject
|
||||
+ (void)pickFiles:(BOOL)allowMultipleSelection withUTIs:(NSArray<NSString *> *)allowedUTIs;
|
||||
+ (void)exportFiles:(NSArray<NSURL *> *)paths;
|
||||
+ (int)canPickMultipleFiles;
|
||||
+ (int)isFilePickerBusy;
|
||||
+ (char *)convertExtensionToUTI:(NSString *)extension;
|
||||
@end
|
||||
|
||||
@implementation UNativeFilePicker
|
||||
|
||||
static UIDocumentPickerViewController *filePicker;
|
||||
static BOOL pickingMultipleFiles;
|
||||
static int filePickerState = 0; // 0 -> none, 1 -> showing, 2 -> finished
|
||||
|
||||
+ (void)pickFiles:(BOOL)allowMultipleSelection withUTIs:(NSArray<NSString *> *)allowedUTIs
|
||||
{
|
||||
filePicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:allowedUTIs inMode:UIDocumentPickerModeImport];
|
||||
filePicker.delegate = (id) self;
|
||||
|
||||
if( @available(iOS 11.0, *) )
|
||||
filePicker.allowsMultipleSelection = allowMultipleSelection;
|
||||
|
||||
// Show file extensions if possible
|
||||
if( @available(iOS 13.0, *) )
|
||||
filePicker.shouldShowFileExtensions = YES;
|
||||
|
||||
pickingMultipleFiles = allowMultipleSelection;
|
||||
filePickerState = 1;
|
||||
|
||||
[UnityGetGLViewController() presentViewController:filePicker animated:NO completion:^{ filePickerState = 0; }];
|
||||
}
|
||||
|
||||
+ (void)exportFiles:(NSArray<NSURL *> *)paths
|
||||
{
|
||||
if( paths != nil && [paths count] > 0 )
|
||||
{
|
||||
if ([paths count] > 1 && [self canPickMultipleFiles] == 1)
|
||||
filePicker = [[UIDocumentPickerViewController alloc] initWithURLs:paths inMode:UIDocumentPickerModeExportToService];
|
||||
else
|
||||
filePicker = [[UIDocumentPickerViewController alloc] initWithURL:paths[0] inMode:UIDocumentPickerModeExportToService];
|
||||
|
||||
filePicker.delegate = (id) self;
|
||||
|
||||
// Show file extensions if possible
|
||||
if( @available(iOS 13.0, *) )
|
||||
filePicker.shouldShowFileExtensions = YES;
|
||||
|
||||
filePickerState = 1;
|
||||
[UnityGetGLViewController() presentViewController:filePicker animated:NO completion:^{ filePickerState = 0; }];
|
||||
}
|
||||
}
|
||||
|
||||
+ (int)canPickMultipleFiles
|
||||
{
|
||||
if( @available(iOS 11.0, *) )
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ (int)isFilePickerBusy
|
||||
{
|
||||
if( filePickerState == 2 )
|
||||
return 1;
|
||||
|
||||
if( filePicker != nil )
|
||||
{
|
||||
if( filePickerState == 1 || [filePicker presentingViewController] == UnityGetGLViewController() )
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
filePicker = nil;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Credit: https://lists.apple.com/archives/cocoa-dev/2012/Jan/msg00052.html
|
||||
+ (char *)convertExtensionToUTI:(NSString *)extension
|
||||
{
|
||||
CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag( kUTTagClassFilenameExtension, (__bridge CFStringRef) extension, NULL );
|
||||
char *result = [self getCString:(__bridge NSString *) fileUTI];
|
||||
CFRelease( fileUTI );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
+ (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url
|
||||
{
|
||||
[self documentPickerCompleted:controller documents:@[url]];
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
+ (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls
|
||||
{
|
||||
[self documentPickerCompleted:controller documents:urls];
|
||||
}
|
||||
|
||||
+ (void)documentPickerCompleted:(UIDocumentPickerViewController *)controller documents:(NSArray<NSURL *> *)urls
|
||||
{
|
||||
filePicker = nil;
|
||||
filePickerState = 2;
|
||||
|
||||
if( controller.documentPickerMode == UIDocumentPickerModeImport )
|
||||
{
|
||||
if( !pickingMultipleFiles || [urls count] <= 1 )
|
||||
{
|
||||
const char* filePath;
|
||||
if( [urls count] == 0 )
|
||||
filePath = "";
|
||||
else
|
||||
filePath = [self getCString:[urls[0] path]];
|
||||
|
||||
if( pickingMultipleFiles )
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnMultipleFilesPicked", filePath );
|
||||
else
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnFilePicked", filePath );
|
||||
}
|
||||
else
|
||||
{
|
||||
NSMutableArray<NSString *> *filePaths = [NSMutableArray arrayWithCapacity:[urls count]];
|
||||
for( int i = 0; i < [urls count]; i++ )
|
||||
[filePaths addObject:[urls[i] path]];
|
||||
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnMultipleFilesPicked", [self getCString:[filePaths componentsJoinedByString:@">"]] );
|
||||
}
|
||||
}
|
||||
else if( controller.documentPickerMode == UIDocumentPickerModeExportToService )
|
||||
{
|
||||
if( [urls count] > 0 )
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnFilesExported", "1" );
|
||||
else
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnFilesExported", "0" );
|
||||
}
|
||||
|
||||
[controller dismissViewControllerAnimated:NO completion:nil];
|
||||
}
|
||||
|
||||
+ (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller
|
||||
{
|
||||
filePicker = nil;
|
||||
UnitySendMessage( "FPResultCallbackiOS", "OnOperationCancelled", "" );
|
||||
|
||||
[controller dismissViewControllerAnimated:NO completion:nil];
|
||||
}
|
||||
|
||||
// Credit: https://stackoverflow.com/a/37052118/2373034
|
||||
+ (char *)getCString:(NSString *)source
|
||||
{
|
||||
if( source == nil )
|
||||
source = @"";
|
||||
|
||||
const char *sourceUTF8 = [source UTF8String];
|
||||
char *result = (char*) malloc( strlen( sourceUTF8 ) + 1 );
|
||||
strcpy(result, sourceUTF8);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
extern "C" void _NativeFilePicker_PickFile( const char* UTIs[], int UTIsCount )
|
||||
{
|
||||
NSMutableArray<NSString *> *allowedUTIs = [NSMutableArray arrayWithCapacity:UTIsCount];
|
||||
for( int i = 0; i < UTIsCount; i++ )
|
||||
[allowedUTIs addObject:[NSString stringWithUTF8String:UTIs[i]]];
|
||||
|
||||
[UNativeFilePicker pickFiles:NO withUTIs:allowedUTIs];
|
||||
}
|
||||
|
||||
extern "C" void _NativeFilePicker_PickMultipleFiles( const char* UTIs[], int UTIsCount )
|
||||
{
|
||||
NSMutableArray<NSString *> *allowedUTIs = [NSMutableArray arrayWithCapacity:UTIsCount];
|
||||
for( int i = 0; i < UTIsCount; i++ )
|
||||
[allowedUTIs addObject:[NSString stringWithUTF8String:UTIs[i]]];
|
||||
|
||||
[UNativeFilePicker pickFiles:YES withUTIs:allowedUTIs];
|
||||
}
|
||||
|
||||
extern "C" void _NativeFilePicker_ExportFiles( const char* files[], int filesCount )
|
||||
{
|
||||
NSMutableArray<NSURL *> *paths = [NSMutableArray arrayWithCapacity:filesCount];
|
||||
for( int i = 0; i < filesCount; i++ )
|
||||
{
|
||||
NSString *filePath = [NSString stringWithUTF8String:files[i]];
|
||||
[paths addObject:[NSURL fileURLWithPath:filePath]];
|
||||
}
|
||||
|
||||
[UNativeFilePicker exportFiles:paths];
|
||||
}
|
||||
|
||||
extern "C" int _NativeFilePicker_CanPickMultipleFiles()
|
||||
{
|
||||
return [UNativeFilePicker canPickMultipleFiles];
|
||||
}
|
||||
|
||||
extern "C" int _NativeFilePicker_IsFilePickerBusy()
|
||||
{
|
||||
return [UNativeFilePicker isFilePickerBusy];
|
||||
}
|
||||
|
||||
extern "C" char* _NativeFilePicker_ConvertExtensionToUTI( const char* extension )
|
||||
{
|
||||
return [UNativeFilePicker convertExtensionToUTI:[NSString stringWithUTF8String:extension]];
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4c65eb8688946be4ea1af62f377f8891
|
||||
timeCreated: 1498722774
|
||||
licenseType: Store
|
||||
PluginImporter:
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
platformData:
|
||||
data:
|
||||
first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
data:
|
||||
first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
data:
|
||||
first:
|
||||
iPhone: iOS
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 173238
|
||||
packageName: Native File Picker for Android & iOS
|
||||
packageVersion: 1.4.1
|
||||
assetPath: Assets/Plugins/NativeFilePicker/iOS/NativeFilePicker.mm
|
||||
uploadId: 757770
|
||||
Reference in new issue
Block a user