Updates from Tue Feb 17
- [ReactNative] Make run on iOS7 again | Philipp von Weitershausen - [ReactNative] Make it possible to use fbobjc's RKJSModules for ReactAndroid | Philipp von Weitershausen - [React Native] Add image/network cache | Alex Akers - [ReactNative] Sync fbandroid to fbobjc | Philipp von Weitershausen
This commit is contained in:
parent
3d9d8e6a5a
commit
89db1a64aa
|
@ -15,6 +15,7 @@ var TextStylePropTypes = merge(
|
|||
fontFamily: ReactPropTypes.string,
|
||||
fontSize: ReactPropTypes.number,
|
||||
fontWeight: ReactPropTypes.oneOf(['normal' /*default*/, 'bold']),
|
||||
fontStyle: ReactPropTypes.oneOf(['normal', 'italic']),
|
||||
lineHeight: ReactPropTypes.number,
|
||||
color: ReactPropTypes.string,
|
||||
containerBackgroundColor: ReactPropTypes.string,
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface RCTCache : NSObject
|
||||
|
||||
- (instancetype)init; // name = @"default"
|
||||
- (instancetype)initWithName:(NSString *)name;
|
||||
|
||||
@property (nonatomic, assign) NSUInteger maximumDiskSize; // in bytes
|
||||
|
||||
#pragma mark - Retrieval
|
||||
|
||||
- (BOOL)hasDataForKey:(NSString *)key;
|
||||
- (void)fetchDataForKey:(NSString *)key completionHandler:(void (^)(NSData *data))completionHandler;
|
||||
|
||||
#pragma mark - Insertion
|
||||
|
||||
- (void)setData:(NSData *)data forKey:(NSString *)key;
|
||||
- (void)removeAllData;
|
||||
|
||||
@end
|
|
@ -0,0 +1,209 @@
|
|||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#import "RCTCache.h"
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <sys/xattr.h>
|
||||
|
||||
static NSString *const CacheSubdirectoryName = @"ReactKit";
|
||||
static NSString *const KeyExtendedAttributeName = @"com.facebook.ReactKit.RCTCacheManager.Key";
|
||||
static dispatch_queue_t Queue;
|
||||
|
||||
#pragma mark - Cache Record -
|
||||
|
||||
@interface RCTCacheRecord : NSObject
|
||||
|
||||
@property (nonatomic, copy) NSUUID *UUID;
|
||||
@property (nonatomic, copy) NSData *data;
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTCacheRecord
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Cache
|
||||
|
||||
@implementation RCTCache
|
||||
{
|
||||
NSString *_name;
|
||||
NSFileManager *_fileManager;
|
||||
NSMutableDictionary *_storage;
|
||||
NSURL *_cacheDirectoryURL;
|
||||
}
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
if (self == [RCTCache class]) {
|
||||
Queue = dispatch_queue_create("com.facebook.ReactKit.RCTCache", DISPATCH_QUEUE_SERIAL);
|
||||
}
|
||||
}
|
||||
- (instancetype)init
|
||||
{
|
||||
return [self initWithName:@"default"];
|
||||
}
|
||||
|
||||
- (instancetype)initWithName:(NSString *)name
|
||||
{
|
||||
NSParameterAssert(name.length < NAME_MAX);
|
||||
if ((self = [super init])) {
|
||||
_name = [name copy];
|
||||
_fileManager = [[NSFileManager alloc] init];
|
||||
_storage = [NSMutableDictionary dictionary];
|
||||
|
||||
NSURL *cacheDirectoryURL = [[_fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
|
||||
cacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:CacheSubdirectoryName isDirectory:YES];
|
||||
_cacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:name isDirectory:YES];
|
||||
[_fileManager createDirectoryAtURL:_cacheDirectoryURL withIntermediateDirectories:YES attributes:nil error:NULL];
|
||||
|
||||
NSArray *fileURLs = [_fileManager contentsOfDirectoryAtURL:_cacheDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:NULL];
|
||||
for (NSURL *fileURL in fileURLs) {
|
||||
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:fileURL.lastPathComponent];
|
||||
if (!uuid) continue;
|
||||
|
||||
NSString *key = [self keyOfItemAtURL:fileURL error:NULL];
|
||||
if (!key) {
|
||||
[_fileManager removeItemAtURL:fileURL error:NULL];
|
||||
continue;
|
||||
}
|
||||
|
||||
RCTCacheRecord *record = [[RCTCacheRecord alloc] init];
|
||||
record.UUID = uuid;
|
||||
_storage[key] = record;
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)runOnQueue:(dispatch_block_t)block
|
||||
{
|
||||
UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
|
||||
dispatch_async(Queue, ^{
|
||||
if (block) block();
|
||||
if (identifier != UIBackgroundTaskInvalid) {
|
||||
[[UIApplication sharedApplication] endBackgroundTask:identifier];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
- (BOOL)hasDataForKey:(NSString *)key
|
||||
{
|
||||
return _storage[key] != nil;
|
||||
}
|
||||
|
||||
- (void)fetchDataForKey:(NSString *)key completionHandler:(void (^)(NSData *))completionHandler
|
||||
{
|
||||
NSParameterAssert(key.length > 0);
|
||||
NSParameterAssert(completionHandler != nil);
|
||||
[self runOnQueue:^{
|
||||
RCTCacheRecord *record = _storage[key];
|
||||
if (record && !record.data) {
|
||||
record.data = [NSData dataWithContentsOfURL:[_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString]];
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
completionHandler(record.data);
|
||||
});
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)setData:(NSData *)data forKey:(NSString *)key
|
||||
{
|
||||
NSParameterAssert(key.length > 0);
|
||||
[self runOnQueue:^{
|
||||
RCTCacheRecord *record = _storage[key];
|
||||
if (data) {
|
||||
if (!record) {
|
||||
record = [[RCTCacheRecord alloc] init];
|
||||
record.UUID = [NSUUID UUID];
|
||||
_storage[key] = record;
|
||||
}
|
||||
|
||||
record.data = data;
|
||||
|
||||
NSURL *fileURL = [_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString];
|
||||
[data writeToURL:fileURL options:NSDataWritingAtomic error:NULL];
|
||||
} else if (record) {
|
||||
[_storage removeObjectForKey:key];
|
||||
|
||||
NSURL *fileURL = [_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString];
|
||||
[_fileManager removeItemAtURL:fileURL error:NULL];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)removeAllData
|
||||
{
|
||||
[self runOnQueue:^{
|
||||
[_storage removeAllObjects];
|
||||
|
||||
NSDirectoryEnumerator *enumerator = [_fileManager enumeratorAtURL:_cacheDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:nil];
|
||||
for (NSURL *fileURL in enumerator) {
|
||||
[_fileManager removeItemAtURL:fileURL error:NULL];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Extended Attributes
|
||||
|
||||
- (NSError *)errorWithPOSIXErrorNumber:(int)errorNumber
|
||||
{
|
||||
NSDictionary *userInfo = @{
|
||||
NSLocalizedDescriptionKey: @(strerror(errorNumber))
|
||||
};
|
||||
return [NSError errorWithDomain:NSPOSIXErrorDomain code:errorNumber userInfo:userInfo];
|
||||
}
|
||||
|
||||
- (BOOL)setAttribute:(NSString *)key value:(NSString *)value ofItemAtURL:(NSURL *)fileURL error:(NSError **)error
|
||||
{
|
||||
const char *path = fileURL.fileSystemRepresentation;
|
||||
|
||||
int result;
|
||||
if (value) {
|
||||
const char *valueUTF8String = value.UTF8String;
|
||||
result = setxattr(path, key.UTF8String, valueUTF8String, strlen(valueUTF8String), 0, 0);
|
||||
} else {
|
||||
result = removexattr(path, key.UTF8String, 0);
|
||||
}
|
||||
|
||||
if (result) {
|
||||
if (error) *error = [self errorWithPOSIXErrorNumber:errno];
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSString *)attribute:(NSString *)key ofItemAtURL:(NSURL *)fileURL error:(NSError **)error
|
||||
{
|
||||
const char *path = fileURL.fileSystemRepresentation;
|
||||
const ssize_t length = getxattr(path, key.UTF8String, NULL, 0, 0, 0);
|
||||
if (length <= 0) {
|
||||
if (error) *error = [self errorWithPOSIXErrorNumber:errno];
|
||||
return nil;
|
||||
}
|
||||
|
||||
char *buffer = malloc(length);
|
||||
ssize_t result = getxattr(path, key.UTF8String, buffer, length, 0, 0);
|
||||
if (result == 0) {
|
||||
return [[NSString alloc] initWithBytesNoCopy:buffer length:length encoding:NSUTF8StringEncoding freeWhenDone:YES];
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
if (error) *error = [self errorWithPOSIXErrorNumber:errno];
|
||||
return nil;
|
||||
}
|
||||
|
||||
#pragma mark - Extended Attributes - Key
|
||||
|
||||
- (NSString *)keyOfItemAtURL:(NSURL *)fileURL error:(NSError **)error
|
||||
{
|
||||
return [self attribute:KeyExtendedAttributeName ofItemAtURL:fileURL error:error];
|
||||
}
|
||||
|
||||
- (BOOL)setKey:(NSString *)key ofItemAtURL:(NSURL *)fileURL error:(NSError **)error
|
||||
{
|
||||
return [self setAttribute:KeyExtendedAttributeName value:key ofItemAtURL:fileURL error:error];
|
||||
}
|
||||
|
||||
@end
|
|
@ -814,7 +814,7 @@ BOOL RCTSetProperty(id target, NSString *keypath, id value)
|
|||
|
||||
// Special case for numeric encodings, which may be enums
|
||||
if ([value isKindOfClass:[NSString class]] &&
|
||||
[@"iIsSlLqQ" containsString:[encoding substringToIndex:1]]) {
|
||||
[@"iIsSlLqQ" rangeOfString:[encoding substringToIndex:1]].length) {
|
||||
|
||||
/**
|
||||
* NOTE: the property names below may seem weird, but it's
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#import "RCTImageDownloader.h"
|
||||
|
||||
#import "RCTCache.h"
|
||||
#import "RCTUtils.h"
|
||||
|
||||
// TODO: something a bit more sophisticated
|
||||
|
||||
@implementation RCTImageDownloader
|
||||
{
|
||||
RCTCache *_cache;
|
||||
}
|
||||
|
||||
+ (instancetype)sharedInstance
|
||||
{
|
||||
|
@ -18,18 +23,63 @@
|
|||
return sharedInstance;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
if ((self = [super init])) {
|
||||
_cache = [[RCTCache alloc] initWithName:@"RCTImageDownloader"];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)cacheKeyForURL:(NSURL *)url
|
||||
{
|
||||
return url.absoluteString;
|
||||
}
|
||||
|
||||
- (id)_downloadDataForURL:(NSURL *)url
|
||||
block:(RCTDataDownloadBlock)block
|
||||
{
|
||||
NSString *cacheKey = [self cacheKeyForURL:url];
|
||||
|
||||
__block BOOL cancelled = NO;
|
||||
__block NSURLSessionDataTask *task = nil;
|
||||
dispatch_block_t cancel = ^{
|
||||
cancelled = YES;
|
||||
if (task) {
|
||||
[task cancel];
|
||||
task = nil;
|
||||
}
|
||||
};
|
||||
|
||||
if ([_cache hasDataForKey:cacheKey]) {
|
||||
[_cache fetchDataForKey:cacheKey completionHandler:^(NSData *data) {
|
||||
if (cancelled) return;
|
||||
block(data, nil);
|
||||
}];
|
||||
} else {
|
||||
task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||
block(data, error);
|
||||
}];
|
||||
|
||||
[task resume];
|
||||
}
|
||||
|
||||
return [cancel copy];
|
||||
}
|
||||
|
||||
- (id)downloadDataForURL:(NSURL *)url
|
||||
block:(RCTDataDownloadBlock)block
|
||||
{
|
||||
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||
// Dispatch back to main thread
|
||||
NSString *cacheKey = [self cacheKeyForURL:url];
|
||||
__weak RCTImageDownloader *weakSelf = self;
|
||||
return [self _downloadDataForURL:url block:^(NSData *data, NSError *error) {
|
||||
RCTImageDownloader *strongSelf = weakSelf;
|
||||
[strongSelf->_cache setData:data forKey:cacheKey];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
block(data, error);
|
||||
});
|
||||
}];
|
||||
|
||||
[task resume];
|
||||
return task;
|
||||
}
|
||||
|
||||
- (id)downloadImageForURL:(NSURL *)url
|
||||
|
@ -37,45 +87,49 @@
|
|||
scale:(CGFloat)scale
|
||||
block:(RCTImageDownloadBlock)block
|
||||
{
|
||||
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||
|
||||
UIImage *image = [UIImage imageWithData:data scale:scale];
|
||||
|
||||
// TODO: cache compressed image
|
||||
|
||||
CGSize imageSize = size;
|
||||
if (CGSizeEqualToSize(imageSize, CGSizeZero)) {
|
||||
imageSize = image.size;
|
||||
NSString *cacheKey = [self cacheKeyForURL:url];
|
||||
__weak RCTImageDownloader *weakSelf = self;
|
||||
return [self _downloadDataForURL:url block:^(NSData *data, NSError *error) {
|
||||
if (data) {
|
||||
UIImage *image = [UIImage imageWithData:data scale:scale];
|
||||
|
||||
if (image) {
|
||||
CGSize imageSize = size;
|
||||
if (CGSizeEqualToSize(imageSize, CGSizeZero)) {
|
||||
imageSize = image.size;
|
||||
}
|
||||
|
||||
CGFloat imageScale = scale;
|
||||
if (imageScale == 0 || imageScale > image.scale) {
|
||||
imageScale = image.scale;
|
||||
}
|
||||
|
||||
UIGraphicsBeginImageContextWithOptions(imageSize, NO, imageScale);
|
||||
[image drawInRect:(CGRect){{0, 0}, imageSize}];
|
||||
image = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
|
||||
RCTImageDownloader *strongSelf = weakSelf;
|
||||
[strongSelf->_cache setData:UIImagePNGRepresentation(image) forKey:cacheKey];
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
block(image, nil);
|
||||
});
|
||||
} else {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
block(nil, error);
|
||||
});
|
||||
}
|
||||
|
||||
CGFloat imageScale = scale;
|
||||
if (imageScale == 0 || imageScale > image.scale) {
|
||||
imageScale = image.scale;
|
||||
}
|
||||
|
||||
if (image) {
|
||||
// Decompress on background thread
|
||||
UIGraphicsBeginImageContextWithOptions(imageSize, NO, imageScale);
|
||||
[image drawInRect:(CGRect){{0, 0}, imageSize}];
|
||||
image = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
|
||||
// TODO: cache decompressed images at each requested size
|
||||
}
|
||||
|
||||
// Dispatch back to main thread
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
block(image, error);
|
||||
});
|
||||
}];
|
||||
|
||||
[task resume];
|
||||
return task;
|
||||
}
|
||||
|
||||
- (void)cancelDownload:(id)downloadToken
|
||||
{
|
||||
[(NSURLSessionDataTask *)downloadToken cancel];
|
||||
if (downloadToken) {
|
||||
dispatch_block_t block = downloadToken;
|
||||
block();
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
13E067571A70F44B002CDEE1 /* RCTView.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067501A70F44B002CDEE1 /* RCTView.m */; };
|
||||
13E067591A70F44B002CDEE1 /* UIView+ReactKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */; };
|
||||
830A229E1A66C68A008503DA /* RCTRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = 830A229D1A66C68A008503DA /* RCTRootView.m */; };
|
||||
830BA4551A8E3BDA00D53203 /* RCTCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BA4541A8E3BDA00D53203 /* RCTCache.m */; };
|
||||
832348161A77A5AA00B55238 /* Layout.c in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FC71A68125100A75B9A /* Layout.c */; };
|
||||
835DD1321A7FDFB600D561F7 /* RCTText.m in Sources */ = {isa = PBXBuildFile; fileRef = 835DD1311A7FDFB600D561F7 /* RCTText.m */; };
|
||||
83CBBA511A601E3B00E9B192 /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */; };
|
||||
|
@ -139,6 +140,8 @@
|
|||
830213F31A654E0800B993E6 /* RCTBridgeModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeModule.h; sourceTree = "<group>"; };
|
||||
830A229C1A66C68A008503DA /* RCTRootView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTRootView.h; sourceTree = "<group>"; };
|
||||
830A229D1A66C68A008503DA /* RCTRootView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTRootView.m; sourceTree = "<group>"; };
|
||||
830BA4531A8E3BDA00D53203 /* RCTCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTCache.h; sourceTree = "<group>"; };
|
||||
830BA4541A8E3BDA00D53203 /* RCTCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTCache.m; sourceTree = "<group>"; };
|
||||
835DD1301A7FDFB600D561F7 /* RCTText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTText.h; sourceTree = "<group>"; };
|
||||
835DD1311A7FDFB600D561F7 /* RCTText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTText.m; sourceTree = "<group>"; };
|
||||
83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSparseArray.h; sourceTree = "<group>"; };
|
||||
|
@ -200,18 +203,18 @@
|
|||
13B07FE01A69315300A75B9A /* Modules */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
13B080271A694C4900A75B9A /* RCTDataManager.h */,
|
||||
13B080281A694C4900A75B9A /* RCTDataManager.m */,
|
||||
13B07FE71A69327A00A75B9A /* RCTAlertManager.h */,
|
||||
13B07FE81A69327A00A75B9A /* RCTAlertManager.m */,
|
||||
13B080271A694C4900A75B9A /* RCTDataManager.h */,
|
||||
13B080281A694C4900A75B9A /* RCTDataManager.m */,
|
||||
13B07FE91A69327A00A75B9A /* RCTExceptionsManager.h */,
|
||||
13B07FEA1A69327A00A75B9A /* RCTExceptionsManager.m */,
|
||||
13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */,
|
||||
13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */,
|
||||
13B07FED1A69327A00A75B9A /* RCTTiming.h */,
|
||||
13B07FEE1A69327A00A75B9A /* RCTTiming.m */,
|
||||
13E067481A70F434002CDEE1 /* RCTUIManager.h */,
|
||||
13E067491A70F434002CDEE1 /* RCTUIManager.m */,
|
||||
13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */,
|
||||
13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */,
|
||||
);
|
||||
path = Modules;
|
||||
sourceTree = "<group>";
|
||||
|
@ -219,28 +222,6 @@
|
|||
13B07FF31A6947C200A75B9A /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */,
|
||||
13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */,
|
||||
13E0674B1A70F44B002CDEE1 /* RCTShadowView.h */,
|
||||
13E0674C1A70F44B002CDEE1 /* RCTShadowView.m */,
|
||||
13E0674F1A70F44B002CDEE1 /* RCTView.h */,
|
||||
13E067501A70F44B002CDEE1 /* RCTView.m */,
|
||||
13E0674D1A70F44B002CDEE1 /* RCTViewManager.h */,
|
||||
13E0674E1A70F44B002CDEE1 /* RCTViewManager.m */,
|
||||
13B07FF61A6947C200A75B9A /* RCTScrollView.h */,
|
||||
13B07FF71A6947C200A75B9A /* RCTScrollView.m */,
|
||||
13B07FF81A6947C200A75B9A /* RCTScrollViewManager.h */,
|
||||
13B07FF91A6947C200A75B9A /* RCTScrollViewManager.m */,
|
||||
13B07FFA1A6947C200A75B9A /* RCTShadowRawText.h */,
|
||||
13B07FFB1A6947C200A75B9A /* RCTShadowRawText.m */,
|
||||
137029571A6C197000575408 /* RCTRawTextManager.h */,
|
||||
137029581A6C197000575408 /* RCTRawTextManager.m */,
|
||||
13B07FFC1A6947C200A75B9A /* RCTShadowText.h */,
|
||||
13B07FFD1A6947C200A75B9A /* RCTShadowText.m */,
|
||||
835DD1301A7FDFB600D561F7 /* RCTText.h */,
|
||||
835DD1311A7FDFB600D561F7 /* RCTText.m */,
|
||||
13B080021A6947C200A75B9A /* RCTTextManager.h */,
|
||||
13B080031A6947C200A75B9A /* RCTTextManager.m */,
|
||||
13B0800C1A69489C00A75B9A /* RCTNavigator.h */,
|
||||
13B0800D1A69489C00A75B9A /* RCTNavigator.m */,
|
||||
13B0800E1A69489C00A75B9A /* RCTNavigatorManager.h */,
|
||||
|
@ -249,22 +230,44 @@
|
|||
13B080111A69489C00A75B9A /* RCTNavItem.m */,
|
||||
13B080121A69489C00A75B9A /* RCTNavItemManager.h */,
|
||||
13B080131A69489C00A75B9A /* RCTNavItemManager.m */,
|
||||
13B080141A69489C00A75B9A /* RCTTextField.h */,
|
||||
13B080151A69489C00A75B9A /* RCTTextField.m */,
|
||||
13B080161A69489C00A75B9A /* RCTTextFieldManager.h */,
|
||||
13B080171A69489C00A75B9A /* RCTTextFieldManager.m */,
|
||||
13B080181A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.h */,
|
||||
13B080191A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.m */,
|
||||
13B080231A694A8400A75B9A /* RCTWrapperViewController.h */,
|
||||
13B080241A694A8400A75B9A /* RCTWrapperViewController.m */,
|
||||
1370294E1A6990A100575408 /* RCTNetworkImageView.h */,
|
||||
1370294F1A6990A100575408 /* RCTNetworkImageView.m */,
|
||||
1370293F1A698FF000575408 /* RCTNetworkImageViewManager.h */,
|
||||
137029401A698FF000575408 /* RCTNetworkImageViewManager.m */,
|
||||
137029571A6C197000575408 /* RCTRawTextManager.h */,
|
||||
137029581A6C197000575408 /* RCTRawTextManager.m */,
|
||||
13B07FF61A6947C200A75B9A /* RCTScrollView.h */,
|
||||
13B07FF71A6947C200A75B9A /* RCTScrollView.m */,
|
||||
13B07FF81A6947C200A75B9A /* RCTScrollViewManager.h */,
|
||||
13B07FF91A6947C200A75B9A /* RCTScrollViewManager.m */,
|
||||
13B07FFA1A6947C200A75B9A /* RCTShadowRawText.h */,
|
||||
13B07FFB1A6947C200A75B9A /* RCTShadowRawText.m */,
|
||||
13B07FFC1A6947C200A75B9A /* RCTShadowText.h */,
|
||||
13B07FFD1A6947C200A75B9A /* RCTShadowText.m */,
|
||||
13E0674B1A70F44B002CDEE1 /* RCTShadowView.h */,
|
||||
13E0674C1A70F44B002CDEE1 /* RCTShadowView.m */,
|
||||
1302F0F91A78550100EBEF02 /* RCTStaticImage.h */,
|
||||
1302F0FA1A78550100EBEF02 /* RCTStaticImage.m */,
|
||||
1302F0FB1A78550100EBEF02 /* RCTStaticImageManager.h */,
|
||||
1302F0FC1A78550100EBEF02 /* RCTStaticImageManager.m */,
|
||||
835DD1301A7FDFB600D561F7 /* RCTText.h */,
|
||||
835DD1311A7FDFB600D561F7 /* RCTText.m */,
|
||||
13B080141A69489C00A75B9A /* RCTTextField.h */,
|
||||
13B080151A69489C00A75B9A /* RCTTextField.m */,
|
||||
13B080161A69489C00A75B9A /* RCTTextFieldManager.h */,
|
||||
13B080171A69489C00A75B9A /* RCTTextFieldManager.m */,
|
||||
13B080021A6947C200A75B9A /* RCTTextManager.h */,
|
||||
13B080031A6947C200A75B9A /* RCTTextManager.m */,
|
||||
13B080181A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.h */,
|
||||
13B080191A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.m */,
|
||||
13E0674F1A70F44B002CDEE1 /* RCTView.h */,
|
||||
13E067501A70F44B002CDEE1 /* RCTView.m */,
|
||||
13E0674D1A70F44B002CDEE1 /* RCTViewManager.h */,
|
||||
13E0674E1A70F44B002CDEE1 /* RCTViewManager.m */,
|
||||
13B080231A694A8400A75B9A /* RCTWrapperViewController.h */,
|
||||
13B080241A694A8400A75B9A /* RCTWrapperViewController.m */,
|
||||
13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */,
|
||||
13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
|
@ -300,38 +303,40 @@
|
|||
83CBBA491A601E3B00E9B192 /* Base */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
13DB9D681A8CC58200429C20 /* RCTAnimationType.h */,
|
||||
83CBBA4A1A601E3B00E9B192 /* RCTAssert.h */,
|
||||
83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */,
|
||||
13A1F71C1A75392D00D3D453 /* RCTKeyCommands.h */,
|
||||
13A1F71D1A75392D00D3D453 /* RCTKeyCommands.m */,
|
||||
83CBBA611A601EB200E9B192 /* RCTAutoInsetsProtocol.h */,
|
||||
83CBBA5E1A601EAA00E9B192 /* RCTBridge.h */,
|
||||
83CBBA5F1A601EAA00E9B192 /* RCTBridge.m */,
|
||||
830213F31A654E0800B993E6 /* RCTBridgeModule.h */,
|
||||
830BA4531A8E3BDA00D53203 /* RCTCache.h */,
|
||||
830BA4541A8E3BDA00D53203 /* RCTCache.m */,
|
||||
83CBBACA1A6023D300E9B192 /* RCTConvert.h */,
|
||||
83CBBACB1A6023D300E9B192 /* RCTConvert.m */,
|
||||
830213F31A654E0800B993E6 /* RCTBridgeModule.h */,
|
||||
830A229C1A66C68A008503DA /* RCTRootView.h */,
|
||||
830A229D1A66C68A008503DA /* RCTRootView.m */,
|
||||
83CBBA4C1A601E3B00E9B192 /* RCTInvalidating.h */,
|
||||
83CBBA651A601EF300E9B192 /* RCTEventDispatcher.h */,
|
||||
83CBBA661A601EF300E9B192 /* RCTEventDispatcher.m */,
|
||||
137029511A69923600575408 /* RCTImageDownloader.h */,
|
||||
137029521A69923600575408 /* RCTImageDownloader.m */,
|
||||
83CBBA4C1A601E3B00E9B192 /* RCTInvalidating.h */,
|
||||
83CBBA631A601ECA00E9B192 /* RCTJavaScriptExecutor.h */,
|
||||
83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */,
|
||||
83BEE46D1A6D19BC00B5863B /* RCTSparseArray.m */,
|
||||
13A1F71C1A75392D00D3D453 /* RCTKeyCommands.h */,
|
||||
13A1F71D1A75392D00D3D453 /* RCTKeyCommands.m */,
|
||||
83CBBA4D1A601E3B00E9B192 /* RCTLog.h */,
|
||||
83CBBA4E1A601E3B00E9B192 /* RCTLog.m */,
|
||||
13ED13891A80C9D40050A8F9 /* RCTPointerEvents.h */,
|
||||
83CBBA581A601E9000E9B192 /* RCTRedBox.h */,
|
||||
83CBBA591A601E9000E9B192 /* RCTRedBox.m */,
|
||||
830A229C1A66C68A008503DA /* RCTRootView.h */,
|
||||
830A229D1A66C68A008503DA /* RCTRootView.m */,
|
||||
13B07FCD1A683B5F00A75B9A /* RCTScrollableProtocol.h */,
|
||||
83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */,
|
||||
83BEE46D1A6D19BC00B5863B /* RCTSparseArray.m */,
|
||||
83CBBA961A6020BB00E9B192 /* RCTTouchHandler.h */,
|
||||
83CBBA971A6020BB00E9B192 /* RCTTouchHandler.m */,
|
||||
83CBBA4F1A601E3B00E9B192 /* RCTUtils.h */,
|
||||
83CBBA501A601E3B00E9B192 /* RCTUtils.m */,
|
||||
83CBBA621A601EB800E9B192 /* RCTViewNodeProtocol.h */,
|
||||
137029511A69923600575408 /* RCTImageDownloader.h */,
|
||||
137029521A69923600575408 /* RCTImageDownloader.m */,
|
||||
13B07FCD1A683B5F00A75B9A /* RCTScrollableProtocol.h */,
|
||||
13ED13891A80C9D40050A8F9 /* RCTPointerEvents.h */,
|
||||
13DB9D681A8CC58200429C20 /* RCTAnimationType.h */,
|
||||
);
|
||||
path = Base;
|
||||
sourceTree = "<group>";
|
||||
|
@ -445,6 +450,7 @@
|
|||
13B080081A6947C200A75B9A /* RCTShadowText.m in Sources */,
|
||||
13E067551A70F44B002CDEE1 /* RCTShadowView.m in Sources */,
|
||||
13B0801A1A69489C00A75B9A /* RCTNavigator.m in Sources */,
|
||||
830BA4551A8E3BDA00D53203 /* RCTCache.m in Sources */,
|
||||
134FCB3E1A6E7F0800051CC8 /* RCTWebViewExecutor.m in Sources */,
|
||||
13B0801C1A69489C00A75B9A /* RCTNavItem.m in Sources */,
|
||||
83CBBA691A601EF300E9B192 /* RCTEventDispatcher.m in Sources */,
|
||||
|
|
Loading…
Reference in New Issue