talkol 8 years ago
parent
commit
3faaa08cad
78 changed files with 4649 additions and 1 deletions
  1. 142
    0
      .gitignore
  2. 1
    0
      .npmignore
  3. 20
    0
      LICENSE
  4. 127
    1
      README.md
  5. 65
    0
      example-redux/.flowconfig
  6. 34
    0
      example-redux/.gitignore
  7. 1
    0
      example-redux/.watchmanconfig
  8. 126
    0
      example-redux/android/app/build.gradle
  9. 67
    0
      example-redux/android/app/proguard-rules.pro
  10. 97
    0
      example-redux/android/app/react.gradle
  11. 23
    0
      example-redux/android/app/src/main/AndroidManifest.xml
  12. 40
    0
      example-redux/android/app/src/main/java/com/exampleredux/MainActivity.java
  13. BIN
      example-redux/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  14. BIN
      example-redux/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  15. BIN
      example-redux/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  16. BIN
      example-redux/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  17. 3
    0
      example-redux/android/app/src/main/res/values/strings.xml
  18. 8
    0
      example-redux/android/app/src/main/res/values/styles.xml
  19. 24
    0
      example-redux/android/build.gradle
  20. 20
    0
      example-redux/android/gradle.properties
  21. BIN
      example-redux/android/gradle/wrapper/gradle-wrapper.jar
  22. 5
    0
      example-redux/android/gradle/wrapper/gradle-wrapper.properties
  23. 164
    0
      example-redux/android/gradlew
  24. 90
    0
      example-redux/android/gradlew.bat
  25. 3
    0
      example-redux/android/settings.gradle
  26. 51
    0
      example-redux/index.android.js
  27. 52
    0
      example-redux/index.ios.js
  28. 763
    0
      example-redux/ios/exampleRedux.xcodeproj/project.pbxproj
  29. 112
    0
      example-redux/ios/exampleRedux.xcodeproj/xcshareddata/xcschemes/exampleRedux.xcscheme
  30. 16
    0
      example-redux/ios/exampleRedux/AppDelegate.h
  31. 57
    0
      example-redux/ios/exampleRedux/AppDelegate.m
  32. 42
    0
      example-redux/ios/exampleRedux/Base.lproj/LaunchScreen.xib
  33. 38
    0
      example-redux/ios/exampleRedux/Images.xcassets/AppIcon.appiconset/Contents.json
  34. 48
    0
      example-redux/ios/exampleRedux/Info.plist
  35. 18
    0
      example-redux/ios/exampleRedux/main.m
  36. 24
    0
      example-redux/ios/exampleReduxTests/Info.plist
  37. 70
    0
      example-redux/ios/exampleReduxTests/exampleReduxTests.m
  38. 11
    0
      example-redux/package.json
  39. 65
    0
      example/.flowconfig
  40. 34
    0
      example/.gitignore
  41. 1
    0
      example/.watchmanconfig
  42. 126
    0
      example/android/app/build.gradle
  43. 67
    0
      example/android/app/proguard-rules.pro
  44. 97
    0
      example/android/app/react.gradle
  45. 23
    0
      example/android/app/src/main/AndroidManifest.xml
  46. 40
    0
      example/android/app/src/main/java/com/example/MainActivity.java
  47. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  48. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  49. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  50. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  51. 3
    0
      example/android/app/src/main/res/values/strings.xml
  52. 8
    0
      example/android/app/src/main/res/values/styles.xml
  53. 24
    0
      example/android/build.gradle
  54. 20
    0
      example/android/gradle.properties
  55. BIN
      example/android/gradle/wrapper/gradle-wrapper.jar
  56. 5
    0
      example/android/gradle/wrapper/gradle-wrapper.properties
  57. 164
    0
      example/android/gradlew
  58. 90
    0
      example/android/gradlew.bat
  59. 3
    0
      example/android/settings.gradle
  60. 51
    0
      example/index.android.js
  61. 52
    0
      example/index.ios.js
  62. 763
    0
      example/ios/example.xcodeproj/project.pbxproj
  63. 112
    0
      example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme
  64. 16
    0
      example/ios/example/AppDelegate.h
  65. 57
    0
      example/ios/example/AppDelegate.m
  66. 42
    0
      example/ios/example/Base.lproj/LaunchScreen.xib
  67. 38
    0
      example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json
  68. 48
    0
      example/ios/example/Info.plist
  69. 18
    0
      example/ios/example/main.m
  70. 24
    0
      example/ios/exampleTests/Info.plist
  71. 70
    0
      example/ios/exampleTests/exampleTests.m
  72. 11
    0
      example/package.json
  73. 7
    0
      index.js
  74. 26
    0
      package.json
  75. 25
    0
      src/Navigation.js
  76. 24
    0
      src/Screen.js
  77. 126
    0
      src/platformSpecific.ios.js
  78. 7
    0
      src/utils.js

+ 142
- 0
.gitignore View File

@@ -0,0 +1,142 @@
1
+npm-debug.log
2
+
3
+#########################
4
+# .gitignore file for Xcode5
5
+#
6
+# NB: if you are storing "built" products, this WILL NOT WORK,
7
+#   and you should use a different .gitignore (or none at all)
8
+# This file is for SOURCE projects, where there are many extra
9
+#   files that we want to exclude
10
+#
11
+# For updates, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects
12
+#   and https://gist.github.com/adamgit/3786883
13
+#########################
14
+
15
+#####
16
+# OS X temporary files that should never be committed
17
+
18
+.DS_Store
19
+*.swp
20
+*.lock
21
+profile
22
+# cocoapods specific exclusions
23
+!Podfile.lock
24
+!Manifest.lock
25
+
26
+#### Code coverage
27
+# json file which is used by Xcode plugin called PuncoverPlugin to show code coverrage informtaion in the Xcode gutter
28
+# it is generated using Slather
29
+.gutter.json
30
+
31
+####
32
+# Xcode temporary files that should never be committed
33
+#
34
+# NB: NIB/XIB files still exist even on Storyboard projects, so we want this...
35
+
36
+*~.nib
37
+
38
+
39
+####
40
+# Xcode build files -
41
+#
42
+# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData"
43
+
44
+DerivedData/
45
+
46
+# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build"
47
+
48
+build/
49
+
50
+
51
+#####
52
+# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)
53
+#
54
+# This is complicated:
55
+#
56
+# SOMETIMES you need to put this file in version control.
57
+# Apple designed it poorly - if you use "custom executables", they are
58
+#  saved in this file.
59
+# 99% of projects do NOT use those, so they do NOT want to version control this file.
60
+#  ..but if you're in the 1%, comment out the line "*.pbxuser"
61
+
62
+*.pbxuser
63
+*.mode1v3
64
+*.mode2v3
65
+*.perspectivev3
66
+#    NB: also, whitelist the default ones, some projects need to use these
67
+!default.pbxuser
68
+!default.mode1v3
69
+!default.mode2v3
70
+!default.perspectivev3
71
+
72
+
73
+####
74
+# Xcode 4 - semi-personal settings, often included in workspaces
75
+#
76
+# You can safely ignore the xcuserdata files - but do NOT ignore the files next to them
77
+#
78
+
79
+xcuserdata
80
+
81
+####
82
+# XCode 4 workspaces - more detailed
83
+#
84
+# Workspaces are important! They are a core feature of Xcode - don't exclude them :)
85
+#
86
+# Workspace layout is quite spammy. For reference:
87
+#
88
+# (root)/
89
+#   (project-name).xcodeproj/
90
+#     project.pbxproj
91
+#     project.xcworkspace/
92
+#       contents.xcworkspacedata
93
+#       xcuserdata/
94
+#         (your name)/xcuserdatad/
95
+#     xcuserdata/
96
+#       (your name)/xcuserdatad/
97
+#
98
+#
99
+#
100
+# Xcode 4 workspaces - SHARED
101
+#
102
+# This is UNDOCUMENTED (google: "developer.apple.com xcshareddata" - 0 results
103
+# But if you're going to kill personal workspaces, at least keep the shared ones...
104
+#
105
+#
106
+!xcshareddata
107
+
108
+####
109
+# XCode 4 build-schemes
110
+#
111
+# PRIVATE ones are stored inside xcuserdata
112
+!xcschemes
113
+
114
+####
115
+# Xcode 4 - Deprecated classes
116
+#
117
+# Allegedly, if you manually "deprecate" your classes, they get moved here.
118
+#
119
+# We're using source-control, so this is a "feature" that we do not want!
120
+
121
+*.moved-aside
122
+
123
+####
124
+# Xcode 5 -  Source Control files
125
+#
126
+# Xcode 5 introduced a new file type .xccheckout. This files contains VCS metadata
127
+# and should therefore not be checked into the VCS.
128
+
129
+*.xccheckout
130
+
131
+####
132
+# Xcode 7
133
+#
134
+# Code coverage files
135
+
136
+*.gcda
137
+*.gcno
138
+
139
+####
140
+# UNKNOWN: recommended by others, but I can't discover what these files are
141
+#
142
+# ...none. Everything is now explained.:

+ 1
- 0
.npmignore View File

@@ -0,0 +1 @@
1
+example/

+ 20
- 0
LICENSE View File

@@ -0,0 +1,20 @@
1
+The MIT License (MIT)
2
+
3
+Copyright (c) 2013 Steve
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+this software and associated documentation files (the "Software"), to deal in
7
+the Software without restriction, including without limitation the rights to
8
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+the Software, and to permit persons to whom the Software is furnished to do so,
10
+subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 127
- 1
README.md View File

@@ -1,3 +1,129 @@
1 1
 # React Native Navigation
2 2
 
3
-Created by talkol
3
+### `Navigation`
4
+
5
+App-wide support for 100% native navigation with potential isolation support.
6
+
7
+#### Setup your demo project
8
+
9
+This would normally go in your `index.ios.js`
10
+
11
+```js
12
+import { Navigation } from 'react-native-navigation';
13
+
14
+// import the components for your root screens (or the packager will not bundle them)
15
+// they all need to be registered with Navigation.registerScreen
16
+import './FirstTabScreen';
17
+import './SecondTabScreen';
18
+
19
+// start the app
20
+Navigation.startTabBasedApp([
21
+  {
22
+    title: 'One', // tab title
23
+    screen: 'example.FirstTabScreen', // unique ID registered with Navigation.registerScreen
24
+    icon: require('./img/one.png'), // local asset for tab icon (unselected state)
25
+    selectedIcon: require('./img/one_selected.png'), // local asset for tab icon (selected state)
26
+    screenTitle: 'Screen One', // navigation bar title
27
+    navigatorStyle: {} // style the navigator for this screen (optional)
28
+  },
29
+  {
30
+    title: 'Two',
31
+    screen: 'example.SecondTabScreen',
32
+    icon: require('./img/two.png'),
33
+    selectedIcon: require('./img/two_selected.png'),
34
+    screenTitle: 'Screen Two'
35
+  }
36
+]);
37
+```
38
+
39
+#### Slightly modify your screen components
40
+
41
+Every screen that you want to be able to place in a tab, push to the navigation stack or present modally needs to follow two basic conventions:
42
+
43
+1. Normally your React components extend `React.Component`, in order to get access to the `navigator` you need to extend `Screen` instead.
44
+
45
+2. You need to register your component since it's displayed as a separate React root. Register a unique ID with `Navigation.registerScreen`.
46
+
47
+> Note: Since your screens will potentially be bundled with other packages, your registered name must be **unique**! Follow a namespacing convention like `packageName.ScreenName`.
48
+
49
+```js
50
+import { Navigation, Screen } from 'react-native-navigation';
51
+
52
+class ExampleScreen extends Screen {
53
+  static navigatorStyle = {}; // style the navigator for this screen (optional)
54
+  constructor(props) {
55
+    super(props);
56
+  }
57
+  render() {
58
+    return (
59
+      <View style={styles.container}>...</View>
60
+    );
61
+  }
62
+}
63
+
64
+// register all screens with Navigation.registerScreen
65
+Navigation.registerScreen('example.ScreenOne', () => ExampleScreen);
66
+```
67
+
68
+#### Navigation API (how to push and pop)
69
+
70
+This API is available through the `navigator` object. When your screen components extend `Screen`, they have `this.navigator` available and initialized.
71
+
72
+```js
73
+this.navigator.push({
74
+  screen: 'example.ScreenThree', // unique ID registered with Navigation.registerScreen
75
+  title: undefined, // navigation bar title of the pushed screen (optional)
76
+  passProps: {}, // simple serializable object that will pass as props to the pushed component (optional)
77
+  animated: true, // does the push have transition animation or does it happen immediately (optional)
78
+  backButtonTitle: undefined, // override the back button title (optional)
79
+  navigatorStyle: {} // override the navigator style for the pushed screen (optional)
80
+});
81
+
82
+this.navigator.pop({
83
+  animated: true // does the pop have transition animation or does it happen immediately (optional)
84
+});
85
+```
86
+
87
+#### All types of apps you can create
88
+
89
+* App based on several tabs (usually 2-5), a very common pattern in iOS (like Facebook app or the iOS Contacts app). Every tab has its own navigation stack with a native nav bar.
90
+
91
+```js
92
+Navigation.startTabBasedApp([
93
+  {
94
+    title: 'One', // tab title
95
+    screen: 'example.FirstTabScreen', // unique ID registered with Navigation.registerScreen
96
+    icon: require('./img/one.png'), // local asset for tab icon (unselected state)
97
+    selectedIcon: require('./img/one_selected.png'), // local asset for tab icon (selected state)
98
+    screenTitle: 'Screen One', // navigation bar title
99
+    navigatorStyle: {} // style the navigator for this screen (optional)
100
+  },
101
+  {
102
+    title: 'Two',
103
+    screen: 'example.SecondTabScreen',
104
+    icon: require('./img/two.png'),
105
+    selectedIcon: require('./img/two_selected.png'),
106
+    screenTitle: 'Screen Two'
107
+  }
108
+]);
109
+```
110
+
111
+* App based on a single screen (like the iOS Calendar or Settings app). The screen will receive its own navigation stack with a native nav bar.
112
+
113
+```js
114
+Navigation.startSingleScreenApp({
115
+  screen: 'example.WelcomeScreen', // unique ID registered with Navigation.registerScreen
116
+  screenTitle: 'Welcome', // navigation bar title
117
+  navigatorStyle: {} // style the navigator for this screen (optional)
118
+});
119
+```
120
+
121
+It is also possible to switch between types of apps while the app is running. This can be useful for example when switching from a login mode (which has no tabs = `startSingleScreenApp`) to the actual app itself (which has tabs = `startTabBasedApp`). Please note that when switching formats, the entire "old" app will be unmounted and released.
122
+
123
+> Tip: The other pattern of implementing login is having just one app type (like tabs) and showing the login dialog as a modal that hides the tabs when the app is launched. When login is completed, this modal is dismissed.
124
+
125
+#### Styling the navigator
126
+
127
+You can style the navigator appearance and behavior by passing a `navigatorStyle` object. This object can be passed when the screen is originally created; can be defined per-screen in the `static navigatorStyle = {};` on `Screen`; and can be overridden when a screen is pushed.
128
+
129
+All supported styles are defined [here](https://github.com/wix/react-native-controllers#styling-navigation).

+ 65
- 0
example-redux/.flowconfig View File

@@ -0,0 +1,65 @@
1
+[ignore]
2
+
3
+# We fork some components by platform.
4
+.*/*.web.js
5
+.*/*.android.js
6
+
7
+# Some modules have their own node_modules with overlap
8
+.*/node_modules/node-haste/.*
9
+
10
+# Ugh
11
+.*/node_modules/babel.*
12
+.*/node_modules/babylon.*
13
+.*/node_modules/invariant.*
14
+
15
+# Ignore react and fbjs where there are overlaps, but don't ignore
16
+# anything that react-native relies on
17
+.*/node_modules/fbjs/lib/Map.js
18
+.*/node_modules/fbjs/lib/Promise.js
19
+.*/node_modules/fbjs/lib/fetch.js
20
+.*/node_modules/fbjs/lib/ExecutionEnvironment.js
21
+.*/node_modules/fbjs/lib/isEmpty.js
22
+.*/node_modules/fbjs/lib/crc32.js
23
+.*/node_modules/fbjs/lib/ErrorUtils.js
24
+
25
+# Flow has a built-in definition for the 'react' module which we prefer to use
26
+# over the currently-untyped source
27
+.*/node_modules/react/react.js
28
+.*/node_modules/react/lib/React.js
29
+.*/node_modules/react/lib/ReactDOM.js
30
+
31
+# Ignore commoner tests
32
+.*/node_modules/commoner/test/.*
33
+
34
+# See https://github.com/facebook/flow/issues/442
35
+.*/react-tools/node_modules/commoner/lib/reader.js
36
+
37
+# Ignore jest
38
+.*/node_modules/jest-cli/.*
39
+
40
+# Ignore Website
41
+.*/website/.*
42
+
43
+[include]
44
+
45
+[libs]
46
+node_modules/react-native/Libraries/react-native/react-native-interface.js
47
+
48
+[options]
49
+module.system=haste
50
+
51
+munge_underscores=true
52
+
53
+module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
54
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\)$' -> 'RelativeImageStub'
55
+
56
+suppress_type=$FlowIssue
57
+suppress_type=$FlowFixMe
58
+suppress_type=$FixMe
59
+
60
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
61
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
62
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
63
+
64
+[version]
65
+0.21.0

+ 34
- 0
example-redux/.gitignore View File

@@ -0,0 +1,34 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+
25
+# Android/IJ
26
+#
27
+.idea
28
+.gradle
29
+local.properties
30
+
31
+# node.js
32
+#
33
+node_modules/
34
+npm-debug.log

+ 1
- 0
example-redux/.watchmanconfig View File

@@ -0,0 +1 @@
1
+{}

+ 126
- 0
example-redux/android/app/build.gradle View File

@@ -0,0 +1,126 @@
1
+apply plugin: "com.android.application"
2
+
3
+import com.android.build.OutputFile
4
+
5
+/**
6
+ * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7
+ * and bundleReleaseJsAndAssets).
8
+ * These basically call `react-native bundle` with the correct arguments during the Android build
9
+ * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10
+ * bundle directly from the development server. Below you can see all the possible configurations
11
+ * and their defaults. If you decide to add a configuration block, make sure to add it before the
12
+ * `apply from: "react.gradle"` line.
13
+ *
14
+ * project.ext.react = [
15
+ *   // the name of the generated asset file containing your JS bundle
16
+ *   bundleAssetName: "index.android.bundle",
17
+ *
18
+ *   // the entry file for bundle generation
19
+ *   entryFile: "index.android.js",
20
+ *
21
+ *   // whether to bundle JS and assets in debug mode
22
+ *   bundleInDebug: false,
23
+ *
24
+ *   // whether to bundle JS and assets in release mode
25
+ *   bundleInRelease: true,
26
+ *
27
+ *   // whether to bundle JS and assets in another build variant (if configured).
28
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
29
+ *   // The configuration property can be in the following formats
30
+ *   //         'bundleIn${productFlavor}${buildType}'
31
+ *   //         'bundleIn${buildType}'
32
+ *   // bundleInFreeDebug: true,
33
+ *   // bundleInPaidRelease: true,
34
+ *   // bundleInBeta: true,
35
+ *
36
+ *   // the root of your project, i.e. where "package.json" lives
37
+ *   root: "../../",
38
+ *
39
+ *   // where to put the JS bundle asset in debug mode
40
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
41
+ *
42
+ *   // where to put the JS bundle asset in release mode
43
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
44
+ *
45
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
46
+ *   // require('./image.png')), in debug mode
47
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
48
+ *
49
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
50
+ *   // require('./image.png')), in release mode
51
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
52
+ *
53
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
54
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
55
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
56
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
57
+ *   // for example, you might want to remove it from here.
58
+ *   inputExcludes: ["android/**", "ios/**"]
59
+ * ]
60
+ */
61
+
62
+apply from: "react.gradle"
63
+
64
+/**
65
+ * Set this to true to create two separate APKs instead of one:
66
+ *   - An APK that only works on ARM devices
67
+ *   - An APK that only works on x86 devices
68
+ * The advantage is the size of the APK is reduced by about 4MB.
69
+ * Upload all the APKs to the Play Store and people will download
70
+ * the correct one based on the CPU architecture of their device.
71
+ */
72
+def enableSeparateBuildPerCPUArchitecture = false
73
+
74
+/**
75
+ * Run Proguard to shrink the Java bytecode in release builds.
76
+ */
77
+def enableProguardInReleaseBuilds = false
78
+
79
+android {
80
+    compileSdkVersion 23
81
+    buildToolsVersion "23.0.1"
82
+
83
+    defaultConfig {
84
+        applicationId "com.exampleredux"
85
+        minSdkVersion 16
86
+        targetSdkVersion 22
87
+        versionCode 1
88
+        versionName "1.0"
89
+        ndk {
90
+            abiFilters "armeabi-v7a", "x86"
91
+        }
92
+    }
93
+    splits {
94
+        abi {
95
+            reset()
96
+            enable enableSeparateBuildPerCPUArchitecture
97
+            universalApk false  // If true, also generate a universal APK
98
+            include "armeabi-v7a", "x86"
99
+        }
100
+    }
101
+    buildTypes {
102
+        release {
103
+            minifyEnabled enableProguardInReleaseBuilds
104
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
105
+        }
106
+    }
107
+    // applicationVariants are e.g. debug, release
108
+    applicationVariants.all { variant ->
109
+        variant.outputs.each { output ->
110
+            // For each separate APK per architecture, set a unique version code as described here:
111
+            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
112
+            def versionCodes = ["armeabi-v7a":1, "x86":2]
113
+            def abi = output.getFilter(OutputFile.ABI)
114
+            if (abi != null) {  // null for the universal-debug, universal-release variants
115
+                output.versionCodeOverride =
116
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
117
+            }
118
+        }
119
+    }
120
+}
121
+
122
+dependencies {
123
+    compile fileTree(dir: "libs", include: ["*.jar"])
124
+    compile "com.android.support:appcompat-v7:23.0.1"
125
+    compile "com.facebook.react:react-native:+"  // From node_modules
126
+}

+ 67
- 0
example-redux/android/app/proguard-rules.pro View File

@@ -0,0 +1,67 @@
1
+# Add project specific ProGuard rules here.
2
+# By default, the flags in this file are appended to flags specified
3
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4
+# You can edit the include path and order by changing the proguardFiles
5
+# directive in build.gradle.
6
+#
7
+# For more details, see
8
+#   http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+# Add any project specific keep options here:
11
+
12
+# If your project uses WebView with JS, uncomment the following
13
+# and specify the fully qualified class name to the JavaScript interface
14
+# class:
15
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16
+#   public *;
17
+#}
18
+
19
+# Disabling obfuscation is useful if you collect stack traces from production crashes
20
+# (unless you are using a system that supports de-obfuscate the stack traces).
21
+-dontobfuscate
22
+
23
+# React Native
24
+
25
+# Keep our interfaces so they can be used by other ProGuard rules.
26
+# See http://sourceforge.net/p/proguard/bugs/466/
27
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
28
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
29
+
30
+# Do not strip any method/class that is annotated with @DoNotStrip
31
+-keep @com.facebook.proguard.annotations.DoNotStrip class *
32
+-keepclassmembers class * {
33
+    @com.facebook.proguard.annotations.DoNotStrip *;
34
+}
35
+
36
+-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
37
+  void set*(***);
38
+  *** get*();
39
+}
40
+
41
+-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
42
+-keep class * extends com.facebook.react.bridge.NativeModule { *; }
43
+-keepclassmembers,includedescriptorclasses class * { native <methods>; }
44
+-keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
45
+-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
46
+-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
47
+
48
+-dontwarn com.facebook.react.**
49
+
50
+# okhttp
51
+
52
+-keepattributes Signature
53
+-keepattributes *Annotation*
54
+-keep class com.squareup.okhttp.** { *; }
55
+-keep interface com.squareup.okhttp.** { *; }
56
+-dontwarn com.squareup.okhttp.**
57
+
58
+# okio
59
+
60
+-keep class sun.misc.Unsafe { *; }
61
+-dontwarn java.nio.file.*
62
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
63
+-dontwarn okio.**
64
+
65
+# stetho
66
+
67
+-dontwarn com.facebook.stetho.**

+ 97
- 0
example-redux/android/app/react.gradle View File

@@ -0,0 +1,97 @@
1
+import org.apache.tools.ant.taskdefs.condition.Os
2
+
3
+def config = project.hasProperty("react") ? project.react : [];
4
+
5
+def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
6
+def entryFile = config.entryFile ?: "index.android.js"
7
+
8
+// because elvis operator
9
+def elvisFile(thing) {
10
+    return thing ? file(thing) : null;
11
+}
12
+
13
+def reactRoot = elvisFile(config.root) ?: file("../../")
14
+def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
15
+
16
+void runBefore(String dependentTaskName, Task task) {
17
+    Task dependentTask = tasks.findByPath(dependentTaskName);
18
+    if (dependentTask != null) {
19
+        dependentTask.dependsOn task
20
+    }
21
+}
22
+
23
+gradle.projectsEvaluated {
24
+    // Grab all build types and product flavors
25
+    def buildTypes = android.buildTypes.collect { type -> type.name }
26
+    def productFlavors = android.productFlavors.collect { flavor -> flavor.name }
27
+
28
+    // When no product flavors defined, use empty
29
+    if (!productFlavors) productFlavors.add('')
30
+
31
+    productFlavors.each { productFlavorName ->
32
+        buildTypes.each { buildTypeName ->
33
+            // Create variant and target names
34
+            def targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}"
35
+            def targetPath = productFlavorName ?
36
+                    "${productFlavorName}/${buildTypeName}" :
37
+                    "${buildTypeName}"
38
+
39
+            // React js bundle directories
40
+            def jsBundleDirConfigName = "jsBundleDir${targetName}"
41
+            def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
42
+                    file("$buildDir/intermediates/assets/${targetPath}")
43
+
44
+            def resourcesDirConfigName = "jsBundleDir${targetName}"
45
+            def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
46
+                    file("$buildDir/intermediates/res/merged/${targetPath}")
47
+            def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
48
+
49
+            // Bundle task name for variant
50
+            def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"
51
+
52
+            def currentBundleTask = tasks.create(
53
+                    name: bundleJsAndAssetsTaskName,
54
+                    type: Exec) {
55
+                group = "react"
56
+                description = "bundle JS and assets for ${targetName}."
57
+
58
+                // Create dirs if they are not there (e.g. the "clean" task just ran)
59
+                doFirst {
60
+                    jsBundleDir.mkdirs()
61
+                    resourcesDir.mkdirs()
62
+                }
63
+
64
+                // Set up inputs and outputs so gradle can cache the result
65
+                inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
66
+                outputs.dir jsBundleDir
67
+                outputs.dir resourcesDir
68
+
69
+                // Set up the call to the react-native cli
70
+                workingDir reactRoot
71
+
72
+                // Set up dev mode
73
+                def devEnabled = !targetName.toLowerCase().contains("release")
74
+                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
75
+                    commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}",
76
+                            "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir
77
+                } else {
78
+                    commandLine "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}",
79
+                            "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir
80
+                }
81
+
82
+                enabled config."bundleIn${targetName}" ||
83
+                    config."bundleIn${buildTypeName.capitalize()}" ?:
84
+                            targetName.toLowerCase().contains("release")
85
+            }
86
+
87
+            // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
88
+            currentBundleTask.dependsOn("merge${targetName}Resources")
89
+            currentBundleTask.dependsOn("merge${targetName}Assets")
90
+
91
+            runBefore("processArmeabi-v7a${targetName}Resources", currentBundleTask)
92
+            runBefore("processX86${targetName}Resources", currentBundleTask)
93
+            runBefore("processUniversal${targetName}Resources", currentBundleTask)
94
+            runBefore("process${targetName}Resources", currentBundleTask)
95
+        }
96
+    }
97
+}

+ 23
- 0
example-redux/android/app/src/main/AndroidManifest.xml View File

@@ -0,0 +1,23 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+    package="com.exampleredux">
3
+
4
+    <uses-permission android:name="android.permission.INTERNET" />
5
+
6
+    <application
7
+      android:allowBackup="true"
8
+      android:label="@string/app_name"
9
+      android:icon="@mipmap/ic_launcher"
10
+      android:theme="@style/AppTheme">
11
+      <activity
12
+        android:name=".MainActivity"
13
+        android:label="@string/app_name"
14
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
15
+        <intent-filter>
16
+            <action android:name="android.intent.action.MAIN" />
17
+            <category android:name="android.intent.category.LAUNCHER" />
18
+        </intent-filter>
19
+      </activity>
20
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
21
+    </application>
22
+
23
+</manifest>

+ 40
- 0
example-redux/android/app/src/main/java/com/exampleredux/MainActivity.java View File

@@ -0,0 +1,40 @@
1
+package com.exampleredux;
2
+
3
+import com.facebook.react.ReactActivity;
4
+import com.facebook.react.ReactPackage;
5
+import com.facebook.react.shell.MainReactPackage;
6
+
7
+import java.util.Arrays;
8
+import java.util.List;
9
+
10
+public class MainActivity extends ReactActivity {
11
+
12
+    /**
13
+     * Returns the name of the main component registered from JavaScript.
14
+     * This is used to schedule rendering of the component.
15
+     */
16
+    @Override
17
+    protected String getMainComponentName() {
18
+        return "exampleRedux";
19
+    }
20
+
21
+    /**
22
+     * Returns whether dev mode should be enabled.
23
+     * This enables e.g. the dev menu.
24
+     */
25
+    @Override
26
+    protected boolean getUseDeveloperSupport() {
27
+        return BuildConfig.DEBUG;
28
+    }
29
+
30
+    /**
31
+     * A list of packages used by the app. If the app uses additional views
32
+     * or modules besides the default ones, add more packages here.
33
+     */
34
+    @Override
35
+    protected List<ReactPackage> getPackages() {
36
+        return Arrays.<ReactPackage>asList(
37
+            new MainReactPackage()
38
+        );
39
+    }
40
+}

BIN
example-redux/android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File


BIN
example-redux/android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File


BIN
example-redux/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File


BIN
example-redux/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File


+ 3
- 0
example-redux/android/app/src/main/res/values/strings.xml View File

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">exampleRedux</string>
3
+</resources>

+ 8
- 0
example-redux/android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,8 @@
1
+<resources>
2
+
3
+    <!-- Base application theme. -->
4
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
5
+        <!-- Customize your theme here. -->
6
+    </style>
7
+
8
+</resources>

+ 24
- 0
example-redux/android/build.gradle View File

@@ -0,0 +1,24 @@
1
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+buildscript {
4
+    repositories {
5
+        jcenter()
6
+    }
7
+    dependencies {
8
+        classpath 'com.android.tools.build:gradle:1.3.1'
9
+
10
+        // NOTE: Do not place your application dependencies here; they belong
11
+        // in the individual module build.gradle files
12
+    }
13
+}
14
+
15
+allprojects {
16
+    repositories {
17
+        mavenLocal()
18
+        jcenter()
19
+        maven {
20
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
21
+            url "$projectDir/../../node_modules/react-native/android"
22
+        }
23
+    }
24
+}

+ 20
- 0
example-redux/android/gradle.properties View File

@@ -0,0 +1,20 @@
1
+# Project-wide Gradle settings.
2
+
3
+# IDE (e.g. Android Studio) users:
4
+# Gradle settings configured through the IDE *will override*
5
+# any settings specified in this file.
6
+
7
+# For more details on how to configure your build environment visit
8
+# http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+# Specifies the JVM arguments used for the daemon process.
11
+# The setting is particularly useful for tweaking memory settings.
12
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
13
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14
+
15
+# When configured, Gradle will run in incubating parallel mode.
16
+# This option should only be used with decoupled projects. More details, visit
17
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
+# org.gradle.parallel=true
19
+
20
+android.useDeprecatedNdk=true

BIN
example-redux/android/gradle/wrapper/gradle-wrapper.jar View File


+ 5
- 0
example-redux/android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+zipStoreBase=GRADLE_USER_HOME
4
+zipStorePath=wrapper/dists
5
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

+ 164
- 0
example-redux/android/gradlew View File

@@ -0,0 +1,164 @@
1
+#!/usr/bin/env bash
2
+
3
+##############################################################################
4
+##
5
+##  Gradle start up script for UN*X
6
+##
7
+##############################################################################
8
+
9
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10
+DEFAULT_JVM_OPTS=""
11
+
12
+APP_NAME="Gradle"
13
+APP_BASE_NAME=`basename "$0"`
14
+
15
+# Use the maximum available, or set MAX_FD != -1 to use that value.
16
+MAX_FD="maximum"
17
+
18
+warn ( ) {
19
+    echo "$*"
20
+}
21
+
22
+die ( ) {
23
+    echo
24
+    echo "$*"
25
+    echo
26
+    exit 1
27
+}
28
+
29
+# OS specific support (must be 'true' or 'false').
30
+cygwin=false
31
+msys=false
32
+darwin=false
33
+case "`uname`" in
34
+  CYGWIN* )
35
+    cygwin=true
36
+    ;;
37
+  Darwin* )
38
+    darwin=true
39
+    ;;
40
+  MINGW* )
41
+    msys=true
42
+    ;;
43
+esac
44
+
45
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
46
+if $cygwin ; then
47
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48
+fi
49
+
50
+# Attempt to set APP_HOME
51
+# Resolve links: $0 may be a link
52
+PRG="$0"
53
+# Need this for relative symlinks.
54
+while [ -h "$PRG" ] ; do
55
+    ls=`ls -ld "$PRG"`
56
+    link=`expr "$ls" : '.*-> \(.*\)$'`
57
+    if expr "$link" : '/.*' > /dev/null; then
58
+        PRG="$link"
59
+    else
60
+        PRG=`dirname "$PRG"`"/$link"
61
+    fi
62
+done
63
+SAVED="`pwd`"
64
+cd "`dirname \"$PRG\"`/" >&-
65
+APP_HOME="`pwd -P`"
66
+cd "$SAVED" >&-
67
+
68
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69
+
70
+# Determine the Java command to use to start the JVM.
71
+if [ -n "$JAVA_HOME" ] ; then
72
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73
+        # IBM's JDK on AIX uses strange locations for the executables
74
+        JAVACMD="$JAVA_HOME/jre/sh/java"
75
+    else
76
+        JAVACMD="$JAVA_HOME/bin/java"
77
+    fi
78
+    if [ ! -x "$JAVACMD" ] ; then
79
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80
+
81
+Please set the JAVA_HOME variable in your environment to match the
82
+location of your Java installation."
83
+    fi
84
+else
85
+    JAVACMD="java"
86
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87
+
88
+Please set the JAVA_HOME variable in your environment to match the
89
+location of your Java installation."
90
+fi
91
+
92
+# Increase the maximum file descriptors if we can.
93
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94
+    MAX_FD_LIMIT=`ulimit -H -n`
95
+    if [ $? -eq 0 ] ; then
96
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97
+            MAX_FD="$MAX_FD_LIMIT"
98
+        fi
99
+        ulimit -n $MAX_FD
100
+        if [ $? -ne 0 ] ; then
101
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
102
+        fi
103
+    else
104
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105
+    fi
106
+fi
107
+
108
+# For Darwin, add options to specify how the application appears in the dock
109
+if $darwin; then
110
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111
+fi
112
+
113
+# For Cygwin, switch paths to Windows format before running java
114
+if $cygwin ; then
115
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117
+
118
+    # We build the pattern for arguments to be converted via cygpath
119
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120
+    SEP=""
121
+    for dir in $ROOTDIRSRAW ; do
122
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
123
+        SEP="|"
124
+    done
125
+    OURCYGPATTERN="(^($ROOTDIRS))"
126
+    # Add a user-defined pattern to the cygpath arguments
127
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129
+    fi
130
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
131
+    i=0
132
+    for arg in "$@" ; do
133
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
135
+
136
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
137
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138
+        else
139
+            eval `echo args$i`="\"$arg\""
140
+        fi
141
+        i=$((i+1))
142
+    done
143
+    case $i in
144
+        (0) set -- ;;
145
+        (1) set -- "$args0" ;;
146
+        (2) set -- "$args0" "$args1" ;;
147
+        (3) set -- "$args0" "$args1" "$args2" ;;
148
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154
+    esac
155
+fi
156
+
157
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158
+function splitJvmOpts() {
159
+    JVM_OPTS=("$@")
160
+}
161
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163
+
164
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90
- 0
example-redux/android/gradlew.bat View File

@@ -0,0 +1,90 @@
1
+@if "%DEBUG%" == "" @echo off
2
+@rem ##########################################################################
3
+@rem
4
+@rem  Gradle startup script for Windows
5
+@rem
6
+@rem ##########################################################################
7
+
8
+@rem Set local scope for the variables with windows NT shell
9
+if "%OS%"=="Windows_NT" setlocal
10
+
11
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12
+set DEFAULT_JVM_OPTS=
13
+
14
+set DIRNAME=%~dp0
15
+if "%DIRNAME%" == "" set DIRNAME=.
16
+set APP_BASE_NAME=%~n0
17
+set APP_HOME=%DIRNAME%
18
+
19
+@rem Find java.exe
20
+if defined JAVA_HOME goto findJavaFromJavaHome
21
+
22
+set JAVA_EXE=java.exe
23
+%JAVA_EXE% -version >NUL 2>&1
24
+if "%ERRORLEVEL%" == "0" goto init
25
+
26
+echo.
27
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28
+echo.
29
+echo Please set the JAVA_HOME variable in your environment to match the
30
+echo location of your Java installation.
31
+
32
+goto fail
33
+
34
+:findJavaFromJavaHome
35
+set JAVA_HOME=%JAVA_HOME:"=%
36
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
+
38
+if exist "%JAVA_EXE%" goto init
39
+
40
+echo.
41
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42
+echo.
43
+echo Please set the JAVA_HOME variable in your environment to match the
44
+echo location of your Java installation.
45
+
46
+goto fail
47
+
48
+:init
49
+@rem Get command-line arguments, handling Windowz variants
50
+
51
+if not "%OS%" == "Windows_NT" goto win9xME_args
52
+if "%@eval[2+2]" == "4" goto 4NT_args
53
+
54
+:win9xME_args
55
+@rem Slurp the command line arguments.
56
+set CMD_LINE_ARGS=
57
+set _SKIP=2
58
+
59
+:win9xME_args_slurp
60
+if "x%~1" == "x" goto execute
61
+
62
+set CMD_LINE_ARGS=%*
63
+goto execute
64
+
65
+:4NT_args
66
+@rem Get arguments from the 4NT Shell from JP Software
67
+set CMD_LINE_ARGS=%$
68
+
69
+:execute
70
+@rem Setup the command line
71
+
72
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73
+
74
+@rem Execute Gradle
75
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76
+
77
+:end
78
+@rem End local scope for the variables with windows NT shell
79
+if "%ERRORLEVEL%"=="0" goto mainEnd
80
+
81
+:fail
82
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83
+rem the _cmd.exe /c_ return code!
84
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85
+exit /b 1
86
+
87
+:mainEnd
88
+if "%OS%"=="Windows_NT" endlocal
89
+
90
+:omega

+ 3
- 0
example-redux/android/settings.gradle View File

@@ -0,0 +1,3 @@
1
+rootProject.name = 'exampleRedux'
2
+
3
+include ':app'

+ 51
- 0
example-redux/index.android.js View File

@@ -0,0 +1,51 @@
1
+/**
2
+ * Sample React Native App
3
+ * https://github.com/facebook/react-native
4
+ */
5
+'use strict';
6
+import React, {
7
+  AppRegistry,
8
+  Component,
9
+  StyleSheet,
10
+  Text,
11
+  View
12
+} from 'react-native';
13
+
14
+class exampleRedux extends Component {
15
+  render() {
16
+    return (
17
+      <View style={styles.container}>
18
+        <Text style={styles.welcome}>
19
+          Welcome to React Native!
20
+        </Text>
21
+        <Text style={styles.instructions}>
22
+          To get started, edit index.android.js
23
+        </Text>
24
+        <Text style={styles.instructions}>
25
+          Shake or press menu button for dev menu
26
+        </Text>
27
+      </View>
28
+    );
29
+  }
30
+}
31
+
32
+const styles = StyleSheet.create({
33
+  container: {
34
+    flex: 1,
35
+    justifyContent: 'center',
36
+    alignItems: 'center',
37
+    backgroundColor: '#F5FCFF',
38
+  },
39
+  welcome: {
40
+    fontSize: 20,
41
+    textAlign: 'center',
42
+    margin: 10,
43
+  },
44
+  instructions: {
45
+    textAlign: 'center',
46
+    color: '#333333',
47
+    marginBottom: 5,
48
+  },
49
+});
50
+
51
+AppRegistry.registerComponent('exampleRedux', () => exampleRedux);

+ 52
- 0
example-redux/index.ios.js View File

@@ -0,0 +1,52 @@
1
+/**
2
+ * Sample React Native App
3
+ * https://github.com/facebook/react-native
4
+ */
5
+'use strict';
6
+import React, {
7
+  AppRegistry,
8
+  Component,
9
+  StyleSheet,
10
+  Text,
11
+  View
12
+} from 'react-native';
13
+
14
+class exampleRedux extends Component {
15
+  render() {
16
+    return (
17
+      <View style={styles.container}>
18
+        <Text style={styles.welcome}>
19
+          Welcome to React Native!
20
+        </Text>
21
+        <Text style={styles.instructions}>
22
+          To get started, edit index.ios.js
23
+        </Text>
24
+        <Text style={styles.instructions}>
25
+          Press Cmd+R to reload,{'\n'}
26
+          Cmd+D or shake for dev menu
27
+        </Text>
28
+      </View>
29
+    );
30
+  }
31
+}
32
+
33
+const styles = StyleSheet.create({
34
+  container: {
35
+    flex: 1,
36
+    justifyContent: 'center',
37
+    alignItems: 'center',
38
+    backgroundColor: '#F5FCFF',
39
+  },
40
+  welcome: {
41
+    fontSize: 20,
42
+    textAlign: 'center',
43
+    margin: 10,
44
+  },
45
+  instructions: {
46
+    textAlign: 'center',
47
+    color: '#333333',
48
+    marginBottom: 5,
49
+  },
50
+});
51
+
52
+AppRegistry.registerComponent('exampleRedux', () => exampleRedux);

+ 763
- 0
example-redux/ios/exampleRedux.xcodeproj/project.pbxproj View File

@@ -0,0 +1,763 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
11
+		00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
12
+		00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
13
+		00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
14
+		00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
15
+		00E356F31AD99517003FC87E /* exampleReduxTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleReduxTests.m */; };
16
+		133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
17
+		139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
18
+		139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
19
+		13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
20
+		13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
21
+		13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
22
+		13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
23
+		146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
24
+		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
25
+/* End PBXBuildFile section */
26
+
27
+/* Begin PBXContainerItemProxy section */
28
+		00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
29
+			isa = PBXContainerItemProxy;
30
+			containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
31
+			proxyType = 2;
32
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
33
+			remoteInfo = RCTActionSheet;
34
+		};
35
+		00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
36
+			isa = PBXContainerItemProxy;
37
+			containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
38
+			proxyType = 2;
39
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
40
+			remoteInfo = RCTGeolocation;
41
+		};
42
+		00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
43
+			isa = PBXContainerItemProxy;
44
+			containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
45
+			proxyType = 2;
46
+			remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
47
+			remoteInfo = RCTImage;
48
+		};
49
+		00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
50
+			isa = PBXContainerItemProxy;
51
+			containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
52
+			proxyType = 2;
53
+			remoteGlobalIDString = 58B511DB1A9E6C8500147676;
54
+			remoteInfo = RCTNetwork;
55
+		};
56
+		00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
57
+			isa = PBXContainerItemProxy;
58
+			containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
59
+			proxyType = 2;
60
+			remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
61
+			remoteInfo = RCTVibration;
62
+		};
63
+		00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
64
+			isa = PBXContainerItemProxy;
65
+			containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
66
+			proxyType = 1;
67
+			remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
68
+			remoteInfo = exampleRedux;
69
+		};
70
+		139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
71
+			isa = PBXContainerItemProxy;
72
+			containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
73
+			proxyType = 2;
74
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
75
+			remoteInfo = RCTSettings;
76
+		};
77
+		139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
78
+			isa = PBXContainerItemProxy;
79
+			containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
80
+			proxyType = 2;
81
+			remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
82
+			remoteInfo = RCTWebSocket;
83
+		};
84
+		146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
85
+			isa = PBXContainerItemProxy;
86
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
87
+			proxyType = 2;
88
+			remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
89
+			remoteInfo = React;
90
+		};
91
+		78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
92
+			isa = PBXContainerItemProxy;
93
+			containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
94
+			proxyType = 2;
95
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
96
+			remoteInfo = RCTLinking;
97
+		};
98
+		832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
99
+			isa = PBXContainerItemProxy;
100
+			containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
101
+			proxyType = 2;
102
+			remoteGlobalIDString = 58B5119B1A9E6C1200147676;
103
+			remoteInfo = RCTText;
104
+		};
105
+/* End PBXContainerItemProxy section */
106
+
107
+/* Begin PBXFileReference section */
108
+		008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = main.jsbundle; path = main.jsbundle; sourceTree = "<group>"; };
109
+		00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = "<group>"; };
110
+		00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = ../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj; sourceTree = "<group>"; };
111
+		00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = ../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj; sourceTree = "<group>"; };
112
+		00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = ../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj; sourceTree = "<group>"; };
113
+		00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = "<group>"; };
114
+		00E356EE1AD99517003FC87E /* exampleReduxTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exampleReduxTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
115
+		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
116
+		00E356F21AD99517003FC87E /* exampleReduxTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleReduxTests.m; sourceTree = "<group>"; };
117
+		139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = ../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj; sourceTree = "<group>"; };
118
+		139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = ../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj; sourceTree = "<group>"; };
119
+		13B07F961A680F5B00A75B9A /* exampleRedux.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = exampleRedux.app; sourceTree = BUILT_PRODUCTS_DIR; };
120
+		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = exampleRedux/AppDelegate.h; sourceTree = "<group>"; };
121
+		13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = exampleRedux/AppDelegate.m; sourceTree = "<group>"; };
122
+		13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
123
+		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = exampleRedux/Images.xcassets; sourceTree = "<group>"; };
124
+		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = exampleRedux/Info.plist; sourceTree = "<group>"; };
125
+		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = exampleRedux/main.m; sourceTree = "<group>"; };
126
+		146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = ../node_modules/react-native/React/React.xcodeproj; sourceTree = "<group>"; };
127
+		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = ../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj; sourceTree = "<group>"; };
128
+		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = ../node_modules/react-native/Libraries/Text/RCTText.xcodeproj; sourceTree = "<group>"; };
129
+/* End PBXFileReference section */
130
+
131
+/* Begin PBXFrameworksBuildPhase section */
132
+		00E356EB1AD99517003FC87E /* Frameworks */ = {
133
+			isa = PBXFrameworksBuildPhase;
134
+			buildActionMask = 2147483647;
135
+			files = (
136
+			);
137
+			runOnlyForDeploymentPostprocessing = 0;
138
+		};
139
+		13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
140
+			isa = PBXFrameworksBuildPhase;
141
+			buildActionMask = 2147483647;
142
+			files = (
143
+				146834051AC3E58100842450 /* libReact.a in Frameworks */,
144
+				00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
145
+				00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
146
+				00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
147
+				133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
148
+				00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
149
+				139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
150
+				832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
151
+				00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
152
+				139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
153
+			);
154
+			runOnlyForDeploymentPostprocessing = 0;
155
+		};
156
+/* End PBXFrameworksBuildPhase section */
157
+
158
+/* Begin PBXGroup section */
159
+		00C302A81ABCB8CE00DB3ED1 /* Products */ = {
160
+			isa = PBXGroup;
161
+			children = (
162
+				00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
163
+			);
164
+			name = Products;
165
+			sourceTree = "<group>";
166
+		};
167
+		00C302B61ABCB90400DB3ED1 /* Products */ = {
168
+			isa = PBXGroup;
169
+			children = (
170
+				00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
171
+			);
172
+			name = Products;
173
+			sourceTree = "<group>";
174
+		};
175
+		00C302BC1ABCB91800DB3ED1 /* Products */ = {
176
+			isa = PBXGroup;
177
+			children = (
178
+				00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
179
+			);
180
+			name = Products;
181
+			sourceTree = "<group>";
182
+		};
183
+		00C302D41ABCB9D200DB3ED1 /* Products */ = {
184
+			isa = PBXGroup;
185
+			children = (
186
+				00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
187
+			);
188
+			name = Products;
189
+			sourceTree = "<group>";
190
+		};
191
+		00C302E01ABCB9EE00DB3ED1 /* Products */ = {
192
+			isa = PBXGroup;
193
+			children = (
194
+				00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
195
+			);
196
+			name = Products;
197
+			sourceTree = "<group>";
198
+		};
199
+		00E356EF1AD99517003FC87E /* exampleReduxTests */ = {
200
+			isa = PBXGroup;
201
+			children = (
202
+				00E356F21AD99517003FC87E /* exampleReduxTests.m */,
203
+				00E356F01AD99517003FC87E /* Supporting Files */,
204
+			);
205
+			path = exampleReduxTests;
206
+			sourceTree = "<group>";
207
+		};
208
+		00E356F01AD99517003FC87E /* Supporting Files */ = {
209
+			isa = PBXGroup;
210
+			children = (
211
+				00E356F11AD99517003FC87E /* Info.plist */,
212
+			);
213
+			name = "Supporting Files";
214
+			sourceTree = "<group>";
215
+		};
216
+		139105B71AF99BAD00B5F7CC /* Products */ = {
217
+			isa = PBXGroup;
218
+			children = (
219
+				139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
220
+			);
221
+			name = Products;
222
+			sourceTree = "<group>";
223
+		};
224
+		139FDEE71B06529A00C62182 /* Products */ = {
225
+			isa = PBXGroup;
226
+			children = (
227
+				139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
228
+			);
229
+			name = Products;
230
+			sourceTree = "<group>";
231
+		};
232
+		13B07FAE1A68108700A75B9A /* exampleRedux */ = {
233
+			isa = PBXGroup;
234
+			children = (
235
+				008F07F21AC5B25A0029DE68 /* main.jsbundle */,
236
+				13B07FAF1A68108700A75B9A /* AppDelegate.h */,
237
+				13B07FB01A68108700A75B9A /* AppDelegate.m */,
238
+				13B07FB51A68108700A75B9A /* Images.xcassets */,
239
+				13B07FB61A68108700A75B9A /* Info.plist */,
240
+				13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
241
+				13B07FB71A68108700A75B9A /* main.m */,
242
+			);
243
+			name = exampleRedux;
244
+			sourceTree = "<group>";
245
+		};
246
+		146834001AC3E56700842450 /* Products */ = {
247
+			isa = PBXGroup;
248
+			children = (
249
+				146834041AC3E56700842450 /* libReact.a */,
250
+			);
251
+			name = Products;
252
+			sourceTree = "<group>";
253
+		};
254
+		78C398B11ACF4ADC00677621 /* Products */ = {
255
+			isa = PBXGroup;
256
+			children = (
257
+				78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
258
+			);
259
+			name = Products;
260
+			sourceTree = "<group>";
261
+		};
262
+		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
263
+			isa = PBXGroup;
264
+			children = (
265
+				146833FF1AC3E56700842450 /* React.xcodeproj */,
266
+				00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
267
+				00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
268
+				00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
269
+				78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
270
+				00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
271
+				139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
272
+				832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
273
+				00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
274
+				139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
275
+			);
276
+			name = Libraries;
277
+			sourceTree = "<group>";
278
+		};
279
+		832341B11AAA6A8300B99B32 /* Products */ = {
280
+			isa = PBXGroup;
281
+			children = (
282
+				832341B51AAA6A8300B99B32 /* libRCTText.a */,
283
+			);
284
+			name = Products;
285
+			sourceTree = "<group>";
286
+		};
287
+		83CBB9F61A601CBA00E9B192 = {
288
+			isa = PBXGroup;
289
+			children = (
290
+				13B07FAE1A68108700A75B9A /* exampleRedux */,
291
+				832341AE1AAA6A7D00B99B32 /* Libraries */,
292
+				00E356EF1AD99517003FC87E /* exampleReduxTests */,
293
+				83CBBA001A601CBA00E9B192 /* Products */,
294
+			);
295
+			indentWidth = 2;
296
+			sourceTree = "<group>";
297
+			tabWidth = 2;
298
+		};
299
+		83CBBA001A601CBA00E9B192 /* Products */ = {
300
+			isa = PBXGroup;
301
+			children = (
302
+				13B07F961A680F5B00A75B9A /* exampleRedux.app */,
303
+				00E356EE1AD99517003FC87E /* exampleReduxTests.xctest */,
304
+			);
305
+			name = Products;
306
+			sourceTree = "<group>";
307
+		};
308
+/* End PBXGroup section */
309
+
310
+/* Begin PBXNativeTarget section */
311
+		00E356ED1AD99517003FC87E /* exampleReduxTests */ = {
312
+			isa = PBXNativeTarget;
313
+			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleReduxTests" */;
314
+			buildPhases = (
315
+				00E356EA1AD99517003FC87E /* Sources */,
316
+				00E356EB1AD99517003FC87E /* Frameworks */,
317
+				00E356EC1AD99517003FC87E /* Resources */,
318
+			);
319
+			buildRules = (
320
+			);
321
+			dependencies = (
322
+				00E356F51AD99517003FC87E /* PBXTargetDependency */,
323
+			);
324
+			name = exampleReduxTests;
325
+			productName = exampleReduxTests;
326
+			productReference = 00E356EE1AD99517003FC87E /* exampleReduxTests.xctest */;
327
+			productType = "com.apple.product-type.bundle.unit-test";
328
+		};
329
+		13B07F861A680F5B00A75B9A /* exampleRedux */ = {
330
+			isa = PBXNativeTarget;
331
+			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "exampleRedux" */;
332
+			buildPhases = (
333
+				13B07F871A680F5B00A75B9A /* Sources */,
334
+				13B07F8C1A680F5B00A75B9A /* Frameworks */,
335
+				13B07F8E1A680F5B00A75B9A /* Resources */,
336
+				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
337
+			);
338
+			buildRules = (
339
+			);
340
+			dependencies = (
341
+			);
342
+			name = exampleRedux;
343
+			productName = "Hello World";
344
+			productReference = 13B07F961A680F5B00A75B9A /* exampleRedux.app */;
345
+			productType = "com.apple.product-type.application";
346
+		};
347
+/* End PBXNativeTarget section */
348
+
349
+/* Begin PBXProject section */
350
+		83CBB9F71A601CBA00E9B192 /* Project object */ = {
351
+			isa = PBXProject;
352
+			attributes = {
353
+				LastUpgradeCheck = 0610;
354
+				ORGANIZATIONNAME = Facebook;
355
+				TargetAttributes = {
356
+					00E356ED1AD99517003FC87E = {
357
+						CreatedOnToolsVersion = 6.2;
358
+						TestTargetID = 13B07F861A680F5B00A75B9A;
359
+					};
360
+				};
361
+			};
362
+			buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "exampleRedux" */;
363
+			compatibilityVersion = "Xcode 3.2";
364
+			developmentRegion = English;
365
+			hasScannedForEncodings = 0;
366
+			knownRegions = (
367
+				en,
368
+				Base,
369
+			);
370
+			mainGroup = 83CBB9F61A601CBA00E9B192;
371
+			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
372
+			projectDirPath = "";
373
+			projectReferences = (
374
+				{
375
+					ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
376
+					ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
377
+				},
378
+				{
379
+					ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
380
+					ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
381
+				},
382
+				{
383
+					ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
384
+					ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
385
+				},
386
+				{
387
+					ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
388
+					ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
389
+				},
390
+				{
391
+					ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
392
+					ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
393
+				},
394
+				{
395
+					ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
396
+					ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
397
+				},
398
+				{
399
+					ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
400
+					ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
401
+				},
402
+				{
403
+					ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
404
+					ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
405
+				},
406
+				{
407
+					ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
408
+					ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
409
+				},
410
+				{
411
+					ProductGroup = 146834001AC3E56700842450 /* Products */;
412
+					ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
413
+				},
414
+			);
415
+			projectRoot = "";
416
+			targets = (
417
+				13B07F861A680F5B00A75B9A /* exampleRedux */,
418
+				00E356ED1AD99517003FC87E /* exampleReduxTests */,
419
+			);
420
+		};
421
+/* End PBXProject section */
422
+
423
+/* Begin PBXReferenceProxy section */
424
+		00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
425
+			isa = PBXReferenceProxy;
426
+			fileType = archive.ar;
427
+			path = libRCTActionSheet.a;
428
+			remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
429
+			sourceTree = BUILT_PRODUCTS_DIR;
430
+		};
431
+		00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
432
+			isa = PBXReferenceProxy;
433
+			fileType = archive.ar;
434
+			path = libRCTGeolocation.a;
435
+			remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
436
+			sourceTree = BUILT_PRODUCTS_DIR;
437
+		};
438
+		00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
439
+			isa = PBXReferenceProxy;
440
+			fileType = archive.ar;
441
+			path = libRCTImage.a;
442
+			remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
443
+			sourceTree = BUILT_PRODUCTS_DIR;
444
+		};
445
+		00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
446
+			isa = PBXReferenceProxy;
447
+			fileType = archive.ar;
448
+			path = libRCTNetwork.a;
449
+			remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
450
+			sourceTree = BUILT_PRODUCTS_DIR;
451
+		};
452
+		00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
453
+			isa = PBXReferenceProxy;
454
+			fileType = archive.ar;
455
+			path = libRCTVibration.a;
456
+			remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
457
+			sourceTree = BUILT_PRODUCTS_DIR;
458
+		};
459
+		139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
460
+			isa = PBXReferenceProxy;
461
+			fileType = archive.ar;
462
+			path = libRCTSettings.a;
463
+			remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
464
+			sourceTree = BUILT_PRODUCTS_DIR;
465
+		};
466
+		139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
467
+			isa = PBXReferenceProxy;
468
+			fileType = archive.ar;
469
+			path = libRCTWebSocket.a;
470
+			remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
471
+			sourceTree = BUILT_PRODUCTS_DIR;
472
+		};
473
+		146834041AC3E56700842450 /* libReact.a */ = {
474
+			isa = PBXReferenceProxy;
475
+			fileType = archive.ar;
476
+			path = libReact.a;
477
+			remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
478
+			sourceTree = BUILT_PRODUCTS_DIR;
479
+		};
480
+		78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
481
+			isa = PBXReferenceProxy;
482
+			fileType = archive.ar;
483
+			path = libRCTLinking.a;
484
+			remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
485
+			sourceTree = BUILT_PRODUCTS_DIR;
486
+		};
487
+		832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
488
+			isa = PBXReferenceProxy;
489
+			fileType = archive.ar;
490
+			path = libRCTText.a;
491
+			remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
492
+			sourceTree = BUILT_PRODUCTS_DIR;
493
+		};
494
+/* End PBXReferenceProxy section */
495
+
496
+/* Begin PBXResourcesBuildPhase section */
497
+		00E356EC1AD99517003FC87E /* Resources */ = {
498
+			isa = PBXResourcesBuildPhase;
499
+			buildActionMask = 2147483647;
500
+			files = (
501
+			);
502
+			runOnlyForDeploymentPostprocessing = 0;
503
+		};
504
+		13B07F8E1A680F5B00A75B9A /* Resources */ = {
505
+			isa = PBXResourcesBuildPhase;
506
+			buildActionMask = 2147483647;
507
+			files = (
508
+				13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
509
+				13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
510
+			);
511
+			runOnlyForDeploymentPostprocessing = 0;
512
+		};
513
+/* End PBXResourcesBuildPhase section */
514
+
515
+/* Begin PBXShellScriptBuildPhase section */
516
+		00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
517
+			isa = PBXShellScriptBuildPhase;
518
+			buildActionMask = 2147483647;
519
+			files = (
520
+			);
521
+			inputPaths = (
522
+			);
523
+			name = "Bundle React Native code and images";
524
+			outputPaths = (
525
+			);
526
+			runOnlyForDeploymentPostprocessing = 0;
527
+			shellPath = /bin/sh;
528
+			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
529
+			showEnvVarsInLog = 1;
530
+		};
531
+/* End PBXShellScriptBuildPhase section */
532
+
533
+/* Begin PBXSourcesBuildPhase section */
534
+		00E356EA1AD99517003FC87E /* Sources */ = {
535
+			isa = PBXSourcesBuildPhase;
536
+			buildActionMask = 2147483647;
537
+			files = (
538
+				00E356F31AD99517003FC87E /* exampleReduxTests.m in Sources */,
539
+			);
540
+			runOnlyForDeploymentPostprocessing = 0;
541
+		};
542
+		13B07F871A680F5B00A75B9A /* Sources */ = {
543
+			isa = PBXSourcesBuildPhase;
544
+			buildActionMask = 2147483647;
545
+			files = (
546
+				13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
547
+				13B07FC11A68108700A75B9A /* main.m in Sources */,
548
+			);
549
+			runOnlyForDeploymentPostprocessing = 0;
550
+		};
551
+/* End PBXSourcesBuildPhase section */
552
+
553
+/* Begin PBXTargetDependency section */
554
+		00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
555
+			isa = PBXTargetDependency;
556
+			target = 13B07F861A680F5B00A75B9A /* exampleRedux */;
557
+			targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
558
+		};
559
+/* End PBXTargetDependency section */
560
+
561
+/* Begin PBXVariantGroup section */
562
+		13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
563
+			isa = PBXVariantGroup;
564
+			children = (
565
+				13B07FB21A68108700A75B9A /* Base */,
566
+			);
567
+			name = LaunchScreen.xib;
568
+			path = exampleRedux;
569
+			sourceTree = "<group>";
570
+		};
571
+/* End PBXVariantGroup section */
572
+
573
+/* Begin XCBuildConfiguration section */
574
+		00E356F61AD99517003FC87E /* Debug */ = {
575
+			isa = XCBuildConfiguration;
576
+			buildSettings = {
577
+				BUNDLE_LOADER = "$(TEST_HOST)";
578
+				FRAMEWORK_SEARCH_PATHS = (
579
+					"$(SDKROOT)/Developer/Library/Frameworks",
580
+					"$(inherited)",
581
+				);
582
+				GCC_PREPROCESSOR_DEFINITIONS = (
583
+					"DEBUG=1",
584
+					"$(inherited)",
585
+				);
586
+				INFOPLIST_FILE = exampleReduxTests/Info.plist;
587
+				IPHONEOS_DEPLOYMENT_TARGET = 8.2;
588
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
589
+				PRODUCT_NAME = "$(TARGET_NAME)";
590
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/exampleRedux.app/exampleRedux";
591
+			};
592
+			name = Debug;
593
+		};
594
+		00E356F71AD99517003FC87E /* Release */ = {
595
+			isa = XCBuildConfiguration;
596
+			buildSettings = {
597
+				BUNDLE_LOADER = "$(TEST_HOST)";
598
+				COPY_PHASE_STRIP = NO;
599
+				FRAMEWORK_SEARCH_PATHS = (
600
+					"$(SDKROOT)/Developer/Library/Frameworks",
601
+					"$(inherited)",
602
+				);
603
+				INFOPLIST_FILE = exampleReduxTests/Info.plist;
604
+				IPHONEOS_DEPLOYMENT_TARGET = 8.2;
605
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
606
+				PRODUCT_NAME = "$(TARGET_NAME)";
607
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/exampleRedux.app/exampleRedux";
608
+			};
609
+			name = Release;
610
+		};
611
+		13B07F941A680F5B00A75B9A /* Debug */ = {
612
+			isa = XCBuildConfiguration;
613
+			buildSettings = {
614
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
615
+				DEAD_CODE_STRIPPING = NO;
616
+				HEADER_SEARCH_PATHS = (
617
+					"$(inherited)",
618
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
619
+					"$(SRCROOT)/../node_modules/react-native/React/**",
620
+				);
621
+				INFOPLIST_FILE = "exampleRedux/Info.plist";
622
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
623
+				OTHER_LDFLAGS = "-ObjC";
624
+				PRODUCT_NAME = exampleRedux;
625
+			};
626
+			name = Debug;
627
+		};
628
+		13B07F951A680F5B00A75B9A /* Release */ = {
629
+			isa = XCBuildConfiguration;
630
+			buildSettings = {
631
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
632
+				HEADER_SEARCH_PATHS = (
633
+					"$(inherited)",
634
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
635
+					"$(SRCROOT)/../node_modules/react-native/React/**",
636
+				);
637
+				INFOPLIST_FILE = "exampleRedux/Info.plist";
638
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
639
+				OTHER_LDFLAGS = "-ObjC";
640
+				PRODUCT_NAME = exampleRedux;
641
+			};
642
+			name = Release;
643
+		};
644
+		83CBBA201A601CBA00E9B192 /* Debug */ = {
645
+			isa = XCBuildConfiguration;
646
+			buildSettings = {
647
+				ALWAYS_SEARCH_USER_PATHS = NO;
648
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
649
+				CLANG_CXX_LIBRARY = "libc++";
650
+				CLANG_ENABLE_MODULES = YES;
651
+				CLANG_ENABLE_OBJC_ARC = YES;
652
+				CLANG_WARN_BOOL_CONVERSION = YES;
653
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
654
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
655
+				CLANG_WARN_EMPTY_BODY = YES;
656
+				CLANG_WARN_ENUM_CONVERSION = YES;
657
+				CLANG_WARN_INT_CONVERSION = YES;
658
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
659
+				CLANG_WARN_UNREACHABLE_CODE = YES;
660
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
661
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
662
+				COPY_PHASE_STRIP = NO;
663
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
664
+				GCC_C_LANGUAGE_STANDARD = gnu99;
665
+				GCC_DYNAMIC_NO_PIC = NO;
666
+				GCC_OPTIMIZATION_LEVEL = 0;
667
+				GCC_PREPROCESSOR_DEFINITIONS = (
668
+					"DEBUG=1",
669
+					"$(inherited)",
670
+				);
671
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
672
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
673
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
674
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
675
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
676
+				GCC_WARN_UNUSED_FUNCTION = YES;
677
+				GCC_WARN_UNUSED_VARIABLE = YES;
678
+				HEADER_SEARCH_PATHS = (
679
+					"$(inherited)",
680
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
681
+					"$(SRCROOT)/../node_modules/react-native/React/**",
682
+				);
683
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
684
+				MTL_ENABLE_DEBUG_INFO = YES;
685
+				ONLY_ACTIVE_ARCH = YES;
686
+				SDKROOT = iphoneos;
687
+			};
688
+			name = Debug;
689
+		};
690
+		83CBBA211A601CBA00E9B192 /* Release */ = {
691
+			isa = XCBuildConfiguration;
692
+			buildSettings = {
693
+				ALWAYS_SEARCH_USER_PATHS = NO;
694
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
695
+				CLANG_CXX_LIBRARY = "libc++";
696
+				CLANG_ENABLE_MODULES = YES;
697
+				CLANG_ENABLE_OBJC_ARC = YES;
698
+				CLANG_WARN_BOOL_CONVERSION = YES;
699
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
700
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
701
+				CLANG_WARN_EMPTY_BODY = YES;
702
+				CLANG_WARN_ENUM_CONVERSION = YES;
703
+				CLANG_WARN_INT_CONVERSION = YES;
704
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
705
+				CLANG_WARN_UNREACHABLE_CODE = YES;
706
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
707
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
708
+				COPY_PHASE_STRIP = YES;
709
+				ENABLE_NS_ASSERTIONS = NO;
710
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
711
+				GCC_C_LANGUAGE_STANDARD = gnu99;
712
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
713
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
714
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
715
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
716
+				GCC_WARN_UNUSED_FUNCTION = YES;
717
+				GCC_WARN_UNUSED_VARIABLE = YES;
718
+				HEADER_SEARCH_PATHS = (
719
+					"$(inherited)",
720
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
721
+					"$(SRCROOT)/../node_modules/react-native/React/**",
722
+				);
723
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
724
+				MTL_ENABLE_DEBUG_INFO = NO;
725
+				SDKROOT = iphoneos;
726
+				VALIDATE_PRODUCT = YES;
727
+			};
728
+			name = Release;
729
+		};
730
+/* End XCBuildConfiguration section */
731
+
732
+/* Begin XCConfigurationList section */
733
+		00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleReduxTests" */ = {
734
+			isa = XCConfigurationList;
735
+			buildConfigurations = (
736
+				00E356F61AD99517003FC87E /* Debug */,
737
+				00E356F71AD99517003FC87E /* Release */,
738
+			);
739
+			defaultConfigurationIsVisible = 0;
740
+			defaultConfigurationName = Release;
741
+		};
742
+		13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "exampleRedux" */ = {
743
+			isa = XCConfigurationList;
744
+			buildConfigurations = (
745
+				13B07F941A680F5B00A75B9A /* Debug */,
746
+				13B07F951A680F5B00A75B9A /* Release */,
747
+			);
748
+			defaultConfigurationIsVisible = 0;
749
+			defaultConfigurationName = Release;
750
+		};
751
+		83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "exampleRedux" */ = {
752
+			isa = XCConfigurationList;
753
+			buildConfigurations = (
754
+				83CBBA201A601CBA00E9B192 /* Debug */,
755
+				83CBBA211A601CBA00E9B192 /* Release */,
756
+			);
757
+			defaultConfigurationIsVisible = 0;
758
+			defaultConfigurationName = Release;
759
+		};
760
+/* End XCConfigurationList section */
761
+	};
762
+	rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
763
+}

+ 112
- 0
example-redux/ios/exampleRedux.xcodeproj/xcshareddata/xcschemes/exampleRedux.xcscheme View File

@@ -0,0 +1,112 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0620"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
18
+               BuildableName = "exampleRedux.app"
19
+               BlueprintName = "exampleRedux"
20
+               ReferencedContainer = "container:exampleRedux.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "NO"
27
+            buildForArchiving = "NO"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
32
+               BuildableName = "exampleReduxTests.xctest"
33
+               BlueprintName = "exampleReduxTests"
34
+               ReferencedContainer = "container:exampleRedux.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+      </BuildActionEntries>
38
+   </BuildAction>
39
+   <TestAction
40
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
41
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
42
+      shouldUseLaunchSchemeArgsEnv = "YES"
43
+      buildConfiguration = "Debug">
44
+      <Testables>
45
+         <TestableReference
46
+            skipped = "NO">
47
+            <BuildableReference
48
+               BuildableIdentifier = "primary"
49
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
50
+               BuildableName = "exampleReduxTests.xctest"
51
+               BlueprintName = "exampleReduxTests"
52
+               ReferencedContainer = "container:exampleRedux.xcodeproj">
53
+            </BuildableReference>
54
+         </TestableReference>
55
+      </Testables>
56
+      <MacroExpansion>
57
+         <BuildableReference
58
+            BuildableIdentifier = "primary"
59
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
60
+            BuildableName = "exampleRedux.app"
61
+            BlueprintName = "exampleRedux"
62
+            ReferencedContainer = "container:exampleRedux.xcodeproj">
63
+         </BuildableReference>
64
+      </MacroExpansion>
65
+   </TestAction>
66
+   <LaunchAction
67
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
68
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
69
+      launchStyle = "0"
70
+      useCustomWorkingDirectory = "NO"
71
+      buildConfiguration = "Debug"
72
+      ignoresPersistentStateOnLaunch = "NO"
73
+      debugDocumentVersioning = "YES"
74
+      allowLocationSimulation = "YES">
75
+      <BuildableProductRunnable
76
+         runnableDebuggingMode = "0">
77
+         <BuildableReference
78
+            BuildableIdentifier = "primary"
79
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
80
+            BuildableName = "exampleRedux.app"
81
+            BlueprintName = "exampleRedux"
82
+            ReferencedContainer = "container:exampleRedux.xcodeproj">
83
+         </BuildableReference>
84
+      </BuildableProductRunnable>
85
+      <AdditionalOptions>
86
+      </AdditionalOptions>
87
+   </LaunchAction>
88
+   <ProfileAction
89
+      shouldUseLaunchSchemeArgsEnv = "YES"
90
+      savedToolIdentifier = ""
91
+      useCustomWorkingDirectory = "NO"
92
+      buildConfiguration = "Release"
93
+      debugDocumentVersioning = "YES">
94
+      <BuildableProductRunnable
95
+         runnableDebuggingMode = "0">
96
+         <BuildableReference
97
+            BuildableIdentifier = "primary"
98
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
99
+            BuildableName = "exampleRedux.app"
100
+            BlueprintName = "exampleRedux"
101
+            ReferencedContainer = "container:exampleRedux.xcodeproj">
102
+         </BuildableReference>
103
+      </BuildableProductRunnable>
104
+   </ProfileAction>
105
+   <AnalyzeAction
106
+      buildConfiguration = "Debug">
107
+   </AnalyzeAction>
108
+   <ArchiveAction
109
+      buildConfiguration = "Release"
110
+      revealArchiveInOrganizer = "YES">
111
+   </ArchiveAction>
112
+</Scheme>

+ 16
- 0
example-redux/ios/exampleRedux/AppDelegate.h View File

@@ -0,0 +1,16 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+
12
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
13
+
14
+@property (nonatomic, strong) UIWindow *window;
15
+
16
+@end

+ 57
- 0
example-redux/ios/exampleRedux/AppDelegate.m View File

@@ -0,0 +1,57 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import "AppDelegate.h"
11
+
12
+#import "RCTRootView.h"
13
+
14
+@implementation AppDelegate
15
+
16
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
17
+{
18
+  NSURL *jsCodeLocation;
19
+
20
+  /**
21
+   * Loading JavaScript code - uncomment the one you want.
22
+   *
23
+   * OPTION 1
24
+   * Load from development server. Start the server from the repository root:
25
+   *
26
+   * $ npm start
27
+   *
28
+   * To run on device, change `localhost` to the IP address of your computer
29
+   * (you can get this by typing `ifconfig` into the terminal and selecting the
30
+   * `inet` value under `en0:`) and make sure your computer and iOS device are
31
+   * on the same Wi-Fi network.
32
+   */
33
+
34
+  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
35
+
36
+  /**
37
+   * OPTION 2
38
+   * Load from pre-bundled file on disk. The static bundle is automatically
39
+   * generated by "Bundle React Native code and images" build step.
40
+   */
41
+
42
+//   jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
43
+
44
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
45
+                                                      moduleName:@"exampleRedux"
46
+                                               initialProperties:nil
47
+                                                   launchOptions:launchOptions];
48
+
49
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
50
+  UIViewController *rootViewController = [UIViewController new];
51
+  rootViewController.view = rootView;
52
+  self.window.rootViewController = rootViewController;
53
+  [self.window makeKeyAndVisible];
54
+  return YES;
55
+}
56
+
57
+@end

+ 42
- 0
example-redux/ios/exampleRedux/Base.lproj/LaunchScreen.xib View File

@@ -0,0 +1,42 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
6
+        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
7
+    </dependencies>
8
+    <objects>
9
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
10
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
11
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
12
+            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
13
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
14
+            <subviews>
15
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
16
+                    <rect key="frame" x="20" y="439" width="441" height="21"/>
17
+                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
18
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
19
+                    <nil key="highlightedColor"/>
20
+                </label>
21
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="exampleRedux" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
22
+                    <rect key="frame" x="20" y="140" width="441" height="43"/>
23
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
24
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
25
+                    <nil key="highlightedColor"/>
26
+                </label>
27
+            </subviews>
28
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
29
+            <constraints>
30
+                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
31
+                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
32
+                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
33
+                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
34
+                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
35
+                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
36
+            </constraints>
37
+            <nil key="simulatedStatusBarMetrics"/>
38
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
39
+            <point key="canvasLocation" x="548" y="455"/>
40
+        </view>
41
+    </objects>
42
+</document>

+ 38
- 0
example-redux/ios/exampleRedux/Images.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,38 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "29x29",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "29x29",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "40x40",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "40x40",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "60x60",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "60x60",
31
+      "scale" : "3x"
32
+    }
33
+  ],
34
+  "info" : {
35
+    "version" : 1,
36
+    "author" : "xcode"
37
+  }
38
+}

+ 48
- 0
example-redux/ios/exampleRedux/Info.plist View File

@@ -0,0 +1,48 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>APPL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>UILaunchStoryboardName</key>
26
+	<string>LaunchScreen</string>
27
+	<key>UIRequiredDeviceCapabilities</key>
28
+	<array>
29
+		<string>armv7</string>
30
+	</array>
31
+	<key>UISupportedInterfaceOrientations</key>
32
+	<array>
33
+		<string>UIInterfaceOrientationPortrait</string>
34
+		<string>UIInterfaceOrientationLandscapeLeft</string>
35
+		<string>UIInterfaceOrientationLandscapeRight</string>
36
+	</array>
37
+	<key>UIViewControllerBasedStatusBarAppearance</key>
38
+	<false/>
39
+	<key>NSLocationWhenInUseUsageDescription</key>
40
+	<string></string>
41
+  <key>NSAppTransportSecurity</key>
42
+  <dict>
43
+    <!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
44
+    <key>NSAllowsArbitraryLoads</key>
45
+    <true/>
46
+  </dict>
47
+</dict>
48
+</plist>

+ 18
- 0
example-redux/ios/exampleRedux/main.m View File

@@ -0,0 +1,18 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+
12
+#import "AppDelegate.h"
13
+
14
+int main(int argc, char * argv[]) {
15
+  @autoreleasepool {
16
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
17
+  }
18
+}

+ 24
- 0
example-redux/ios/exampleReduxTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 70
- 0
example-redux/ios/exampleReduxTests/exampleReduxTests.m View File

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+#import <XCTest/XCTest.h>
12
+
13
+#import "RCTLog.h"
14
+#import "RCTRootView.h"
15
+
16
+#define TIMEOUT_SECONDS 240
17
+#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
18
+
19
+@interface exampleReduxTests : XCTestCase
20
+
21
+@end
22
+
23
+@implementation exampleReduxTests
24
+
25
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
26
+{
27
+  if (test(view)) {
28
+    return YES;
29
+  }
30
+  for (UIView *subview in [view subviews]) {
31
+    if ([self findSubviewInView:subview matching:test]) {
32
+      return YES;
33
+    }
34
+  }
35
+  return NO;
36
+}
37
+
38
+- (void)testRendersWelcomeScreen
39
+{
40
+  UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
41
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
42
+  BOOL foundElement = NO;
43
+
44
+  __block NSString *redboxError = nil;
45
+  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
46
+    if (level >= RCTLogLevelError) {
47
+      redboxError = message;
48
+    }
49
+  });
50
+
51
+  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
52
+    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
53
+    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
54
+
55
+    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
56
+      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
57
+        return YES;
58
+      }
59
+      return NO;
60
+    }];
61
+  }
62
+
63
+  RCTSetLogFunction(RCTDefaultLogFunction);
64
+
65
+  XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
66
+  XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
67
+}
68
+
69
+
70
+@end

+ 11
- 0
example-redux/package.json View File

@@ -0,0 +1,11 @@
1
+{
2
+  "name": "exampleRedux",
3
+  "version": "0.0.1",
4
+  "private": true,
5
+  "scripts": {
6
+    "start": "node node_modules/react-native/local-cli/cli.js start"
7
+  },
8
+  "dependencies": {
9
+    "react-native": "^0.21.0"
10
+  }
11
+}

+ 65
- 0
example/.flowconfig View File

@@ -0,0 +1,65 @@
1
+[ignore]
2
+
3
+# We fork some components by platform.
4
+.*/*.web.js
5
+.*/*.android.js
6
+
7
+# Some modules have their own node_modules with overlap
8
+.*/node_modules/node-haste/.*
9
+
10
+# Ugh
11
+.*/node_modules/babel.*
12
+.*/node_modules/babylon.*
13
+.*/node_modules/invariant.*
14
+
15
+# Ignore react and fbjs where there are overlaps, but don't ignore
16
+# anything that react-native relies on
17
+.*/node_modules/fbjs/lib/Map.js
18
+.*/node_modules/fbjs/lib/Promise.js
19
+.*/node_modules/fbjs/lib/fetch.js
20
+.*/node_modules/fbjs/lib/ExecutionEnvironment.js
21
+.*/node_modules/fbjs/lib/isEmpty.js
22
+.*/node_modules/fbjs/lib/crc32.js
23
+.*/node_modules/fbjs/lib/ErrorUtils.js
24
+
25
+# Flow has a built-in definition for the 'react' module which we prefer to use
26
+# over the currently-untyped source
27
+.*/node_modules/react/react.js
28
+.*/node_modules/react/lib/React.js
29
+.*/node_modules/react/lib/ReactDOM.js
30
+
31
+# Ignore commoner tests
32
+.*/node_modules/commoner/test/.*
33
+
34
+# See https://github.com/facebook/flow/issues/442
35
+.*/react-tools/node_modules/commoner/lib/reader.js
36
+
37
+# Ignore jest
38
+.*/node_modules/jest-cli/.*
39
+
40
+# Ignore Website
41
+.*/website/.*
42
+
43
+[include]
44
+
45
+[libs]
46
+node_modules/react-native/Libraries/react-native/react-native-interface.js
47
+
48
+[options]
49
+module.system=haste
50
+
51
+munge_underscores=true
52
+
53
+module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
54
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\)$' -> 'RelativeImageStub'
55
+
56
+suppress_type=$FlowIssue
57
+suppress_type=$FlowFixMe
58
+suppress_type=$FixMe
59
+
60
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
61
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-1]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
62
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
63
+
64
+[version]
65
+0.21.0

+ 34
- 0
example/.gitignore View File

@@ -0,0 +1,34 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+
25
+# Android/IJ
26
+#
27
+.idea
28
+.gradle
29
+local.properties
30
+
31
+# node.js
32
+#
33
+node_modules/
34
+npm-debug.log

+ 1
- 0
example/.watchmanconfig View File

@@ -0,0 +1 @@
1
+{}

+ 126
- 0
example/android/app/build.gradle View File

@@ -0,0 +1,126 @@
1
+apply plugin: "com.android.application"
2
+
3
+import com.android.build.OutputFile
4
+
5
+/**
6
+ * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7
+ * and bundleReleaseJsAndAssets).
8
+ * These basically call `react-native bundle` with the correct arguments during the Android build
9
+ * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10
+ * bundle directly from the development server. Below you can see all the possible configurations
11
+ * and their defaults. If you decide to add a configuration block, make sure to add it before the
12
+ * `apply from: "react.gradle"` line.
13
+ *
14
+ * project.ext.react = [
15
+ *   // the name of the generated asset file containing your JS bundle
16
+ *   bundleAssetName: "index.android.bundle",
17
+ *
18
+ *   // the entry file for bundle generation
19
+ *   entryFile: "index.android.js",
20
+ *
21
+ *   // whether to bundle JS and assets in debug mode
22
+ *   bundleInDebug: false,
23
+ *
24
+ *   // whether to bundle JS and assets in release mode
25
+ *   bundleInRelease: true,
26
+ *
27
+ *   // whether to bundle JS and assets in another build variant (if configured).
28
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
29
+ *   // The configuration property can be in the following formats
30
+ *   //         'bundleIn${productFlavor}${buildType}'
31
+ *   //         'bundleIn${buildType}'
32
+ *   // bundleInFreeDebug: true,
33
+ *   // bundleInPaidRelease: true,
34
+ *   // bundleInBeta: true,
35
+ *
36
+ *   // the root of your project, i.e. where "package.json" lives
37
+ *   root: "../../",
38
+ *
39
+ *   // where to put the JS bundle asset in debug mode
40
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
41
+ *
42
+ *   // where to put the JS bundle asset in release mode
43
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
44
+ *
45
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
46
+ *   // require('./image.png')), in debug mode
47
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
48
+ *
49
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
50
+ *   // require('./image.png')), in release mode
51
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
52
+ *
53
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
54
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
55
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
56
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
57
+ *   // for example, you might want to remove it from here.
58
+ *   inputExcludes: ["android/**", "ios/**"]
59
+ * ]
60
+ */
61
+
62
+apply from: "react.gradle"
63
+
64
+/**
65
+ * Set this to true to create two separate APKs instead of one:
66
+ *   - An APK that only works on ARM devices
67
+ *   - An APK that only works on x86 devices
68
+ * The advantage is the size of the APK is reduced by about 4MB.
69
+ * Upload all the APKs to the Play Store and people will download
70
+ * the correct one based on the CPU architecture of their device.
71
+ */
72
+def enableSeparateBuildPerCPUArchitecture = false
73
+
74
+/**
75
+ * Run Proguard to shrink the Java bytecode in release builds.
76
+ */
77
+def enableProguardInReleaseBuilds = false
78
+
79
+android {
80
+    compileSdkVersion 23
81
+    buildToolsVersion "23.0.1"
82
+
83
+    defaultConfig {
84
+        applicationId "com.example"
85
+        minSdkVersion 16
86
+        targetSdkVersion 22
87
+        versionCode 1
88
+        versionName "1.0"
89
+        ndk {
90
+            abiFilters "armeabi-v7a", "x86"
91
+        }
92
+    }
93
+    splits {
94
+        abi {
95
+            reset()
96
+            enable enableSeparateBuildPerCPUArchitecture
97
+            universalApk false  // If true, also generate a universal APK
98
+            include "armeabi-v7a", "x86"
99
+        }
100
+    }
101
+    buildTypes {
102
+        release {
103
+            minifyEnabled enableProguardInReleaseBuilds
104
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
105
+        }
106
+    }
107
+    // applicationVariants are e.g. debug, release
108
+    applicationVariants.all { variant ->
109
+        variant.outputs.each { output ->
110
+            // For each separate APK per architecture, set a unique version code as described here:
111
+            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
112
+            def versionCodes = ["armeabi-v7a":1, "x86":2]
113
+            def abi = output.getFilter(OutputFile.ABI)
114
+            if (abi != null) {  // null for the universal-debug, universal-release variants
115
+                output.versionCodeOverride =
116
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
117
+            }
118
+        }
119
+    }
120
+}
121
+
122
+dependencies {
123
+    compile fileTree(dir: "libs", include: ["*.jar"])
124
+    compile "com.android.support:appcompat-v7:23.0.1"
125
+    compile "com.facebook.react:react-native:+"  // From node_modules
126
+}

+ 67
- 0
example/android/app/proguard-rules.pro View File

@@ -0,0 +1,67 @@
1
+# Add project specific ProGuard rules here.
2
+# By default, the flags in this file are appended to flags specified
3
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4
+# You can edit the include path and order by changing the proguardFiles
5
+# directive in build.gradle.
6
+#
7
+# For more details, see
8
+#   http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+# Add any project specific keep options here:
11
+
12
+# If your project uses WebView with JS, uncomment the following
13
+# and specify the fully qualified class name to the JavaScript interface
14
+# class:
15
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16
+#   public *;
17
+#}
18
+
19
+# Disabling obfuscation is useful if you collect stack traces from production crashes
20
+# (unless you are using a system that supports de-obfuscate the stack traces).
21
+-dontobfuscate
22
+
23
+# React Native
24
+
25
+# Keep our interfaces so they can be used by other ProGuard rules.
26
+# See http://sourceforge.net/p/proguard/bugs/466/
27
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
28
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
29
+
30
+# Do not strip any method/class that is annotated with @DoNotStrip
31
+-keep @com.facebook.proguard.annotations.DoNotStrip class *
32
+-keepclassmembers class * {
33
+    @com.facebook.proguard.annotations.DoNotStrip *;
34
+}
35
+
36
+-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
37
+  void set*(***);
38
+  *** get*();
39
+}
40
+
41
+-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
42
+-keep class * extends com.facebook.react.bridge.NativeModule { *; }
43
+-keepclassmembers,includedescriptorclasses class * { native <methods>; }
44
+-keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
45
+-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
46
+-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
47
+
48
+-dontwarn com.facebook.react.**
49
+
50
+# okhttp
51
+
52
+-keepattributes Signature
53
+-keepattributes *Annotation*
54
+-keep class com.squareup.okhttp.** { *; }
55
+-keep interface com.squareup.okhttp.** { *; }
56
+-dontwarn com.squareup.okhttp.**
57
+
58
+# okio
59
+
60
+-keep class sun.misc.Unsafe { *; }
61
+-dontwarn java.nio.file.*
62
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
63
+-dontwarn okio.**
64
+
65
+# stetho
66
+
67
+-dontwarn com.facebook.stetho.**

+ 97
- 0
example/android/app/react.gradle View File

@@ -0,0 +1,97 @@
1
+import org.apache.tools.ant.taskdefs.condition.Os
2
+
3
+def config = project.hasProperty("react") ? project.react : [];
4
+
5
+def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
6
+def entryFile = config.entryFile ?: "index.android.js"
7
+
8
+// because elvis operator
9
+def elvisFile(thing) {
10
+    return thing ? file(thing) : null;
11
+}
12
+
13
+def reactRoot = elvisFile(config.root) ?: file("../../")
14
+def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
15
+
16
+void runBefore(String dependentTaskName, Task task) {
17
+    Task dependentTask = tasks.findByPath(dependentTaskName);
18
+    if (dependentTask != null) {
19
+        dependentTask.dependsOn task
20
+    }
21
+}
22
+
23
+gradle.projectsEvaluated {
24
+    // Grab all build types and product flavors
25
+    def buildTypes = android.buildTypes.collect { type -> type.name }
26
+    def productFlavors = android.productFlavors.collect { flavor -> flavor.name }
27
+
28
+    // When no product flavors defined, use empty
29
+    if (!productFlavors) productFlavors.add('')
30
+
31
+    productFlavors.each { productFlavorName ->
32
+        buildTypes.each { buildTypeName ->
33
+            // Create variant and target names
34
+            def targetName = "${productFlavorName.capitalize()}${buildTypeName.capitalize()}"
35
+            def targetPath = productFlavorName ?
36
+                    "${productFlavorName}/${buildTypeName}" :
37
+                    "${buildTypeName}"
38
+
39
+            // React js bundle directories
40
+            def jsBundleDirConfigName = "jsBundleDir${targetName}"
41
+            def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
42
+                    file("$buildDir/intermediates/assets/${targetPath}")
43
+
44
+            def resourcesDirConfigName = "jsBundleDir${targetName}"
45
+            def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
46
+                    file("$buildDir/intermediates/res/merged/${targetPath}")
47
+            def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
48
+
49
+            // Bundle task name for variant
50
+            def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"
51
+
52
+            def currentBundleTask = tasks.create(
53
+                    name: bundleJsAndAssetsTaskName,
54
+                    type: Exec) {
55
+                group = "react"
56
+                description = "bundle JS and assets for ${targetName}."
57
+
58
+                // Create dirs if they are not there (e.g. the "clean" task just ran)
59
+                doFirst {
60
+                    jsBundleDir.mkdirs()
61
+                    resourcesDir.mkdirs()
62
+                }
63
+
64
+                // Set up inputs and outputs so gradle can cache the result
65
+                inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
66
+                outputs.dir jsBundleDir
67
+                outputs.dir resourcesDir
68
+
69
+                // Set up the call to the react-native cli
70
+                workingDir reactRoot
71
+
72
+                // Set up dev mode
73
+                def devEnabled = !targetName.toLowerCase().contains("release")
74
+                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
75
+                    commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}",
76
+                            "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir
77
+                } else {
78
+                    commandLine "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}",
79
+                            "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir
80
+                }
81
+
82
+                enabled config."bundleIn${targetName}" ||
83
+                    config."bundleIn${buildTypeName.capitalize()}" ?:
84
+                            targetName.toLowerCase().contains("release")
85
+            }
86
+
87
+            // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
88
+            currentBundleTask.dependsOn("merge${targetName}Resources")
89
+            currentBundleTask.dependsOn("merge${targetName}Assets")
90
+
91
+            runBefore("processArmeabi-v7a${targetName}Resources", currentBundleTask)
92
+            runBefore("processX86${targetName}Resources", currentBundleTask)
93
+            runBefore("processUniversal${targetName}Resources", currentBundleTask)
94
+            runBefore("process${targetName}Resources", currentBundleTask)
95
+        }
96
+    }
97
+}

+ 23
- 0
example/android/app/src/main/AndroidManifest.xml View File

@@ -0,0 +1,23 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+    package="com.example">
3
+
4
+    <uses-permission android:name="android.permission.INTERNET" />
5
+
6
+    <application
7
+      android:allowBackup="true"
8
+      android:label="@string/app_name"
9
+      android:icon="@mipmap/ic_launcher"
10
+      android:theme="@style/AppTheme">
11
+      <activity
12
+        android:name=".MainActivity"
13
+        android:label="@string/app_name"
14
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
15
+        <intent-filter>
16
+            <action android:name="android.intent.action.MAIN" />
17
+            <category android:name="android.intent.category.LAUNCHER" />
18
+        </intent-filter>
19
+      </activity>
20
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
21
+    </application>
22
+
23
+</manifest>

+ 40
- 0
example/android/app/src/main/java/com/example/MainActivity.java View File

@@ -0,0 +1,40 @@
1
+package com.example;
2
+
3
+import com.facebook.react.ReactActivity;
4
+import com.facebook.react.ReactPackage;
5
+import com.facebook.react.shell.MainReactPackage;
6
+
7
+import java.util.Arrays;
8
+import java.util.List;
9
+
10
+public class MainActivity extends ReactActivity {
11
+
12
+    /**
13
+     * Returns the name of the main component registered from JavaScript.
14
+     * This is used to schedule rendering of the component.
15
+     */
16
+    @Override
17
+    protected String getMainComponentName() {
18
+        return "example";
19
+    }
20
+
21
+    /**
22
+     * Returns whether dev mode should be enabled.
23
+     * This enables e.g. the dev menu.
24
+     */
25
+    @Override
26
+    protected boolean getUseDeveloperSupport() {
27
+        return BuildConfig.DEBUG;
28
+    }
29
+
30
+    /**
31
+     * A list of packages used by the app. If the app uses additional views
32
+     * or modules besides the default ones, add more packages here.
33
+     */
34
+    @Override
35
+    protected List<ReactPackage> getPackages() {
36
+        return Arrays.<ReactPackage>asList(
37
+            new MainReactPackage()
38
+        );
39
+    }
40
+}

BIN
example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File


+ 3
- 0
example/android/app/src/main/res/values/strings.xml View File

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">example</string>
3
+</resources>

+ 8
- 0
example/android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,8 @@
1
+<resources>
2
+
3
+    <!-- Base application theme. -->
4
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
5
+        <!-- Customize your theme here. -->
6
+    </style>
7
+
8
+</resources>

+ 24
- 0
example/android/build.gradle View File

@@ -0,0 +1,24 @@
1
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+buildscript {
4
+    repositories {
5
+        jcenter()
6
+    }
7
+    dependencies {
8
+        classpath 'com.android.tools.build:gradle:1.3.1'
9
+
10
+        // NOTE: Do not place your application dependencies here; they belong
11
+        // in the individual module build.gradle files
12
+    }
13
+}
14
+
15
+allprojects {
16
+    repositories {
17
+        mavenLocal()
18
+        jcenter()
19
+        maven {
20
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
21
+            url "$projectDir/../../node_modules/react-native/android"
22
+        }
23
+    }
24
+}

+ 20
- 0
example/android/gradle.properties View File

@@ -0,0 +1,20 @@
1
+# Project-wide Gradle settings.
2
+
3
+# IDE (e.g. Android Studio) users:
4
+# Gradle settings configured through the IDE *will override*
5
+# any settings specified in this file.
6
+
7
+# For more details on how to configure your build environment visit
8
+# http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+# Specifies the JVM arguments used for the daemon process.
11
+# The setting is particularly useful for tweaking memory settings.
12
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
13
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14
+
15
+# When configured, Gradle will run in incubating parallel mode.
16
+# This option should only be used with decoupled projects. More details, visit
17
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
+# org.gradle.parallel=true
19
+
20
+android.useDeprecatedNdk=true

BIN
example/android/gradle/wrapper/gradle-wrapper.jar View File


+ 5
- 0
example/android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+zipStoreBase=GRADLE_USER_HOME
4
+zipStorePath=wrapper/dists
5
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

+ 164
- 0
example/android/gradlew View File

@@ -0,0 +1,164 @@
1
+#!/usr/bin/env bash
2
+
3
+##############################################################################
4
+##
5
+##  Gradle start up script for UN*X
6
+##
7
+##############################################################################
8
+
9
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10
+DEFAULT_JVM_OPTS=""
11
+
12
+APP_NAME="Gradle"
13
+APP_BASE_NAME=`basename "$0"`
14
+
15
+# Use the maximum available, or set MAX_FD != -1 to use that value.
16
+MAX_FD="maximum"
17
+
18
+warn ( ) {
19
+    echo "$*"
20
+}
21
+
22
+die ( ) {
23
+    echo
24
+    echo "$*"
25
+    echo
26
+    exit 1
27
+}
28
+
29
+# OS specific support (must be 'true' or 'false').
30
+cygwin=false
31
+msys=false
32
+darwin=false
33
+case "`uname`" in
34
+  CYGWIN* )
35
+    cygwin=true
36
+    ;;
37
+  Darwin* )
38
+    darwin=true
39
+    ;;
40
+  MINGW* )
41
+    msys=true
42
+    ;;
43
+esac
44
+
45
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
46
+if $cygwin ; then
47
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48
+fi
49
+
50
+# Attempt to set APP_HOME
51
+# Resolve links: $0 may be a link
52
+PRG="$0"
53
+# Need this for relative symlinks.
54
+while [ -h "$PRG" ] ; do
55
+    ls=`ls -ld "$PRG"`
56
+    link=`expr "$ls" : '.*-> \(.*\)$'`
57
+    if expr "$link" : '/.*' > /dev/null; then
58
+        PRG="$link"
59
+    else
60
+        PRG=`dirname "$PRG"`"/$link"
61
+    fi
62
+done
63
+SAVED="`pwd`"
64
+cd "`dirname \"$PRG\"`/" >&-
65
+APP_HOME="`pwd -P`"
66
+cd "$SAVED" >&-
67
+
68
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69
+
70
+# Determine the Java command to use to start the JVM.
71
+if [ -n "$JAVA_HOME" ] ; then
72
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73
+        # IBM's JDK on AIX uses strange locations for the executables
74
+        JAVACMD="$JAVA_HOME/jre/sh/java"
75
+    else
76
+        JAVACMD="$JAVA_HOME/bin/java"
77
+    fi
78
+    if [ ! -x "$JAVACMD" ] ; then
79
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80
+
81
+Please set the JAVA_HOME variable in your environment to match the
82
+location of your Java installation."
83
+    fi
84
+else
85
+    JAVACMD="java"
86
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87
+
88
+Please set the JAVA_HOME variable in your environment to match the
89
+location of your Java installation."
90
+fi
91
+
92
+# Increase the maximum file descriptors if we can.
93
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94
+    MAX_FD_LIMIT=`ulimit -H -n`
95
+    if [ $? -eq 0 ] ; then
96
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97
+            MAX_FD="$MAX_FD_LIMIT"
98
+        fi
99
+        ulimit -n $MAX_FD
100
+        if [ $? -ne 0 ] ; then
101
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
102
+        fi
103
+    else
104
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105
+    fi
106
+fi
107
+
108
+# For Darwin, add options to specify how the application appears in the dock
109
+if $darwin; then
110
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111
+fi
112
+
113
+# For Cygwin, switch paths to Windows format before running java
114
+if $cygwin ; then
115
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117
+
118
+    # We build the pattern for arguments to be converted via cygpath
119
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120
+    SEP=""
121
+    for dir in $ROOTDIRSRAW ; do
122
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
123
+        SEP="|"
124
+    done
125
+    OURCYGPATTERN="(^($ROOTDIRS))"
126
+    # Add a user-defined pattern to the cygpath arguments
127
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129
+    fi
130
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
131
+    i=0
132
+    for arg in "$@" ; do
133
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
135
+
136
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
137
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138
+        else
139
+            eval `echo args$i`="\"$arg\""
140
+        fi
141
+        i=$((i+1))
142
+    done
143
+    case $i in
144
+        (0) set -- ;;
145
+        (1) set -- "$args0" ;;
146
+        (2) set -- "$args0" "$args1" ;;
147
+        (3) set -- "$args0" "$args1" "$args2" ;;
148
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154
+    esac
155
+fi
156
+
157
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158
+function splitJvmOpts() {
159
+    JVM_OPTS=("$@")
160
+}
161
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163
+
164
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90
- 0
example/android/gradlew.bat View File

@@ -0,0 +1,90 @@
1
+@if "%DEBUG%" == "" @echo off
2
+@rem ##########################################################################
3
+@rem
4
+@rem  Gradle startup script for Windows
5
+@rem
6
+@rem ##########################################################################
7
+
8
+@rem Set local scope for the variables with windows NT shell
9
+if "%OS%"=="Windows_NT" setlocal
10
+
11
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12
+set DEFAULT_JVM_OPTS=
13
+
14
+set DIRNAME=%~dp0
15
+if "%DIRNAME%" == "" set DIRNAME=.
16
+set APP_BASE_NAME=%~n0
17
+set APP_HOME=%DIRNAME%
18
+
19
+@rem Find java.exe
20
+if defined JAVA_HOME goto findJavaFromJavaHome
21
+
22
+set JAVA_EXE=java.exe
23
+%JAVA_EXE% -version >NUL 2>&1
24
+if "%ERRORLEVEL%" == "0" goto init
25
+
26
+echo.
27
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28
+echo.
29
+echo Please set the JAVA_HOME variable in your environment to match the
30
+echo location of your Java installation.
31
+
32
+goto fail
33
+
34
+:findJavaFromJavaHome
35
+set JAVA_HOME=%JAVA_HOME:"=%
36
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
+
38
+if exist "%JAVA_EXE%" goto init
39
+
40
+echo.
41
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42
+echo.
43
+echo Please set the JAVA_HOME variable in your environment to match the
44
+echo location of your Java installation.
45
+
46
+goto fail
47
+
48
+:init
49
+@rem Get command-line arguments, handling Windowz variants
50
+
51
+if not "%OS%" == "Windows_NT" goto win9xME_args
52
+if "%@eval[2+2]" == "4" goto 4NT_args
53
+
54
+:win9xME_args
55
+@rem Slurp the command line arguments.
56
+set CMD_LINE_ARGS=
57
+set _SKIP=2
58
+
59
+:win9xME_args_slurp
60
+if "x%~1" == "x" goto execute
61
+
62
+set CMD_LINE_ARGS=%*
63
+goto execute
64
+
65
+:4NT_args
66
+@rem Get arguments from the 4NT Shell from JP Software
67
+set CMD_LINE_ARGS=%$
68
+
69
+:execute
70
+@rem Setup the command line
71
+
72
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73
+
74
+@rem Execute Gradle
75
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76
+
77
+:end
78
+@rem End local scope for the variables with windows NT shell
79
+if "%ERRORLEVEL%"=="0" goto mainEnd
80
+
81
+:fail
82
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83
+rem the _cmd.exe /c_ return code!
84
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85
+exit /b 1
86
+
87
+:mainEnd
88
+if "%OS%"=="Windows_NT" endlocal
89
+
90
+:omega

+ 3
- 0
example/android/settings.gradle View File

@@ -0,0 +1,3 @@
1
+rootProject.name = 'example'
2
+
3
+include ':app'

+ 51
- 0
example/index.android.js View File

@@ -0,0 +1,51 @@
1
+/**
2
+ * Sample React Native App
3
+ * https://github.com/facebook/react-native
4
+ */
5
+'use strict';
6
+import React, {
7
+  AppRegistry,
8
+  Component,
9
+  StyleSheet,
10
+  Text,
11
+  View
12
+} from 'react-native';
13
+
14
+class example extends Component {
15
+  render() {
16
+    return (
17
+      <View style={styles.container}>
18
+        <Text style={styles.welcome}>
19
+          Welcome to React Native!
20
+        </Text>
21
+        <Text style={styles.instructions}>
22
+          To get started, edit index.android.js
23
+        </Text>
24
+        <Text style={styles.instructions}>
25
+          Shake or press menu button for dev menu
26
+        </Text>
27
+      </View>
28
+    );
29
+  }
30
+}
31
+
32
+const styles = StyleSheet.create({
33
+  container: {
34
+    flex: 1,
35
+    justifyContent: 'center',
36
+    alignItems: 'center',
37
+    backgroundColor: '#F5FCFF',
38
+  },
39
+  welcome: {
40
+    fontSize: 20,
41
+    textAlign: 'center',
42
+    margin: 10,
43
+  },
44
+  instructions: {
45
+    textAlign: 'center',
46
+    color: '#333333',
47
+    marginBottom: 5,
48
+  },
49
+});
50
+
51
+AppRegistry.registerComponent('example', () => example);

+ 52
- 0
example/index.ios.js View File

@@ -0,0 +1,52 @@
1
+/**
2
+ * Sample React Native App
3
+ * https://github.com/facebook/react-native
4
+ */
5
+'use strict';
6
+import React, {
7
+  AppRegistry,
8
+  Component,
9
+  StyleSheet,
10
+  Text,
11
+  View
12
+} from 'react-native';
13
+
14
+class example extends Component {
15
+  render() {
16
+    return (
17
+      <View style={styles.container}>
18
+        <Text style={styles.welcome}>
19
+          Welcome to React Native!
20
+        </Text>
21
+        <Text style={styles.instructions}>
22
+          To get started, edit index.ios.js
23
+        </Text>
24
+        <Text style={styles.instructions}>
25
+          Press Cmd+R to reload,{'\n'}
26
+          Cmd+D or shake for dev menu
27
+        </Text>
28
+      </View>
29
+    );
30
+  }
31
+}
32
+
33
+const styles = StyleSheet.create({
34
+  container: {
35
+    flex: 1,
36
+    justifyContent: 'center',
37
+    alignItems: 'center',
38
+    backgroundColor: '#F5FCFF',
39
+  },
40
+  welcome: {
41
+    fontSize: 20,
42
+    textAlign: 'center',
43
+    margin: 10,
44
+  },
45
+  instructions: {
46
+    textAlign: 'center',
47
+    color: '#333333',
48
+    marginBottom: 5,
49
+  },
50
+});
51
+
52
+AppRegistry.registerComponent('example', () => example);

+ 763
- 0
example/ios/example.xcodeproj/project.pbxproj View File

@@ -0,0 +1,763 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
11
+		00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
12
+		00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
13
+		00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
14
+		00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
15
+		00E356F31AD99517003FC87E /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; };
16
+		133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
17
+		139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
18
+		139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
19
+		13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
20
+		13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
21
+		13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
22
+		13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
23
+		146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
24
+		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
25
+/* End PBXBuildFile section */
26
+
27
+/* Begin PBXContainerItemProxy section */
28
+		00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
29
+			isa = PBXContainerItemProxy;
30
+			containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
31
+			proxyType = 2;
32
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
33
+			remoteInfo = RCTActionSheet;
34
+		};
35
+		00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
36
+			isa = PBXContainerItemProxy;
37
+			containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
38
+			proxyType = 2;
39
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
40
+			remoteInfo = RCTGeolocation;
41
+		};
42
+		00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
43
+			isa = PBXContainerItemProxy;
44
+			containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
45
+			proxyType = 2;
46
+			remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
47
+			remoteInfo = RCTImage;
48
+		};
49
+		00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
50
+			isa = PBXContainerItemProxy;
51
+			containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
52
+			proxyType = 2;
53
+			remoteGlobalIDString = 58B511DB1A9E6C8500147676;
54
+			remoteInfo = RCTNetwork;
55
+		};
56
+		00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
57
+			isa = PBXContainerItemProxy;
58
+			containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
59
+			proxyType = 2;
60
+			remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
61
+			remoteInfo = RCTVibration;
62
+		};
63
+		00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
64
+			isa = PBXContainerItemProxy;
65
+			containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
66
+			proxyType = 1;
67
+			remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
68
+			remoteInfo = example;
69
+		};
70
+		139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
71
+			isa = PBXContainerItemProxy;
72
+			containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
73
+			proxyType = 2;
74
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
75
+			remoteInfo = RCTSettings;
76
+		};
77
+		139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
78
+			isa = PBXContainerItemProxy;
79
+			containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
80
+			proxyType = 2;
81
+			remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
82
+			remoteInfo = RCTWebSocket;
83
+		};
84
+		146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
85
+			isa = PBXContainerItemProxy;
86
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
87
+			proxyType = 2;
88
+			remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
89
+			remoteInfo = React;
90
+		};
91
+		78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
92
+			isa = PBXContainerItemProxy;
93
+			containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
94
+			proxyType = 2;
95
+			remoteGlobalIDString = 134814201AA4EA6300B7C361;
96
+			remoteInfo = RCTLinking;
97
+		};
98
+		832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
99
+			isa = PBXContainerItemProxy;
100
+			containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
101
+			proxyType = 2;
102
+			remoteGlobalIDString = 58B5119B1A9E6C1200147676;
103
+			remoteInfo = RCTText;
104
+		};
105
+/* End PBXContainerItemProxy section */
106
+
107
+/* Begin PBXFileReference section */
108
+		008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = main.jsbundle; path = main.jsbundle; sourceTree = "<group>"; };
109
+		00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = "<group>"; };
110
+		00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = ../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj; sourceTree = "<group>"; };
111
+		00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = ../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj; sourceTree = "<group>"; };
112
+		00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = ../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj; sourceTree = "<group>"; };
113
+		00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = "<group>"; };
114
+		00E356EE1AD99517003FC87E /* exampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
115
+		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
116
+		00E356F21AD99517003FC87E /* exampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleTests.m; sourceTree = "<group>"; };
117
+		139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = ../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj; sourceTree = "<group>"; };
118
+		139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = ../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj; sourceTree = "<group>"; };
119
+		13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
120
+		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = "<group>"; };
121
+		13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = "<group>"; };
122
+		13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
123
+		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; };
124
+		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; };
125
+		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = "<group>"; };
126
+		146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = ../node_modules/react-native/React/React.xcodeproj; sourceTree = "<group>"; };
127
+		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = ../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj; sourceTree = "<group>"; };
128
+		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = ../node_modules/react-native/Libraries/Text/RCTText.xcodeproj; sourceTree = "<group>"; };
129
+/* End PBXFileReference section */
130
+
131
+/* Begin PBXFrameworksBuildPhase section */
132
+		00E356EB1AD99517003FC87E /* Frameworks */ = {
133
+			isa = PBXFrameworksBuildPhase;
134
+			buildActionMask = 2147483647;
135
+			files = (
136
+			);
137
+			runOnlyForDeploymentPostprocessing = 0;
138
+		};
139
+		13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
140
+			isa = PBXFrameworksBuildPhase;
141
+			buildActionMask = 2147483647;
142
+			files = (
143
+				146834051AC3E58100842450 /* libReact.a in Frameworks */,
144
+				00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
145
+				00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
146
+				00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
147
+				133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
148
+				00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
149
+				139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
150
+				832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
151
+				00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
152
+				139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
153
+			);
154
+			runOnlyForDeploymentPostprocessing = 0;
155
+		};
156
+/* End PBXFrameworksBuildPhase section */
157
+
158
+/* Begin PBXGroup section */
159
+		00C302A81ABCB8CE00DB3ED1 /* Products */ = {
160
+			isa = PBXGroup;
161
+			children = (
162
+				00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
163
+			);
164
+			name = Products;
165
+			sourceTree = "<group>";
166
+		};
167
+		00C302B61ABCB90400DB3ED1 /* Products */ = {
168
+			isa = PBXGroup;
169
+			children = (
170
+				00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
171
+			);
172
+			name = Products;
173
+			sourceTree = "<group>";
174
+		};
175
+		00C302BC1ABCB91800DB3ED1 /* Products */ = {
176
+			isa = PBXGroup;
177
+			children = (
178
+				00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
179
+			);
180
+			name = Products;
181
+			sourceTree = "<group>";
182
+		};
183
+		00C302D41ABCB9D200DB3ED1 /* Products */ = {
184
+			isa = PBXGroup;
185
+			children = (
186
+				00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
187
+			);
188
+			name = Products;
189
+			sourceTree = "<group>";
190
+		};
191
+		00C302E01ABCB9EE00DB3ED1 /* Products */ = {
192
+			isa = PBXGroup;
193
+			children = (
194
+				00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
195
+			);
196
+			name = Products;
197
+			sourceTree = "<group>";
198
+		};
199
+		00E356EF1AD99517003FC87E /* exampleTests */ = {
200
+			isa = PBXGroup;
201
+			children = (
202
+				00E356F21AD99517003FC87E /* exampleTests.m */,
203
+				00E356F01AD99517003FC87E /* Supporting Files */,
204
+			);
205
+			path = exampleTests;
206
+			sourceTree = "<group>";
207
+		};
208
+		00E356F01AD99517003FC87E /* Supporting Files */ = {
209
+			isa = PBXGroup;
210
+			children = (
211
+				00E356F11AD99517003FC87E /* Info.plist */,
212
+			);
213
+			name = "Supporting Files";
214
+			sourceTree = "<group>";
215
+		};
216
+		139105B71AF99BAD00B5F7CC /* Products */ = {
217
+			isa = PBXGroup;
218
+			children = (
219
+				139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
220
+			);
221
+			name = Products;
222
+			sourceTree = "<group>";
223
+		};
224
+		139FDEE71B06529A00C62182 /* Products */ = {
225
+			isa = PBXGroup;
226
+			children = (
227
+				139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
228
+			);
229
+			name = Products;
230
+			sourceTree = "<group>";
231
+		};
232
+		13B07FAE1A68108700A75B9A /* example */ = {
233
+			isa = PBXGroup;
234
+			children = (
235
+				008F07F21AC5B25A0029DE68 /* main.jsbundle */,
236
+				13B07FAF1A68108700A75B9A /* AppDelegate.h */,
237
+				13B07FB01A68108700A75B9A /* AppDelegate.m */,
238
+				13B07FB51A68108700A75B9A /* Images.xcassets */,
239
+				13B07FB61A68108700A75B9A /* Info.plist */,
240
+				13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
241
+				13B07FB71A68108700A75B9A /* main.m */,
242
+			);
243
+			name = example;
244
+			sourceTree = "<group>";
245
+		};
246
+		146834001AC3E56700842450 /* Products */ = {
247
+			isa = PBXGroup;
248
+			children = (
249
+				146834041AC3E56700842450 /* libReact.a */,
250
+			);
251
+			name = Products;
252
+			sourceTree = "<group>";
253
+		};
254
+		78C398B11ACF4ADC00677621 /* Products */ = {
255
+			isa = PBXGroup;
256
+			children = (
257
+				78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
258
+			);
259
+			name = Products;
260
+			sourceTree = "<group>";
261
+		};
262
+		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
263
+			isa = PBXGroup;
264
+			children = (
265
+				146833FF1AC3E56700842450 /* React.xcodeproj */,
266
+				00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
267
+				00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
268
+				00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
269
+				78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
270
+				00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
271
+				139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
272
+				832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
273
+				00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
274
+				139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
275
+			);
276
+			name = Libraries;
277
+			sourceTree = "<group>";
278
+		};
279
+		832341B11AAA6A8300B99B32 /* Products */ = {
280
+			isa = PBXGroup;
281
+			children = (
282
+				832341B51AAA6A8300B99B32 /* libRCTText.a */,
283
+			);
284
+			name = Products;
285
+			sourceTree = "<group>";
286
+		};
287
+		83CBB9F61A601CBA00E9B192 = {
288
+			isa = PBXGroup;
289
+			children = (
290
+				13B07FAE1A68108700A75B9A /* example */,
291
+				832341AE1AAA6A7D00B99B32 /* Libraries */,
292
+				00E356EF1AD99517003FC87E /* exampleTests */,
293
+				83CBBA001A601CBA00E9B192 /* Products */,
294
+			);
295
+			indentWidth = 2;
296
+			sourceTree = "<group>";
297
+			tabWidth = 2;
298
+		};
299
+		83CBBA001A601CBA00E9B192 /* Products */ = {
300
+			isa = PBXGroup;
301
+			children = (
302
+				13B07F961A680F5B00A75B9A /* example.app */,
303
+				00E356EE1AD99517003FC87E /* exampleTests.xctest */,
304
+			);
305
+			name = Products;
306
+			sourceTree = "<group>";
307
+		};
308
+/* End PBXGroup section */
309
+
310
+/* Begin PBXNativeTarget section */
311
+		00E356ED1AD99517003FC87E /* exampleTests */ = {
312
+			isa = PBXNativeTarget;
313
+			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */;
314
+			buildPhases = (
315
+				00E356EA1AD99517003FC87E /* Sources */,
316
+				00E356EB1AD99517003FC87E /* Frameworks */,
317
+				00E356EC1AD99517003FC87E /* Resources */,
318
+			);
319
+			buildRules = (
320
+			);
321
+			dependencies = (
322
+				00E356F51AD99517003FC87E /* PBXTargetDependency */,
323
+			);
324
+			name = exampleTests;
325
+			productName = exampleTests;
326
+			productReference = 00E356EE1AD99517003FC87E /* exampleTests.xctest */;
327
+			productType = "com.apple.product-type.bundle.unit-test";
328
+		};
329
+		13B07F861A680F5B00A75B9A /* example */ = {
330
+			isa = PBXNativeTarget;
331
+			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */;
332
+			buildPhases = (
333
+				13B07F871A680F5B00A75B9A /* Sources */,
334
+				13B07F8C1A680F5B00A75B9A /* Frameworks */,
335
+				13B07F8E1A680F5B00A75B9A /* Resources */,
336
+				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
337
+			);
338
+			buildRules = (
339
+			);
340
+			dependencies = (
341
+			);
342
+			name = example;
343
+			productName = "Hello World";
344
+			productReference = 13B07F961A680F5B00A75B9A /* example.app */;
345
+			productType = "com.apple.product-type.application";
346
+		};
347
+/* End PBXNativeTarget section */
348
+
349
+/* Begin PBXProject section */
350
+		83CBB9F71A601CBA00E9B192 /* Project object */ = {
351
+			isa = PBXProject;
352
+			attributes = {
353
+				LastUpgradeCheck = 0610;
354
+				ORGANIZATIONNAME = Facebook;
355
+				TargetAttributes = {
356
+					00E356ED1AD99517003FC87E = {
357
+						CreatedOnToolsVersion = 6.2;
358
+						TestTargetID = 13B07F861A680F5B00A75B9A;
359
+					};
360
+				};
361
+			};
362
+			buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */;
363
+			compatibilityVersion = "Xcode 3.2";
364
+			developmentRegion = English;
365
+			hasScannedForEncodings = 0;
366
+			knownRegions = (
367
+				en,
368
+				Base,
369
+			);
370
+			mainGroup = 83CBB9F61A601CBA00E9B192;
371
+			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
372
+			projectDirPath = "";
373
+			projectReferences = (
374
+				{
375
+					ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
376
+					ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
377
+				},
378
+				{
379
+					ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
380
+					ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
381
+				},
382
+				{
383
+					ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
384
+					ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
385
+				},
386
+				{
387
+					ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
388
+					ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
389
+				},
390
+				{
391
+					ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
392
+					ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
393
+				},
394
+				{
395
+					ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
396
+					ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
397
+				},
398
+				{
399
+					ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
400
+					ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
401
+				},
402
+				{
403
+					ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
404
+					ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
405
+				},
406
+				{
407
+					ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
408
+					ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
409
+				},
410
+				{
411
+					ProductGroup = 146834001AC3E56700842450 /* Products */;
412
+					ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
413
+				},
414
+			);
415
+			projectRoot = "";
416
+			targets = (
417
+				13B07F861A680F5B00A75B9A /* example */,
418
+				00E356ED1AD99517003FC87E /* exampleTests */,
419
+			);
420
+		};
421
+/* End PBXProject section */
422
+
423
+/* Begin PBXReferenceProxy section */
424
+		00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
425
+			isa = PBXReferenceProxy;
426
+			fileType = archive.ar;
427
+			path = libRCTActionSheet.a;
428
+			remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
429
+			sourceTree = BUILT_PRODUCTS_DIR;
430
+		};
431
+		00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
432
+			isa = PBXReferenceProxy;
433
+			fileType = archive.ar;
434
+			path = libRCTGeolocation.a;
435
+			remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
436
+			sourceTree = BUILT_PRODUCTS_DIR;
437
+		};
438
+		00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
439
+			isa = PBXReferenceProxy;
440
+			fileType = archive.ar;
441
+			path = libRCTImage.a;
442
+			remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
443
+			sourceTree = BUILT_PRODUCTS_DIR;
444
+		};
445
+		00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
446
+			isa = PBXReferenceProxy;
447
+			fileType = archive.ar;
448
+			path = libRCTNetwork.a;
449
+			remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
450
+			sourceTree = BUILT_PRODUCTS_DIR;
451
+		};
452
+		00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
453
+			isa = PBXReferenceProxy;
454
+			fileType = archive.ar;
455
+			path = libRCTVibration.a;
456
+			remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
457
+			sourceTree = BUILT_PRODUCTS_DIR;
458
+		};
459
+		139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
460
+			isa = PBXReferenceProxy;
461
+			fileType = archive.ar;
462
+			path = libRCTSettings.a;
463
+			remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
464
+			sourceTree = BUILT_PRODUCTS_DIR;
465
+		};
466
+		139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
467
+			isa = PBXReferenceProxy;
468
+			fileType = archive.ar;
469
+			path = libRCTWebSocket.a;
470
+			remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
471
+			sourceTree = BUILT_PRODUCTS_DIR;
472
+		};
473
+		146834041AC3E56700842450 /* libReact.a */ = {
474
+			isa = PBXReferenceProxy;
475
+			fileType = archive.ar;
476
+			path = libReact.a;
477
+			remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
478
+			sourceTree = BUILT_PRODUCTS_DIR;
479
+		};
480
+		78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
481
+			isa = PBXReferenceProxy;
482
+			fileType = archive.ar;
483
+			path = libRCTLinking.a;
484
+			remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
485
+			sourceTree = BUILT_PRODUCTS_DIR;
486
+		};
487
+		832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
488
+			isa = PBXReferenceProxy;
489
+			fileType = archive.ar;
490
+			path = libRCTText.a;
491
+			remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
492
+			sourceTree = BUILT_PRODUCTS_DIR;
493
+		};
494
+/* End PBXReferenceProxy section */
495
+
496
+/* Begin PBXResourcesBuildPhase section */
497
+		00E356EC1AD99517003FC87E /* Resources */ = {
498
+			isa = PBXResourcesBuildPhase;
499
+			buildActionMask = 2147483647;
500
+			files = (
501
+			);
502
+			runOnlyForDeploymentPostprocessing = 0;
503
+		};
504
+		13B07F8E1A680F5B00A75B9A /* Resources */ = {
505
+			isa = PBXResourcesBuildPhase;
506
+			buildActionMask = 2147483647;
507
+			files = (
508
+				13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
509
+				13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
510
+			);
511
+			runOnlyForDeploymentPostprocessing = 0;
512
+		};
513
+/* End PBXResourcesBuildPhase section */
514
+
515
+/* Begin PBXShellScriptBuildPhase section */
516
+		00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
517
+			isa = PBXShellScriptBuildPhase;
518
+			buildActionMask = 2147483647;
519
+			files = (
520
+			);
521
+			inputPaths = (
522
+			);
523
+			name = "Bundle React Native code and images";
524
+			outputPaths = (
525
+			);
526
+			runOnlyForDeploymentPostprocessing = 0;
527
+			shellPath = /bin/sh;
528
+			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
529
+			showEnvVarsInLog = 1;
530
+		};
531
+/* End PBXShellScriptBuildPhase section */
532
+
533
+/* Begin PBXSourcesBuildPhase section */
534
+		00E356EA1AD99517003FC87E /* Sources */ = {
535
+			isa = PBXSourcesBuildPhase;
536
+			buildActionMask = 2147483647;
537
+			files = (
538
+				00E356F31AD99517003FC87E /* exampleTests.m in Sources */,
539
+			);
540
+			runOnlyForDeploymentPostprocessing = 0;
541
+		};
542
+		13B07F871A680F5B00A75B9A /* Sources */ = {
543
+			isa = PBXSourcesBuildPhase;
544
+			buildActionMask = 2147483647;
545
+			files = (
546
+				13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
547
+				13B07FC11A68108700A75B9A /* main.m in Sources */,
548
+			);
549
+			runOnlyForDeploymentPostprocessing = 0;
550
+		};
551
+/* End PBXSourcesBuildPhase section */
552
+
553
+/* Begin PBXTargetDependency section */
554
+		00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
555
+			isa = PBXTargetDependency;
556
+			target = 13B07F861A680F5B00A75B9A /* example */;
557
+			targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
558
+		};
559
+/* End PBXTargetDependency section */
560
+
561
+/* Begin PBXVariantGroup section */
562
+		13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
563
+			isa = PBXVariantGroup;
564
+			children = (
565
+				13B07FB21A68108700A75B9A /* Base */,
566
+			);
567
+			name = LaunchScreen.xib;
568
+			path = example;
569
+			sourceTree = "<group>";
570
+		};
571
+/* End PBXVariantGroup section */
572
+
573
+/* Begin XCBuildConfiguration section */
574
+		00E356F61AD99517003FC87E /* Debug */ = {
575
+			isa = XCBuildConfiguration;
576
+			buildSettings = {
577
+				BUNDLE_LOADER = "$(TEST_HOST)";
578
+				FRAMEWORK_SEARCH_PATHS = (
579
+					"$(SDKROOT)/Developer/Library/Frameworks",
580
+					"$(inherited)",
581
+				);
582
+				GCC_PREPROCESSOR_DEFINITIONS = (
583
+					"DEBUG=1",
584
+					"$(inherited)",
585
+				);
586
+				INFOPLIST_FILE = exampleTests/Info.plist;
587
+				IPHONEOS_DEPLOYMENT_TARGET = 8.2;
588
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
589
+				PRODUCT_NAME = "$(TARGET_NAME)";
590
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example";
591
+			};
592
+			name = Debug;
593
+		};
594
+		00E356F71AD99517003FC87E /* Release */ = {
595
+			isa = XCBuildConfiguration;
596
+			buildSettings = {
597
+				BUNDLE_LOADER = "$(TEST_HOST)";
598
+				COPY_PHASE_STRIP = NO;
599
+				FRAMEWORK_SEARCH_PATHS = (
600
+					"$(SDKROOT)/Developer/Library/Frameworks",
601
+					"$(inherited)",
602
+				);
603
+				INFOPLIST_FILE = exampleTests/Info.plist;
604
+				IPHONEOS_DEPLOYMENT_TARGET = 8.2;
605
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
606
+				PRODUCT_NAME = "$(TARGET_NAME)";
607
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example";
608
+			};
609
+			name = Release;
610
+		};
611
+		13B07F941A680F5B00A75B9A /* Debug */ = {
612
+			isa = XCBuildConfiguration;
613
+			buildSettings = {
614
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
615
+				DEAD_CODE_STRIPPING = NO;
616
+				HEADER_SEARCH_PATHS = (
617
+					"$(inherited)",
618
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
619
+					"$(SRCROOT)/../node_modules/react-native/React/**",
620
+				);
621
+				INFOPLIST_FILE = "example/Info.plist";
622
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
623
+				OTHER_LDFLAGS = "-ObjC";
624
+				PRODUCT_NAME = example;
625
+			};
626
+			name = Debug;
627
+		};
628
+		13B07F951A680F5B00A75B9A /* Release */ = {
629
+			isa = XCBuildConfiguration;
630
+			buildSettings = {
631
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
632
+				HEADER_SEARCH_PATHS = (
633
+					"$(inherited)",
634
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
635
+					"$(SRCROOT)/../node_modules/react-native/React/**",
636
+				);
637
+				INFOPLIST_FILE = "example/Info.plist";
638
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
639
+				OTHER_LDFLAGS = "-ObjC";
640
+				PRODUCT_NAME = example;
641
+			};
642
+			name = Release;
643
+		};
644
+		83CBBA201A601CBA00E9B192 /* Debug */ = {
645
+			isa = XCBuildConfiguration;
646
+			buildSettings = {
647
+				ALWAYS_SEARCH_USER_PATHS = NO;
648
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
649
+				CLANG_CXX_LIBRARY = "libc++";
650
+				CLANG_ENABLE_MODULES = YES;
651
+				CLANG_ENABLE_OBJC_ARC = YES;
652
+				CLANG_WARN_BOOL_CONVERSION = YES;
653
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
654
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
655
+				CLANG_WARN_EMPTY_BODY = YES;
656
+				CLANG_WARN_ENUM_CONVERSION = YES;
657
+				CLANG_WARN_INT_CONVERSION = YES;
658
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
659
+				CLANG_WARN_UNREACHABLE_CODE = YES;
660
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
661
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
662
+				COPY_PHASE_STRIP = NO;
663
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
664
+				GCC_C_LANGUAGE_STANDARD = gnu99;
665
+				GCC_DYNAMIC_NO_PIC = NO;
666
+				GCC_OPTIMIZATION_LEVEL = 0;
667
+				GCC_PREPROCESSOR_DEFINITIONS = (
668
+					"DEBUG=1",
669
+					"$(inherited)",
670
+				);
671
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
672
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
673
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
674
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
675
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
676
+				GCC_WARN_UNUSED_FUNCTION = YES;
677
+				GCC_WARN_UNUSED_VARIABLE = YES;
678
+				HEADER_SEARCH_PATHS = (
679
+					"$(inherited)",
680
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
681
+					"$(SRCROOT)/../node_modules/react-native/React/**",
682
+				);
683
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
684
+				MTL_ENABLE_DEBUG_INFO = YES;
685
+				ONLY_ACTIVE_ARCH = YES;
686
+				SDKROOT = iphoneos;
687
+			};
688
+			name = Debug;
689
+		};
690
+		83CBBA211A601CBA00E9B192 /* Release */ = {
691
+			isa = XCBuildConfiguration;
692
+			buildSettings = {
693
+				ALWAYS_SEARCH_USER_PATHS = NO;
694
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
695
+				CLANG_CXX_LIBRARY = "libc++";
696
+				CLANG_ENABLE_MODULES = YES;
697
+				CLANG_ENABLE_OBJC_ARC = YES;
698
+				CLANG_WARN_BOOL_CONVERSION = YES;
699
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
700
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
701
+				CLANG_WARN_EMPTY_BODY = YES;
702
+				CLANG_WARN_ENUM_CONVERSION = YES;
703
+				CLANG_WARN_INT_CONVERSION = YES;
704
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
705
+				CLANG_WARN_UNREACHABLE_CODE = YES;
706
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
707
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
708
+				COPY_PHASE_STRIP = YES;
709
+				ENABLE_NS_ASSERTIONS = NO;
710
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
711
+				GCC_C_LANGUAGE_STANDARD = gnu99;
712
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
713
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
714
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
715
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
716
+				GCC_WARN_UNUSED_FUNCTION = YES;
717
+				GCC_WARN_UNUSED_VARIABLE = YES;
718
+				HEADER_SEARCH_PATHS = (
719
+					"$(inherited)",
720
+					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
721
+					"$(SRCROOT)/../node_modules/react-native/React/**",
722
+				);
723
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
724
+				MTL_ENABLE_DEBUG_INFO = NO;
725
+				SDKROOT = iphoneos;
726
+				VALIDATE_PRODUCT = YES;
727
+			};
728
+			name = Release;
729
+		};
730
+/* End XCBuildConfiguration section */
731
+
732
+/* Begin XCConfigurationList section */
733
+		00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */ = {
734
+			isa = XCConfigurationList;
735
+			buildConfigurations = (
736
+				00E356F61AD99517003FC87E /* Debug */,
737
+				00E356F71AD99517003FC87E /* Release */,
738
+			);
739
+			defaultConfigurationIsVisible = 0;
740
+			defaultConfigurationName = Release;
741
+		};
742
+		13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = {
743
+			isa = XCConfigurationList;
744
+			buildConfigurations = (
745
+				13B07F941A680F5B00A75B9A /* Debug */,
746
+				13B07F951A680F5B00A75B9A /* Release */,
747
+			);
748
+			defaultConfigurationIsVisible = 0;
749
+			defaultConfigurationName = Release;
750
+		};
751
+		83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = {
752
+			isa = XCConfigurationList;
753
+			buildConfigurations = (
754
+				83CBBA201A601CBA00E9B192 /* Debug */,
755
+				83CBBA211A601CBA00E9B192 /* Release */,
756
+			);
757
+			defaultConfigurationIsVisible = 0;
758
+			defaultConfigurationName = Release;
759
+		};
760
+/* End XCConfigurationList section */
761
+	};
762
+	rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
763
+}

+ 112
- 0
example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme View File

@@ -0,0 +1,112 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0620"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
18
+               BuildableName = "example.app"
19
+               BlueprintName = "example"
20
+               ReferencedContainer = "container:example.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "NO"
27
+            buildForArchiving = "NO"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
32
+               BuildableName = "exampleTests.xctest"
33
+               BlueprintName = "exampleTests"
34
+               ReferencedContainer = "container:example.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+      </BuildActionEntries>
38
+   </BuildAction>
39
+   <TestAction
40
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
41
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
42
+      shouldUseLaunchSchemeArgsEnv = "YES"
43
+      buildConfiguration = "Debug">
44
+      <Testables>
45
+         <TestableReference
46
+            skipped = "NO">
47
+            <BuildableReference
48
+               BuildableIdentifier = "primary"
49
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
50
+               BuildableName = "exampleTests.xctest"
51
+               BlueprintName = "exampleTests"
52
+               ReferencedContainer = "container:example.xcodeproj">
53
+            </BuildableReference>
54
+         </TestableReference>
55
+      </Testables>
56
+      <MacroExpansion>
57
+         <BuildableReference
58
+            BuildableIdentifier = "primary"
59
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
60
+            BuildableName = "example.app"
61
+            BlueprintName = "example"
62
+            ReferencedContainer = "container:example.xcodeproj">
63
+         </BuildableReference>
64
+      </MacroExpansion>
65
+   </TestAction>
66
+   <LaunchAction
67
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
68
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
69
+      launchStyle = "0"
70
+      useCustomWorkingDirectory = "NO"
71
+      buildConfiguration = "Debug"
72
+      ignoresPersistentStateOnLaunch = "NO"
73
+      debugDocumentVersioning = "YES"
74
+      allowLocationSimulation = "YES">
75
+      <BuildableProductRunnable
76
+         runnableDebuggingMode = "0">
77
+         <BuildableReference
78
+            BuildableIdentifier = "primary"
79
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
80
+            BuildableName = "example.app"
81
+            BlueprintName = "example"
82
+            ReferencedContainer = "container:example.xcodeproj">
83
+         </BuildableReference>
84
+      </BuildableProductRunnable>
85
+      <AdditionalOptions>
86
+      </AdditionalOptions>
87
+   </LaunchAction>
88
+   <ProfileAction
89
+      shouldUseLaunchSchemeArgsEnv = "YES"
90
+      savedToolIdentifier = ""
91
+      useCustomWorkingDirectory = "NO"
92
+      buildConfiguration = "Release"
93
+      debugDocumentVersioning = "YES">
94
+      <BuildableProductRunnable
95
+         runnableDebuggingMode = "0">
96
+         <BuildableReference
97
+            BuildableIdentifier = "primary"
98
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
99
+            BuildableName = "example.app"
100
+            BlueprintName = "example"
101
+            ReferencedContainer = "container:example.xcodeproj">
102
+         </BuildableReference>
103
+      </BuildableProductRunnable>
104
+   </ProfileAction>
105
+   <AnalyzeAction
106
+      buildConfiguration = "Debug">
107
+   </AnalyzeAction>
108
+   <ArchiveAction
109
+      buildConfiguration = "Release"
110
+      revealArchiveInOrganizer = "YES">
111
+   </ArchiveAction>
112
+</Scheme>

+ 16
- 0
example/ios/example/AppDelegate.h View File

@@ -0,0 +1,16 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+
12
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
13
+
14
+@property (nonatomic, strong) UIWindow *window;
15
+
16
+@end

+ 57
- 0
example/ios/example/AppDelegate.m View File

@@ -0,0 +1,57 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import "AppDelegate.h"
11
+
12
+#import "RCTRootView.h"
13
+
14
+@implementation AppDelegate
15
+
16
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
17
+{
18
+  NSURL *jsCodeLocation;
19
+
20
+  /**
21
+   * Loading JavaScript code - uncomment the one you want.
22
+   *
23
+   * OPTION 1
24
+   * Load from development server. Start the server from the repository root:
25
+   *
26
+   * $ npm start
27
+   *
28
+   * To run on device, change `localhost` to the IP address of your computer
29
+   * (you can get this by typing `ifconfig` into the terminal and selecting the
30
+   * `inet` value under `en0:`) and make sure your computer and iOS device are
31
+   * on the same Wi-Fi network.
32
+   */
33
+
34
+  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
35
+
36
+  /**
37
+   * OPTION 2
38
+   * Load from pre-bundled file on disk. The static bundle is automatically
39
+   * generated by "Bundle React Native code and images" build step.
40
+   */
41
+
42
+//   jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
43
+
44
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
45
+                                                      moduleName:@"example"
46
+                                               initialProperties:nil
47
+                                                   launchOptions:launchOptions];
48
+
49
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
50
+  UIViewController *rootViewController = [UIViewController new];
51
+  rootViewController.view = rootView;
52
+  self.window.rootViewController = rootViewController;
53
+  [self.window makeKeyAndVisible];
54
+  return YES;
55
+}
56
+
57
+@end

+ 42
- 0
example/ios/example/Base.lproj/LaunchScreen.xib View File

@@ -0,0 +1,42 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
6
+        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
7
+    </dependencies>
8
+    <objects>
9
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
10
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
11
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
12
+            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
13
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
14
+            <subviews>
15
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
16
+                    <rect key="frame" x="20" y="439" width="441" height="21"/>
17
+                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
18
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
19
+                    <nil key="highlightedColor"/>
20
+                </label>
21
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="example" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
22
+                    <rect key="frame" x="20" y="140" width="441" height="43"/>
23
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
24
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
25
+                    <nil key="highlightedColor"/>
26
+                </label>
27
+            </subviews>
28
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
29
+            <constraints>
30
+                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
31
+                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
32
+                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
33
+                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
34
+                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
35
+                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
36
+            </constraints>
37
+            <nil key="simulatedStatusBarMetrics"/>
38
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
39
+            <point key="canvasLocation" x="548" y="455"/>
40
+        </view>
41
+    </objects>
42
+</document>

+ 38
- 0
example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,38 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "29x29",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "29x29",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "40x40",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "40x40",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "60x60",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "60x60",
31
+      "scale" : "3x"
32
+    }
33
+  ],
34
+  "info" : {
35
+    "version" : 1,
36
+    "author" : "xcode"
37
+  }
38
+}

+ 48
- 0
example/ios/example/Info.plist View File

@@ -0,0 +1,48 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>APPL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>UILaunchStoryboardName</key>
26
+	<string>LaunchScreen</string>
27
+	<key>UIRequiredDeviceCapabilities</key>
28
+	<array>
29
+		<string>armv7</string>
30
+	</array>
31
+	<key>UISupportedInterfaceOrientations</key>
32
+	<array>
33
+		<string>UIInterfaceOrientationPortrait</string>
34
+		<string>UIInterfaceOrientationLandscapeLeft</string>
35
+		<string>UIInterfaceOrientationLandscapeRight</string>
36
+	</array>
37
+	<key>UIViewControllerBasedStatusBarAppearance</key>
38
+	<false/>
39
+	<key>NSLocationWhenInUseUsageDescription</key>
40
+	<string></string>
41
+  <key>NSAppTransportSecurity</key>
42
+  <dict>
43
+    <!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
44
+    <key>NSAllowsArbitraryLoads</key>
45
+    <true/>
46
+  </dict>
47
+</dict>
48
+</plist>

+ 18
- 0
example/ios/example/main.m View File

@@ -0,0 +1,18 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+
12
+#import "AppDelegate.h"
13
+
14
+int main(int argc, char * argv[]) {
15
+  @autoreleasepool {
16
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
17
+  }
18
+}

+ 24
- 0
example/ios/exampleTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 70
- 0
example/ios/exampleTests/exampleTests.m View File

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+#import <UIKit/UIKit.h>
11
+#import <XCTest/XCTest.h>
12
+
13
+#import "RCTLog.h"
14
+#import "RCTRootView.h"
15
+
16
+#define TIMEOUT_SECONDS 240
17
+#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
18
+
19
+@interface exampleTests : XCTestCase
20
+
21
+@end
22
+
23
+@implementation exampleTests
24
+
25
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
26
+{
27
+  if (test(view)) {
28
+    return YES;
29
+  }
30
+  for (UIView *subview in [view subviews]) {
31
+    if ([self findSubviewInView:subview matching:test]) {
32
+      return YES;
33
+    }
34
+  }
35
+  return NO;
36
+}
37
+
38
+- (void)testRendersWelcomeScreen
39
+{
40
+  UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
41
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
42
+  BOOL foundElement = NO;
43
+
44
+  __block NSString *redboxError = nil;
45
+  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
46
+    if (level >= RCTLogLevelError) {
47
+      redboxError = message;
48
+    }
49
+  });
50
+
51
+  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
52
+    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
53
+    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
54
+
55
+    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
56
+      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
57
+        return YES;
58
+      }
59
+      return NO;
60
+    }];
61
+  }
62
+
63
+  RCTSetLogFunction(RCTDefaultLogFunction);
64
+
65
+  XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
66
+  XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
67
+}
68
+
69
+
70
+@end

+ 11
- 0
example/package.json View File

@@ -0,0 +1,11 @@
1
+{
2
+  "name": "example",
3
+  "version": "0.0.1",
4
+  "private": true,
5
+  "scripts": {
6
+    "start": "node node_modules/react-native/local-cli/cli.js start"
7
+  },
8
+  "dependencies": {
9
+    "react-native": "^0.21.0"
10
+  }
11
+}

+ 7
- 0
index.js View File

@@ -0,0 +1,7 @@
1
+import Navigation from './src/Navigation';
2
+import Screen from './src/Screen';
3
+
4
+export {
5
+  Navigation,
6
+  Screen
7
+};

+ 26
- 0
package.json View File

@@ -0,0 +1,26 @@
1
+{
2
+  "name": "react-native-navigation",
3
+  "publishConfig": {
4
+    "registry": "https://registry.npmjs.org/"
5
+  },
6
+  "repository": {
7
+    "type": "git",
8
+    "url": "https://github.com/wix/react-native-navigation.git"
9
+  },
10
+  "version": "0.0.1",
11
+  "description": "React Native Navigation - truly native navigation for iOS and Android",
12
+  "nativePackage": true,
13
+  "bugs": {
14
+    "url": "https://github.com/wix/react-native-navigation/issues"
15
+  },
16
+  "homepage": "https://github.com/wix/react-native-navigation",
17
+  "main": "index.js",
18
+  "author": "Tal Kol <talkol@gmail.com>",
19
+  "license": "MIT",
20
+  "peerDependencies": {
21
+    "react-native": ">=0.16.0"
22
+  },
23
+  "dependencies": {
24
+    "react-native-controllers": "^1.1.0"
25
+  }
26
+}

+ 25
- 0
src/Navigation.js View File

@@ -0,0 +1,25 @@
1
+import { AppRegistry } from 'react-native';
2
+import platformSpecific from './platformSpecific';
3
+
4
+const registeredScreens = {};
5
+
6
+function registerScreen(screenID, generator) {
7
+  registeredScreens[screenID] = generator;
8
+  AppRegistry.registerComponent(screenID, generator);
9
+}
10
+
11
+function getRegisteredScreen(screenID) {
12
+  const generator = registeredScreens[screenID];
13
+  if (!generator) {
14
+    console.error('Navigation.getRegisteredScreen: ' + screenID + ' used but not yet registered');
15
+    return;
16
+  }
17
+  return generator();
18
+}
19
+
20
+export default Navigation = {
21
+  registerScreen,
22
+  getRegisteredScreen,
23
+  startTabBasedApp: platformSpecific.startTabBasedApp,
24
+  startSingleScreenApp: platformSpecific.startSingleScreenApp
25
+}

+ 24
- 0
src/Screen.js View File

@@ -0,0 +1,24 @@
1
+import { Component } from 'react-native';
2
+import platformSpecific from './platformSpecific';
3
+
4
+class Navigator {
5
+  constructor(navigatorID) {
6
+    this.navigatorID = navigatorID;
7
+  }
8
+  push(params = {}) {
9
+    return platformSpecific.navigatorPush(this, params);
10
+  }
11
+  pop(params = {}) {
12
+    return platformSpecific.navigatorPop(this, params);
13
+  }
14
+}
15
+
16
+export default class Screen extends Component {
17
+  static navigatorStyle = {};
18
+  constructor(props) {
19
+    super(props);
20
+    if (props.navigatorID) {
21
+      this.navigator = new Navigator(props.navigatorID);
22
+    }
23
+  }
24
+}

+ 126
- 0
src/platformSpecific.ios.js View File

@@ -0,0 +1,126 @@
1
+import utils from './utils';
2
+import Navigation from './Navigation';
3
+import Controllers from 'react-native-controllers';
4
+const React = Controllers.hijackReact();
5
+const {
6
+  ControllerRegistry,
7
+  TabBarControllerIOS,
8
+  NavigationControllerIOS,
9
+  DrawerControllerIOS
10
+} = React;
11
+
12
+function startTabBasedApp(params) {
13
+  if (!params.tabs) {
14
+    console.error('startTabBasedApp(params): params.tabs is required');
15
+    return;
16
+  }
17
+  const appID = utils.getRandomId();
18
+  const App = Controllers.createClass({
19
+    render: function() {
20
+      return (
21
+        <TabBarControllerIOS id={appID + '_tabs'}>
22
+        {
23
+          params.tabs.map(function(tab, index) {
24
+            const navigatorID = appID + '_nav' + index;
25
+            const screenClass = Navigation.getRegisteredScreen(tab.screen);
26
+            if (!screenClass) {
27
+              console.error('Cannot create screen ' + tab.screen + '. Are you it was registered with Navigation.registerScreen?');
28
+              return;
29
+            }
30
+            const navigatorStyle = Object.assign({}, screenClass.navigatorStyle);
31
+            if (tab.navigatorStyle) {
32
+              Object.assign(navigatorStyle, tab.navigatorStyle);
33
+            }
34
+            return (
35
+              <TabBarControllerIOS.Item {...tab}>
36
+                <NavigationControllerIOS
37
+                  id={navigatorID}
38
+                  title={tab.screenTitle}
39
+                  component={tab.screen}
40
+                  passProps={{navigatorID: navigatorID}}
41
+                  style={navigatorStyle}
42
+                />
43
+              </TabBarControllerIOS.Item>
44
+            );
45
+          })
46
+        }
47
+        </TabBarControllerIOS>
48
+      );
49
+    }
50
+  });
51
+  ControllerRegistry.registerController(appID, () => App);
52
+  ControllerRegistry.setRootController(appID);
53
+}
54
+
55
+function startSingleScreenApp(params) {
56
+  if (!params.screen) {
57
+    console.error('startSingleScreenApp(params): params.screen is required');
58
+    return;
59
+  }
60
+  const appID = utils.getRandomId();
61
+  const App = Controllers.createClass({
62
+    render: function() {
63
+      const screen = params.screen;
64
+      const navigatorID = appID + '_nav';
65
+      const screenClass = Navigation.getRegisteredScreen(screen.screen);
66
+      if (!screenClass) {
67
+        console.error('Cannot create screen ' + screen.screen + '. Are you it was registered with Navigation.registerScreen?');
68
+        return;
69
+      }
70
+      const navigatorStyle = Object.assign({}, screenClass.navigatorStyle);
71
+      if (screen.navigatorStyle) {
72
+        Object.assign(navigatorStyle, screen.navigatorStyle);
73
+      }
74
+      return (
75
+        <NavigationControllerIOS
76
+          id={navigatorID}
77
+          title={screen.screenTitle}
78
+          component={screen.screen}
79
+          passProps={{navigatorID: navigatorID}}
80
+          style={navigatorStyle}
81
+        />
82
+      );
83
+    }
84
+  });
85
+  ControllerRegistry.registerController(appID, () => App);
86
+  ControllerRegistry.setRootController(appID);
87
+}
88
+
89
+function navigatorPush(navigator, params) {
90
+  if (!params.screen) {
91
+    console.error('Navigator.push(params): params.screen is required');
92
+    return;
93
+  }
94
+  const passProps = params.passProps || {};
95
+  const screenClass = Navigation.getRegisteredScreen(params.screen);
96
+  if (!screenClass) {
97
+    console.error('Cannot create screen ' + params.screen + '. Are you it was registered with Navigation.registerScreen?');
98
+    return;
99
+  }
100
+  const navigatorStyle = Object.assign({}, screenClass.navigatorStyle);
101
+  if (params.navigatorStyle) {
102
+    Object.assign(navigatorStyle, params.navigatorStyle);
103
+  }
104
+  passProps.navigatorID = navigator.navigatorID;
105
+  Controllers.NavigationControllerIOS(navigator.navigatorID).push({
106
+    title: params.title,
107
+    component: params.screen,
108
+    animated: params.animated,
109
+    passProps: passProps,
110
+    style: navigatorStyle,
111
+    backButtonTitle: params.backButtonTitle
112
+  });
113
+}
114
+
115
+function navigatorPop(navigator, params) {
116
+  Controllers.NavigationControllerIOS(navigator.navigatorID).pop({
117
+    animated: params.animated
118
+  });
119
+}
120
+
121
+export default platformSpecific = {
122
+  startTabBasedApp,
123
+  startSingleScreenApp,
124
+  navigatorPush,
125
+  navigatorPop
126
+}

+ 7
- 0
src/utils.js View File

@@ -0,0 +1,7 @@
1
+function getRandomId() {
2
+  return (Math.random()*1e20).toString(36);
3
+}
4
+
5
+export default utils = {
6
+  getRandomId
7
+}