diff --git a/Examples/UIExplorer/AppStateExample.js b/Examples/UIExplorer/AppStateExample.js
new file mode 100644
index 000000000..ea6400b91
--- /dev/null
+++ b/Examples/UIExplorer/AppStateExample.js
@@ -0,0 +1,60 @@
+/**
+ * Copyright 2004-present Facebook. All Rights Reserved.
+ */
+'use strict';
+
+var React = require('react-native');
+var {
+ AppState,
+ StyleSheet,
+ Text,
+ TouchableHighlight,
+ View,
+} = React;
+
+var Button = React.createClass({
+ render: function() {
+ return (
+
+
+ {this.props.label}
+
+
+ );
+ }
+});
+
+var styles = StyleSheet.create({
+ button: {
+ padding: 10,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ buttonLabel: {
+ color: 'blue',
+ },
+});
+
+exports.title = 'AppState';
+exports.description = 'App background status and badge value';
+exports.examples = [
+{
+ title: 'Set Badge Number',
+ render: function() {
+ return (
+
+
+ );
+ },
+}];
diff --git a/Examples/UIExplorer/UIExplorerList.js b/Examples/UIExplorer/UIExplorerList.js
index e0cfee985..456e76b63 100644
--- a/Examples/UIExplorer/UIExplorerList.js
+++ b/Examples/UIExplorer/UIExplorerList.js
@@ -41,6 +41,7 @@ var EXAMPLES = [
require('./CameraRollExample.ios'),
require('./MapViewExample'),
require('./AdSupportIOSExample'),
+ require('./AppStateExample'),
];
var UIExplorerList = React.createClass({
diff --git a/Libraries/AppState/AppState.js b/Libraries/AppState/AppState.js
new file mode 100644
index 000000000..691ab9d69
--- /dev/null
+++ b/Libraries/AppState/AppState.js
@@ -0,0 +1,58 @@
+/**
+ * Copyright 2004-present Facebook. All Rights Reserved.
+ *
+ * @providesModule AppState
+ */
+'use strict';
+
+var NativeModules = require('NativeModulesDeprecated');
+var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
+var RKAppState = NativeModules.RKAppState;
+var RKReachability = NativeModules.RKReachability;
+var Subscribable = require('Subscribable');
+
+var keyMirror = require('keyMirror');
+
+var AppState = {
+
+ setApplicationIconBadgeNumber: function(number) {
+ RKAppState.setApplicationIconBadgeNumber(number);
+ },
+
+ getApplicationIconBadgeNumber: function(callback) {
+ RKAppState.getApplicationIconBadgeNumber(callback);
+ }
+}
+
+AppState.backgroundStatus = new Subscribable(
+ RCTDeviceEventEmitter,
+ 'appStateDidChange',
+ (resp) => resp.app_state,
+ RKAppState.getCurrentAppState
+);
+
+AppState.BackgroundStatus = keyMirror({
+ active: true,
+ background: true,
+ inactive: true,
+});
+
+// This check avoids redboxing if native RKReachability library isn't included in app
+// TODO: Move reachability API into separate JS module to prevent need for this
+if (RKReachability) {
+ AppState.networkReachability = new Subscribable(
+ RCTDeviceEventEmitter,
+ 'reachabilityDidChange',
+ (resp) => resp.network_reachability,
+ RKReachability.getCurrentReachability
+ );
+}
+
+AppState.NetworkReachability = keyMirror({
+ wifi: true,
+ cell: true,
+ none: true,
+ unknown: true,
+});
+
+module.exports = AppState;
diff --git a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj
index bfaa0413d..252d73cda 100644
--- a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj
+++ b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 1372B7371AB03E7B00659ED6 /* RCTReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 1372B7361AB03E7B00659ED6 /* RCTReachability.m */; };
58B512081A9E6CE300147676 /* RCTDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B512071A9E6CE300147676 /* RCTDataManager.m */; };
/* End PBXBuildFile section */
@@ -23,6 +24,8 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 1372B7351AB03E7B00659ED6 /* RCTReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTReachability.h; sourceTree = ""; };
+ 1372B7361AB03E7B00659ED6 /* RCTReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTReachability.m; sourceTree = ""; };
58B511DB1A9E6C8500147676 /* libRCTNetwork.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTNetwork.a; sourceTree = BUILT_PRODUCTS_DIR; };
58B512061A9E6CE300147676 /* RCTDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTDataManager.h; sourceTree = ""; };
58B512071A9E6CE300147676 /* RCTDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTDataManager.m; sourceTree = ""; };
@@ -44,6 +47,8 @@
children = (
58B512061A9E6CE300147676 /* RCTDataManager.h */,
58B512071A9E6CE300147676 /* RCTDataManager.m */,
+ 1372B7351AB03E7B00659ED6 /* RCTReachability.h */,
+ 1372B7361AB03E7B00659ED6 /* RCTReachability.m */,
58B511DC1A9E6C8500147676 /* Products */,
);
sourceTree = "";
@@ -112,6 +117,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 1372B7371AB03E7B00659ED6 /* RCTReachability.m in Sources */,
58B512081A9E6CE300147676 /* RCTDataManager.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
diff --git a/Libraries/Network/RCTReachability.h b/Libraries/Network/RCTReachability.h
new file mode 100644
index 000000000..c0bca96c7
--- /dev/null
+++ b/Libraries/Network/RCTReachability.h
@@ -0,0 +1,11 @@
+// Copyright 2004-present Facebook. All Rights Reserved.
+
+#import
+
+#import "RCTBridgeModule.h"
+
+@interface RCTReachability : NSObject
+
+- (instancetype)initWithHost:(NSString *)host NS_DESIGNATED_INITIALIZER;
+
+@end
diff --git a/Libraries/Network/RCTReachability.m b/Libraries/Network/RCTReachability.m
new file mode 100644
index 000000000..921d339bb
--- /dev/null
+++ b/Libraries/Network/RCTReachability.m
@@ -0,0 +1,85 @@
+// Copyright 2004-present Facebook. All Rights Reserved.
+
+#import "RCTReachability.h"
+
+#import "RCTBridge.h"
+#import "RCTEventDispatcher.h"
+
+static NSString *const RCTReachabilityStateUnknown = @"unknown";
+static NSString *const RCTReachabilityStateNone = @"none";
+static NSString *const RCTReachabilityStateWifi = @"wifi";
+static NSString *const RCTReachabilityStateCell = @"cell";
+
+@implementation RCTReachability
+{
+ SCNetworkReachabilityRef _reachability;
+ NSString *_status;
+}
+
+@synthesize bridge = _bridge;
+
+static void RCTReachabilityCallback(__unused SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info)
+{
+ RCTReachability *self = (__bridge id)info;
+ NSString *status = RCTReachabilityStateUnknown;
+ if ((flags & kSCNetworkReachabilityFlagsReachable) == 0 ||
+ (flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0) {
+ status = RCTReachabilityStateNone;
+ }
+
+#if TARGET_OS_IPHONE
+
+ else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {
+ status = RCTReachabilityStateCell;
+ }
+
+#endif
+
+ else {
+ status = RCTReachabilityStateWifi;
+ }
+
+ if (![status isEqualToString:self->_status]) {
+ self->_status = status;
+ [self->_bridge.eventDispatcher sendDeviceEventWithName:@"reachabilityDidChange"
+ body:@{@"network_reachability": status}];
+ }
+}
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithHost:(NSString *)host
+{
+ if ((self = [super init])) {
+ _status = RCTReachabilityStateUnknown;
+ _reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [host UTF8String]);
+ SCNetworkReachabilityContext context = { 0, ( __bridge void *)self, NULL, NULL, NULL };
+ SCNetworkReachabilitySetCallback(_reachability, RCTReachabilityCallback, &context);
+ SCNetworkReachabilityScheduleWithRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+ }
+ return self;
+}
+
+- (instancetype)init
+{
+ return [self initWithHost:@"http://apple.com"];
+}
+
+- (void)dealloc
+{
+ SCNetworkReachabilityUnscheduleFromRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+ CFRelease(_reachability);
+}
+
+#pragma mark - Public API
+
+// TODO: remove error callback - not needed except by Subscribable interface
+- (void)getCurrentReachability:(RCTResponseSenderBlock)getSuccess
+ withErrorCallback:(__unused RCTResponseSenderBlock)getError
+{
+ RCT_EXPORT();
+
+ getSuccess(@[@{@"network_reachability": _status}]);
+}
+
+@end
diff --git a/Libraries/react-native/react-native.js b/Libraries/react-native/react-native.js
index c673e4e0c..18c590c97 100644
--- a/Libraries/react-native/react-native.js
+++ b/Libraries/react-native/react-native.js
@@ -10,6 +10,7 @@ var ReactNative = {
Animation: require('Animation'),
ActivityIndicatorIOS: require('ActivityIndicatorIOS'),
AppRegistry: require('AppRegistry'),
+ AppState: require('AppState'),
AsyncStorage: require('AsyncStorage'),
CameraRoll: require('CameraRoll'),
DatePickerIOS: require('DatePickerIOS'),
diff --git a/ReactKit/Modules/RCTAppState.h b/ReactKit/Modules/RCTAppState.h
new file mode 100644
index 000000000..027379492
--- /dev/null
+++ b/ReactKit/Modules/RCTAppState.h
@@ -0,0 +1,7 @@
+// Copyright 2004-present Facebook. All Rights Reserved.
+
+#import "RCTBridgeModule.h"
+
+@interface RCTAppState : NSObject
+
+@end
diff --git a/ReactKit/Modules/RCTAppState.m b/ReactKit/Modules/RCTAppState.m
new file mode 100644
index 000000000..c4a145c1e
--- /dev/null
+++ b/ReactKit/Modules/RCTAppState.m
@@ -0,0 +1,105 @@
+// Copyright 2004-present Facebook. All Rights Reserved.
+
+#import "RCTAppState.h"
+
+#import "RCTAssert.h"
+#import "RCTBridge.h"
+#import "RCTEventDispatcher.h"
+
+static NSString *RCTCurrentAppBackgroundState()
+{
+ static NSDictionary *states;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ states = @{
+ @(UIApplicationStateActive): @"active",
+ @(UIApplicationStateBackground): @"background",
+ @(UIApplicationStateInactive): @"inactive"
+ };
+ });
+
+ return states[@([[UIApplication sharedApplication] applicationState])] ?: @"unknown";
+}
+
+@implementation RCTAppState
+{
+ NSString *_lastKnownState;
+}
+
+@synthesize bridge = _bridge;
+
+#pragma mark - Lifecycle
+
+- (instancetype)init
+{
+ if ((self = [super init])) {
+
+ _lastKnownState = RCTCurrentAppBackgroundState();
+
+ for (NSString *name in @[UIApplicationDidBecomeActiveNotification,
+ UIApplicationDidEnterBackgroundNotification,
+ UIApplicationDidFinishLaunchingNotification]) {
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(handleAppStateDidChange)
+ name:name
+ object:nil];
+ }
+ }
+ return self;
+}
+
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+#pragma mark - App Notification Methods
+
+- (void)handleAppStateDidChange
+{
+ NSString *newState = RCTCurrentAppBackgroundState();
+ if (![newState isEqualToString:_lastKnownState]) {
+ _lastKnownState = newState;
+ [_bridge.eventDispatcher sendDeviceEventWithName:@"appStateDidChange"
+ body:@{@"app_state": _lastKnownState}];
+ }
+}
+
+#pragma mark - Public API
+
+/**
+ * Get the current background/foreground state of the app
+ */
+- (void)getCurrentAppState:(RCTResponseSenderBlock)callback
+ error:(__unused RCTResponseSenderBlock)error
+{
+ RCT_EXPORT();
+
+ callback(@[@{@"app_state": _lastKnownState}]);
+}
+
+/**
+ * Update the application icon badge number on the home screen
+ */
+- (void)setApplicationIconBadgeNumber:(NSInteger)number
+{
+ RCT_EXPORT();
+
+ [UIApplication sharedApplication].applicationIconBadgeNumber = number;
+}
+
+/**
+ * Get the current application icon badge number on the home screen
+ */
+- (void)getApplicationIconBadgeNumber:(RCTResponseSenderBlock)callback
+{
+ RCT_EXPORT();
+
+ callback(@[
+ @([UIApplication sharedApplication].applicationIconBadgeNumber)
+ ]);
+}
+
+@end
diff --git a/ReactKit/Modules/RCTExceptionsManager.h b/ReactKit/Modules/RCTExceptionsManager.h
index 02ea33202..340c7878b 100644
--- a/ReactKit/Modules/RCTExceptionsManager.h
+++ b/ReactKit/Modules/RCTExceptionsManager.h
@@ -4,6 +4,14 @@
#import "RCTBridgeModule.h"
-@interface RCTExceptionsManager : NSObject
+@protocol RCTExceptionsManagerDelegate
+
+- (void)unhandledJSExceptionWithMessage:(NSString *)message stack:(NSArray *)stack;
+
+@end
+
+@interface RCTExceptionsManager : NSObject
+
+- (instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER;
@end
diff --git a/ReactKit/Modules/RCTExceptionsManager.m b/ReactKit/Modules/RCTExceptionsManager.m
index 29cacf6c8..4d1b5c0ee 100644
--- a/ReactKit/Modules/RCTExceptionsManager.m
+++ b/ReactKit/Modules/RCTExceptionsManager.m
@@ -5,12 +5,32 @@
#import "RCTRedBox.h"
@implementation RCTExceptionsManager
+{
+ __weak id _delegate;
+}
+
+- (instancetype)initWithDelegate:(id)delegate
+{
+ if ((self = [super init])) {
+ _delegate = delegate;
+ }
+ return self;
+}
+
+- (instancetype)init
+{
+ return [self initWithDelegate:nil];
+}
- (void)reportUnhandledExceptionWithMessage:(NSString *)message stack:(NSArray *)stack
{
RCT_EXPORT(reportUnhandledException);
- [[RCTRedBox sharedInstance] showErrorMessage:message withStack:stack];
+ if (_delegate) {
+ [_delegate unhandledJSExceptionWithMessage:message stack:stack];
+ } else {
+ [[RCTRedBox sharedInstance] showErrorMessage:message withStack:stack];
+ }
}
- (void)updateExceptionMessage:(NSString *)message stack:(NSArray *)stack
diff --git a/ReactKit/ReactKit.xcodeproj/project.pbxproj b/ReactKit/ReactKit.xcodeproj/project.pbxproj
index 496c2c540..73ecaffef 100644
--- a/ReactKit/ReactKit.xcodeproj/project.pbxproj
+++ b/ReactKit/ReactKit.xcodeproj/project.pbxproj
@@ -11,6 +11,7 @@
134FCB3D1A6E7F0800051CC8 /* RCTContextExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 134FCB3A1A6E7F0800051CC8 /* RCTContextExecutor.m */; };
134FCB3E1A6E7F0800051CC8 /* RCTWebViewExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 134FCB3C1A6E7F0800051CC8 /* RCTWebViewExecutor.m */; };
13723B501A82FD3C00F88898 /* RCTStatusBarManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */; };
+ 1372B70A1AB030C200659ED6 /* RCTAppState.m in Sources */ = {isa = PBXBuildFile; fileRef = 1372B7091AB030C200659ED6 /* RCTAppState.m */; };
137327E71AA5CF210034F82E /* RCTTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 137327E01AA5CF210034F82E /* RCTTabBar.m */; };
137327E81AA5CF210034F82E /* RCTTabBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 137327E21AA5CF210034F82E /* RCTTabBarItem.m */; };
137327E91AA5CF210034F82E /* RCTTabBarItemManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 137327E41AA5CF210034F82E /* RCTTabBarItemManager.m */; };
@@ -34,11 +35,11 @@
13E067561A70F44B002CDEE1 /* RCTViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E0674E1A70F44B002CDEE1 /* RCTViewManager.m */; };
13E067571A70F44B002CDEE1 /* RCTView.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067501A70F44B002CDEE1 /* RCTView.m */; };
13E067591A70F44B002CDEE1 /* UIView+ReactKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */; };
+ 14435CE51AAC4AE100FC20F4 /* RCTMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 14435CE21AAC4AE100FC20F4 /* RCTMap.m */; };
+ 14435CE61AAC4AE100FC20F4 /* RCTMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14435CE41AAC4AE100FC20F4 /* RCTMapManager.m */; };
14F3620D1AABD06A001CE568 /* RCTSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F362081AABD06A001CE568 /* RCTSwitch.m */; };
14F3620E1AABD06A001CE568 /* RCTSwitchManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F3620A1AABD06A001CE568 /* RCTSwitchManager.m */; };
14F484561AABFCE100FDF6B9 /* RCTSliderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F484551AABFCE100FDF6B9 /* RCTSliderManager.m */; };
- 14435CE51AAC4AE100FC20F4 /* RCTMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 14435CE21AAC4AE100FC20F4 /* RCTMap.m */; };
- 14435CE61AAC4AE100FC20F4 /* RCTMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14435CE41AAC4AE100FC20F4 /* RCTMapManager.m */; };
58114A161AAE854800E7D092 /* RCTPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 58114A131AAE854800E7D092 /* RCTPicker.m */; };
58114A171AAE854800E7D092 /* RCTPickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 58114A151AAE854800E7D092 /* RCTPickerManager.m */; };
58C571C11AA56C1900CDF9C8 /* RCTDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C571BF1AA56C1900CDF9C8 /* RCTDatePickerManager.m */; };
@@ -80,6 +81,8 @@
134FCB3C1A6E7F0800051CC8 /* RCTWebViewExecutor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTWebViewExecutor.m; sourceTree = ""; };
13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTStatusBarManager.h; sourceTree = ""; };
13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTStatusBarManager.m; sourceTree = ""; };
+ 1372B7081AB030C200659ED6 /* RCTAppState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTAppState.h; sourceTree = ""; };
+ 1372B7091AB030C200659ED6 /* RCTAppState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTAppState.m; sourceTree = ""; };
137327DF1AA5CF210034F82E /* RCTTabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTTabBar.h; sourceTree = ""; };
137327E01AA5CF210034F82E /* RCTTabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTTabBar.m; sourceTree = ""; };
137327E11AA5CF210034F82E /* RCTTabBarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTTabBarItem.h; sourceTree = ""; };
@@ -132,16 +135,16 @@
13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+ReactKit.h"; sourceTree = ""; };
13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+ReactKit.m"; sourceTree = ""; };
13EFFCCF1A98E6FE002607DC /* RCTJSMethodRegistrar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTJSMethodRegistrar.h; sourceTree = ""; };
+ 14435CE11AAC4AE100FC20F4 /* RCTMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTMap.h; sourceTree = ""; };
+ 14435CE21AAC4AE100FC20F4 /* RCTMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTMap.m; sourceTree = ""; };
+ 14435CE31AAC4AE100FC20F4 /* RCTMapManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTMapManager.h; sourceTree = ""; };
+ 14435CE41AAC4AE100FC20F4 /* RCTMapManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTMapManager.m; sourceTree = ""; };
14F362071AABD06A001CE568 /* RCTSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSwitch.h; sourceTree = ""; };
14F362081AABD06A001CE568 /* RCTSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTSwitch.m; sourceTree = ""; };
14F362091AABD06A001CE568 /* RCTSwitchManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSwitchManager.h; sourceTree = ""; };
14F3620A1AABD06A001CE568 /* RCTSwitchManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTSwitchManager.m; sourceTree = ""; };
14F484541AABFCE100FDF6B9 /* RCTSliderManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSliderManager.h; sourceTree = ""; };
14F484551AABFCE100FDF6B9 /* RCTSliderManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTSliderManager.m; sourceTree = ""; };
- 14435CE11AAC4AE100FC20F4 /* RCTMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTMap.h; sourceTree = ""; };
- 14435CE21AAC4AE100FC20F4 /* RCTMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTMap.m; sourceTree = ""; };
- 14435CE31AAC4AE100FC20F4 /* RCTMapManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTMapManager.h; sourceTree = ""; };
- 14435CE41AAC4AE100FC20F4 /* RCTMapManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTMapManager.m; sourceTree = ""; };
58114A121AAE854800E7D092 /* RCTPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTPicker.h; sourceTree = ""; };
58114A131AAE854800E7D092 /* RCTPicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTPicker.m; sourceTree = ""; };
58114A141AAE854800E7D092 /* RCTPickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTPickerManager.h; sourceTree = ""; };
@@ -214,6 +217,8 @@
13B07FE01A69315300A75B9A /* Modules */ = {
isa = PBXGroup;
children = (
+ 1372B7081AB030C200659ED6 /* RCTAppState.h */,
+ 1372B7091AB030C200659ED6 /* RCTAppState.m */,
13B07FE71A69327A00A75B9A /* RCTAlertManager.h */,
13B07FE81A69327A00A75B9A /* RCTAlertManager.m */,
83C9110E1AAE6521001323A3 /* RCTAnimationManager.h */,
@@ -222,8 +227,6 @@
58114A4E1AAE93D500E7D092 /* RCTAsyncLocalStorage.m */,
13B07FE91A69327A00A75B9A /* RCTExceptionsManager.h */,
13B07FEA1A69327A00A75B9A /* RCTExceptionsManager.m */,
- 5F5F0D971A9E456B001279FA /* RCTLocationObserver.h */,
- 5F5F0D981A9E456B001279FA /* RCTLocationObserver.m */,
13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */,
13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */,
13B07FED1A69327A00A75B9A /* RCTTiming.h */,
@@ -456,6 +459,7 @@
13B080261A694A8400A75B9A /* RCTWrapperViewController.m in Sources */,
13B080051A6947C200A75B9A /* RCTScrollView.m in Sources */,
13B07FF21A69327A00A75B9A /* RCTTiming.m in Sources */,
+ 1372B70A1AB030C200659ED6 /* RCTAppState.m in Sources */,
13B0801F1A69489C00A75B9A /* RCTTextFieldManager.m in Sources */,
134FCB3D1A6E7F0800051CC8 /* RCTContextExecutor.m in Sources */,
13E067591A70F44B002CDEE1 /* UIView+ReactKit.m in Sources */,