This repository was archived by the owner on Mar 16, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathRNFetchBlob.m
593 lines (503 loc) · 20.8 KB
/
RNFetchBlob.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
//
// RNFetchBlob.m
//
// Created by wkh237 on 2016/4/28.
//
#import "RNFetchBlob.h"
#import "RNFetchBlobFS.h"
#import "RNFetchBlobNetwork.h"
#import "RNFetchBlobConst.h"
#import "RNFetchBlobReqBuilder.h"
#import "RNFetchBlobProgress.h"
__strong RCTBridge * bridgeRef;
dispatch_queue_t commonTaskQueue;
dispatch_queue_t fsQueue;
////////////////////////////////////////
//
// Exported native methods
//
////////////////////////////////////////
#pragma mark RNFetchBlob exported methods
@implementation RNFetchBlob
@synthesize filePathPrefix;
@synthesize documentController;
@synthesize bridge = _bridge;
- (dispatch_queue_t) methodQueue {
if(commonTaskQueue == nil)
commonTaskQueue = dispatch_queue_create("RNFetchBlob.queue", DISPATCH_QUEUE_SERIAL);
return commonTaskQueue;
}
+ (RCTBridge *)getRCTBridge
{
RCTRootView * rootView = [[UIApplication sharedApplication] keyWindow].rootViewController.view;
return rootView.bridge;
}
RCT_EXPORT_MODULE();
- (id) init {
self = [super init];
self.filePathPrefix = FILE_PREFIX;
if(commonTaskQueue == nil)
commonTaskQueue = dispatch_queue_create("RNFetchBlob.queue", DISPATCH_QUEUE_SERIAL);
if(fsQueue == nil)
fsQueue = dispatch_queue_create("RNFetchBlob.fs.queue", DISPATCH_QUEUE_SERIAL);
BOOL isDir;
// if temp folder not exists, create one
if(![[NSFileManager defaultManager] fileExistsAtPath: [RNFetchBlobFS getTempPath] isDirectory:&isDir]) {
[[NSFileManager defaultManager] createDirectoryAtPath:[RNFetchBlobFS getTempPath] withIntermediateDirectories:YES attributes:nil error:NULL];
}
bridgeRef = _bridge;
[RNFetchBlobNetwork emitExpiredTasks];
return self;
}
- (NSDictionary *)constantsToExport
{
return @{
@"MainBundleDir" : [RNFetchBlobFS getMainBundleDir],
@"DocumentDir": [RNFetchBlobFS getDocumentDir],
@"CacheDir" : [RNFetchBlobFS getCacheDir]
};
}
// Fetch blob data request
RCT_EXPORT_METHOD(fetchBlobForm:(NSDictionary *)options
taskId:(NSString *)taskId
method:(NSString *)method
url:(NSString *)url
headers:(NSDictionary *)headers
form:(NSArray *)form
callback:(RCTResponseSenderBlock)callback)
{
[RNFetchBlobReqBuilder buildMultipartRequest:options
taskId:taskId
method:method
url:url
headers:headers
form:form
onComplete:^(__weak NSURLRequest *req, long bodyLength)
{
// something went wrong when building the request body
if(req == nil)
{
callback(@[@"RNFetchBlob.fetchBlobForm failed to create request body"]);
}
// send HTTP request
else
{
RNFetchBlobNetwork * utils = [[RNFetchBlobNetwork alloc] init];
[utils sendRequest:options contentLength:bodyLength bridge:self.bridge taskId:taskId withRequest:req callback:callback];
}
}];
}
// Fetch blob data request
RCT_EXPORT_METHOD(fetchBlob:(NSDictionary *)options
taskId:(NSString *)taskId
method:(NSString *)method
url:(NSString *)url
headers:(NSDictionary *)headers
body:(NSString *)body callback:(RCTResponseSenderBlock)callback)
{
[RNFetchBlobReqBuilder buildOctetRequest:options
taskId:taskId
method:method
url:url
headers:headers
body:body
onComplete:^(NSURLRequest *req, long bodyLength)
{
// something went wrong when building the request body
if(req == nil)
{
callback(@[@"RNFetchBlob.fetchBlob failed to create request body"]);
}
// send HTTP request
else
{
__block RNFetchBlobNetwork * utils = [[RNFetchBlobNetwork alloc] init];
[utils sendRequest:options contentLength:bodyLength bridge:self.bridge taskId:taskId withRequest:req callback:callback];
}
}];
}
#pragma mark - fs.createFile
RCT_EXPORT_METHOD(createFile:(NSString *)path data:(NSString *)data encoding:(NSString *)encoding callback:(RCTResponseSenderBlock)callback) {
NSFileManager * fm = [NSFileManager defaultManager];
NSData * fileContent = nil;
if([[encoding lowercaseString] isEqualToString:@"utf8"]) {
fileContent = [[NSData alloc] initWithData:[data dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];
}
else if([[encoding lowercaseString] isEqualToString:@"base64"]) {
fileContent = [[NSData alloc] initWithBase64EncodedData:data options:0];
}
else if([[encoding lowercaseString] isEqualToString:@"uri"]) {
NSString * orgPath = [data stringByReplacingOccurrencesOfString:FILE_PREFIX withString:@""];
fileContent = [[NSData alloc] initWithContentsOfFile:orgPath];
}
else {
fileContent = [[NSData alloc] initWithData:[data dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]];
}
BOOL success = [fm createFileAtPath:path contents:fileContent attributes:NULL];
if(success == YES)
callback(@[[NSNull null]]);
else
callback(@[[NSString stringWithFormat:@"failed to create new file at path %@ please ensure the folder exists"]]);
}
#pragma mark - fs.createFileASCII
// method for create file with ASCII content
RCT_EXPORT_METHOD(createFileASCII:(NSString *)path data:(NSArray *)dataArray callback:(RCTResponseSenderBlock)callback) {
NSFileManager * fm = [NSFileManager defaultManager];
NSMutableData * fileContent = [NSMutableData alloc];
// prevent stack overflow, alloc on heap
char * bytes = (char*) malloc([dataArray count]);
for(int i = 0; i < dataArray.count; i++) {
bytes[i] = [[dataArray objectAtIndex:i] charValue];
}
[fileContent appendBytes:bytes length:dataArray.count];
BOOL success = [fm createFileAtPath:path contents:fileContent attributes:NULL];
free(bytes);
if(success == YES)
callback(@[[NSNull null]]);
else
callback(@[[NSString stringWithFormat:@"failed to create new file at path %@ please ensure the folder exists"]]);
}
#pragma mark - fs.pathForAppGroup
RCT_EXPORT_METHOD(pathForAppGroup:(NSString *)groupName
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSString * path = [RNFetchBlobFS getPathForAppGroup:groupName];
if(path) {
resolve(path);
} else {
reject(@"RNFetchBlob file not found", @"could not find path for app group", nil);
}
}
#pragma mark - fs.exists
RCT_EXPORT_METHOD(exists:(NSString *)path callback:(RCTResponseSenderBlock)callback) {
[RNFetchBlobFS exists:path callback:callback];
}
#pragma mark - fs.writeFile
RCT_EXPORT_METHOD(writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
[RNFetchBlobFS writeFile:path encoding:[NSString stringWithString:encoding] data:data append:append resolver:resolve rejecter:reject];
}
#pragma mark - fs.writeArray
RCT_EXPORT_METHOD(writeFileArray:(NSString *)path data:(NSArray *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
[RNFetchBlobFS writeFileArray:path data:data append:append resolver:resolve rejecter:reject];
}
#pragma mark - fs.writeStream
RCT_EXPORT_METHOD(writeStream:(NSString *)path withEncoding:(NSString *)encoding appendData:(BOOL)append callback:(RCTResponseSenderBlock)callback)
{
RNFetchBlobFS * fileStream = [[RNFetchBlobFS alloc] initWithBridgeRef:self.bridge];
NSFileManager * fm = [NSFileManager defaultManager];
BOOL isDir = nil;
BOOL exist = [fm fileExistsAtPath:path isDirectory:&isDir];
if( exist == NO || isDir == YES) {
callback(@[[NSString stringWithFormat:@"target path `%@` may not exists or it's a folder", path]]);
return;
}
NSString * streamId = [fileStream openWithPath:path encode:encoding appendData:append];
callback(@[[NSNull null], streamId]);
}
#pragma mark - fs.writeArrayChunk
RCT_EXPORT_METHOD(writeArrayChunk:(NSString *)streamId withArray:(NSArray *)dataArray callback:(RCTResponseSenderBlock) callback)
{
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
char * bytes = (char *) malloc([dataArray count]);
for(int i = 0; i < dataArray.count; i++) {
bytes[i] = [[dataArray objectAtIndex:i] charValue];
}
NSMutableData * data = [NSMutableData alloc];
[data appendBytes:bytes length:dataArray.count];
[fs write:data];
free(bytes);
callback(@[[NSNull null]]);
}
#pragma mark - fs.writeChunk
RCT_EXPORT_METHOD(writeChunk:(NSString *)streamId withData:(NSString *)data callback:(RCTResponseSenderBlock) callback)
{
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
[fs writeEncodeChunk:data];
callback(@[[NSNull null]]);
}
#pragma mark - fs.closeStream
RCT_EXPORT_METHOD(closeStream:(NSString *)streamId callback:(RCTResponseSenderBlock) callback)
{
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
[fs closeOutStream];
callback(@[[NSNull null], @YES]);
}
#pragma mark - unlink
RCT_EXPORT_METHOD(unlink:(NSString *)path callback:(RCTResponseSenderBlock) callback)
{
NSError * error = nil;
NSString * tmpPath = nil;
[[NSFileManager defaultManager] removeItemAtPath:path error:&error];
if(error == nil || [[NSFileManager defaultManager] fileExistsAtPath:path] == NO)
callback(@[[NSNull null]]);
else
callback(@[[NSString stringWithFormat:@"failed to unlink file or path at %@", path]]);
}
#pragma mark - fs.removeSession
RCT_EXPORT_METHOD(removeSession:(NSArray *)paths callback:(RCTResponseSenderBlock) callback)
{
NSError * error = nil;
NSString * tmpPath = nil;
for(NSString * path in paths) {
[[NSFileManager defaultManager] removeItemAtPath:path error:&error];
if(error != nil) {
callback(@[[NSString stringWithFormat:@"failed to remove session path at %@", path]]);
return;
}
}
callback(@[[NSNull null]]);
}
#pragma mark - fs.ls
RCT_EXPORT_METHOD(ls:(NSString *)path callback:(RCTResponseSenderBlock) callback)
{
NSFileManager* fm = [NSFileManager defaultManager];
BOOL exist = nil;
BOOL isDir = nil;
exist = [fm fileExistsAtPath:path isDirectory:&isDir];
if(exist == NO || isDir == NO) {
callback(@[[NSString stringWithFormat:@"failed to list path `%@` because it does not exist or it is not a folder", path]]);
return ;
}
NSError * error = nil;
NSArray * result = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
if(error == nil)
callback(@[[NSNull null], result == nil ? [NSNull null] :result ]);
else
callback(@[[error localizedDescription], [NSNull null]]);
}
#pragma mark - fs.stat
RCT_EXPORT_METHOD(stat:(NSString *)target callback:(RCTResponseSenderBlock) callback)
{
[RNFetchBlobFS getPathFromUri:target completionHandler:^(NSString *path, ALAssetRepresentation *asset) {
__block NSMutableArray * result;
if(path != nil)
{
NSFileManager* fm = [NSFileManager defaultManager];
BOOL exist = nil;
BOOL isDir = nil;
NSError * error = nil;
exist = [fm fileExistsAtPath:path isDirectory:&isDir];
if(exist == NO) {
callback(@[[NSString stringWithFormat:@"failed to stat path `%@` for it is not exist or it is not exist", path]]);
return ;
}
result = [RNFetchBlobFS stat:path error:&error];
if(error == nil)
callback(@[[NSNull null], result]);
else
callback(@[[error localizedDescription], [NSNull null]]);
}
else if(asset != nil)
{
__block NSNumber * size = [NSNumber numberWithLong:[asset size]];
result = [asset metadata];
[result setValue:size forKey:@"size"];
callback(@[[NSNull null], result]);
}
else
{
callback(@[@"failed to stat path, could not resolve URI", [NSNull null]]);
}
}];
}
#pragma mark - fs.lstat
RCT_EXPORT_METHOD(lstat:(NSString *)path callback:(RCTResponseSenderBlock) callback)
{
NSFileManager* fm = [NSFileManager defaultManager];
BOOL exist = nil;
BOOL isDir = nil;
path = [RNFetchBlobFS getPathOfAsset:path];
exist = [fm fileExistsAtPath:path isDirectory:&isDir];
if(exist == NO) {
callback(@[[NSString stringWithFormat:@"failed to list path `%@` for it is not exist or it is not exist", path]]);
return ;
}
NSError * error = nil;
NSArray * files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
NSMutableArray * res = [[NSMutableArray alloc] init];
if(isDir == YES) {
for(NSString * p in files) {
NSString * filePath = [NSString stringWithFormat:@"%@/%@", path, p];
[res addObject:[RNFetchBlobFS stat:filePath error:&error]];
}
}
else {
[res addObject:[RNFetchBlobFS stat:path error:&error]];
}
if(error == nil)
callback(@[[NSNull null], res == nil ? [NSNull null] :res ]);
else
callback(@[[error localizedDescription], [NSNull null]]);
}
#pragma mark - fs.cp
RCT_EXPORT_METHOD(cp:(NSString*)src toPath:(NSString *)dest callback:(RCTResponseSenderBlock) callback)
{
// path = [RNFetchBlobFS getPathOfAsset:path];
[RNFetchBlobFS getPathFromUri:src completionHandler:^(NSString *path, ALAssetRepresentation *asset) {
NSError * error = nil;
if(path == nil)
{
[RNFetchBlobFS writeAssetToPath:asset dest:dest];
callback(@[[NSNull null], @YES]);
}
else
{
BOOL result = [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:path] toURL:[NSURL fileURLWithPath:dest] error:&error];
if(error == nil)
callback(@[[NSNull null], @YES]);
else
callback(@[[error localizedDescription], @NO]);
}
}];
}
#pragma mark - fs.mv
RCT_EXPORT_METHOD(mv:(NSString *)path toPath:(NSString *)dest callback:(RCTResponseSenderBlock) callback)
{
NSError * error = nil;
BOOL result = [[NSFileManager defaultManager] moveItemAtURL:[NSURL fileURLWithPath:path] toURL:[NSURL fileURLWithPath:dest] error:&error];
if(error == nil)
callback(@[[NSNull null], @YES]);
else
callback(@[[error localizedDescription], @NO]);
}
#pragma mark - fs.mkdir
RCT_EXPORT_METHOD(mkdir:(NSString *)path callback:(RCTResponseSenderBlock) callback)
{
if([[NSFileManager defaultManager] fileExistsAtPath:path]) {
callback(@[@"mkdir failed, folder already exists"]);
return;
}
else
[RNFetchBlobFS mkdir:path];
callback(@[[NSNull null]]);
}
#pragma mark - fs.readFile
RCT_EXPORT_METHOD(readFile:(NSString *)path
encoding:(NSString *)encoding
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
[RNFetchBlobFS readFile:path encoding:encoding onComplete:^(id content, NSString * err) {
if(err != nil)
{
reject(@"RNFetchBlob failed to read file", err, nil);
return;
}
if(encoding == @"ascii")
{
resolve((NSMutableArray *)content);
}
else
{
resolve((NSString *)content);
}
}];
}
#pragma mark - fs.readStream
RCT_EXPORT_METHOD(readStream:(NSString *)path withEncoding:(NSString *)encoding bufferSize:(int)bufferSize tick:(int)tick streamId:(NSString *)streamId)
{
if(bufferSize == nil) {
if([[encoding lowercaseString] isEqualToString:@"base64"])
bufferSize = 4095;
else
bufferSize = 4096;
}
dispatch_async(fsQueue, ^{
[RNFetchBlobFS readStream:path encoding:encoding bufferSize:bufferSize tick:tick streamId:streamId bridgeRef:_bridge];
});
}
#pragma mark - fs.getEnvionmentDirs
RCT_EXPORT_METHOD(getEnvironmentDirs:(RCTResponseSenderBlock) callback)
{
callback(@[
[RNFetchBlobFS getDocumentDir],
[RNFetchBlobFS getCacheDir],
]);
}
#pragma mark - net.cancelRequest
RCT_EXPORT_METHOD(cancelRequest:(NSString *)taskId callback:(RCTResponseSenderBlock)callback) {
[RNFetchBlobNetwork cancelRequest:taskId];
callback(@[[NSNull null], taskId]);
}
#pragma mark - net.enableProgressReport
RCT_EXPORT_METHOD(enableProgressReport:(NSString *)taskId interval:(nonnull NSNumber*)interval count:(nonnull NSNumber*)count)
{
RNFetchBlobProgress * cfg = [[RNFetchBlobProgress alloc] initWithType:Download interval:interval count:count];
[RNFetchBlobNetwork enableProgressReport:taskId config:cfg];
}
#pragma mark - net.enableUploadProgressReport
RCT_EXPORT_METHOD(enableUploadProgressReport:(NSString *)taskId interval:(nonnull NSNumber*)interval count:(nonnull NSNumber*)count)
{
RNFetchBlobProgress * cfg = [[RNFetchBlobProgress alloc] initWithType:Upload interval:interval count:count];
[RNFetchBlobNetwork enableUploadProgress:taskId config:cfg];
}
#pragma mark - fs.slice
RCT_EXPORT_METHOD(slice:(NSString *)src dest:(NSString *)dest start:(nonnull NSNumber *)start end:(nonnull NSNumber *)end resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
[RNFetchBlobFS slice:src dest:dest start:start end:end encode:@"" resolver:resolve rejecter:reject];
}
RCT_EXPORT_METHOD(previewDocument:(NSString*)uri scheme:(NSString *)scheme resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
NSString * utf8uri = [uri stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL * url = [[NSURL alloc] initWithString:utf8uri];
// NSURL * url = [[NSURL alloc] initWithString:uri];
documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
UIViewController *rootCtrl = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
documentController.delegate = self;
if(scheme == nil || [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:scheme]]) {
CGRect rect = CGRectMake(0.0, 0.0, 0.0, 0.0);
dispatch_sync(dispatch_get_main_queue(), ^{
[documentController presentOptionsMenuFromRect:rect inView:rootCtrl.view animated:YES];
});
resolve(@[[NSNull null]]);
} else {
reject(@"RNFetchBlob could not open document", @"scheme is not supported", nil);
}
}
# pragma mark - open file with UIDocumentInteractionController and delegate
RCT_EXPORT_METHOD(openDocument:(NSString*)uri scheme:(NSString *)scheme resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
NSString * utf8uri = [uri stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL * url = [[NSURL alloc] initWithString:utf8uri];
// NSURL * url = [[NSURL alloc] initWithString:uri];
documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
documentController.delegate = self;
if(scheme == nil || [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:scheme]]) {
dispatch_sync(dispatch_get_main_queue(), ^{
[documentController presentPreviewAnimated:YES];
});
resolve(@[[NSNull null]]);
} else {
reject(@"RNFetchBlob could not open document", @"scheme is not supported", nil);
}
}
# pragma mark - exclude from backup key
RCT_EXPORT_METHOD(excludeFromBackupKey:(NSString *)url resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
NSError *error = nil;
[ [NSURL URLWithString:url] setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
if(!error)
{
resolve(@[[NSNull null]]);
} else {
reject(@"RNFetchBlob could not open document", [error description], nil);
}
}
RCT_EXPORT_METHOD(df:(RCTResponseSenderBlock)callback)
{
[RNFetchBlobFS df:callback];
}
- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
return window.rootViewController;
}
# pragma mark - check expired network events
RCT_EXPORT_METHOD(emitExpiredEvent:(RCTResponseSenderBlock)callback)
{
[RNFetchBlobNetwork emitExpiredTasks];
}
@end