diff --git a/.circleci/config.yml b/.circleci/config.yml index 9c6aa7f05..c639b80c2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -149,7 +149,7 @@ jobs: - store_artifacts: path: android/test-results - android-beta: + android-adhoc: environment: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 @@ -180,9 +180,51 @@ jobs: - run: yarn install - - run: git config --global user.name $CIRCLE_USERNAME - - run: git config --global user.email "ops@textile.io" # TODO: Use a variable here - - run: git branch --set-upstream-to=origin/$CIRCLE_BRANCH $CIRCLE_BRANCH + - restore_cache: + key: bundle-v1-{{ checksum "android/Gemfile.lock" }}-{{ arch }} + + - run: + command: bundle install + working_directory: android + + - save_cache: + key: bundle-v1-{{ checksum "android/Gemfile.lock" }}-{{ arch }} + paths: + - vendor/bundle + + - run: + command: echo $ANDROID_KEYSTORE_BASE64 | base64 --decode >> $ANDROID_KEYSTORE + working_directory: android + + - run: + command: echo $TEXTILE_ENV_CONTENTS_BASE64 | base64 --decode > .env.production + + - run: + command: bundle exec fastlane adhoc + working_directory: android + + - store_artifacts: + path: ./android/sourcemap.js + + android-release: + environment: + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + working_directory: ~/textile-mobile + docker: + - image: circleci/android:api-26-node8-alpha + resource_class: large + steps: + - checkout: + path: ~/textile-mobile + + - restore_cache: + key: yarn-v1-{{ checksum "yarn.lock" }}-{{ arch }} + + - restore_cache: + key: node-v1-{{ checksum "package.json" }}-{{ arch }} + + - run: yarn install - restore_cache: key: bundle-v1-{{ checksum "android/Gemfile.lock" }}-{{ arch }} @@ -204,7 +246,7 @@ jobs: command: echo $TEXTILE_ENV_CONTENTS_BASE64 | base64 --decode > .env.production - run: - command: bundle exec fastlane beta + command: bundle exec fastlane release working_directory: android - store_artifacts: @@ -290,7 +332,7 @@ jobs: - store_artifacts: path: ios/test-results - ios-beta: + ios-adhoc: macos: xcode: "9.4.0" environment: @@ -359,7 +401,73 @@ jobs: command: echo $TEXTILE_ENV_CONTENTS_BASE64 | base64 --decode > .env.production - run: - command: bundle exec fastlane beta + command: bundle exec fastlane adhoc + working_directory: ios + + - store_artifacts: + path: ./ios/TextilePhotos.app.dSYM.zip + + - store_artifacts: + path: ./ios/TextilePhotos.ipa + + - store_artifacts: + path: ./ios/sourcemap.js + + ios-release: + macos: + xcode: "9.4.0" + environment: + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + working_directory: ~/textile-mobile + + # use a --login shell so our "set Ruby version" command gets picked up for later steps + shell: /bin/bash --login -o pipefail + + steps: + - run: + name: set Ruby version + command: echo "ruby-2.4" > ~/.ruby-version + + - checkout + + - restore_cache: + key: yarn-v1-{{ checksum "yarn.lock" }}-{{ arch }} + + - restore_cache: + key: node-v1-{{ checksum "package.json" }}-{{ arch }} + + # not using a workspace here as Node and Yarn versions + # differ between our macOS executor image and the Docker containers above + - run: yarn install --ignore-engines + + - save_cache: + key: yarn-v1-{{ checksum "yarn.lock" }}-{{ arch }} + paths: + - ~/.cache/yarn + + - save_cache: + key: node-v1-{{ checksum "package.json" }}-{{ arch }} + paths: + - node_modules + + - restore_cache: + key: bundle-v1-{{ checksum "ios/Gemfile.lock" }}-{{ arch }} + + - run: + command: bundle install + working_directory: ios + + - save_cache: + key: bundle-v1-{{ checksum "ios/Gemfile.lock" }}-{{ arch }} + paths: + - vendor/bundle + + - run: + command: echo $TEXTILE_ENV_CONTENTS_BASE64 | base64 --decode > .env.production + + - run: + command: bundle exec fastlane release working_directory: ios - store_artifacts: @@ -401,13 +509,25 @@ workflows: branches: ignore: - master - - ios-beta: + - ios-adhoc: filters: branches: only: - master - - android-beta: + - android-adhoc: filters: branches: only: - master + - ios-release: + filters: + tags: + only: /^ios_[0-9.]+_[0-9]+/ + branches: + ignore: /.*/ + - android-release: + filters: + tags: + only: /^android_[0-9.]+_[0-9]+/ + branches: + ignore: /.*/ diff --git a/App/SB/views/UserProfile/index.js b/App/SB/views/UserProfile/index.js index e08077485..ef8b80021 100644 --- a/App/SB/views/UserProfile/index.js +++ b/App/SB/views/UserProfile/index.js @@ -5,6 +5,7 @@ import { NavigationActions } from 'react-navigation' import ImageSc from 'react-native-scalable-image' import Toast, { DURATION } from 'react-native-easy-toast' import HeaderButtons, { Item } from 'react-navigation-header-buttons' +import VersionNumber from 'react-native-version-number' import { TextileHeaderButtons, Item as TextileItem } from '../../../Components/HeaderButtons' @@ -104,9 +105,9 @@ class UserProfile extends React.PureComponent { + {VersionNumber.appVersion} ({VersionNumber.buildVersion}) {this.connectivity()} - Notifications diff --git a/App/SB/views/UserProfile/statics/styles.js b/App/SB/views/UserProfile/statics/styles.js index 87aebbf24..5d2e6f2a9 100644 --- a/App/SB/views/UserProfile/statics/styles.js +++ b/App/SB/views/UserProfile/statics/styles.js @@ -76,6 +76,7 @@ export default StyleSheet.create({ paddingVertical: 25 }, serversText: { + fontFamily: 'BentonSans', color: '#4A4A4A' }, activeIcon: { @@ -103,6 +104,12 @@ export default StyleSheet.create({ alignItems: 'center', marginTop: 30 }, + versionDescription: { + fontFamily: 'BentonSans', + fontSize: 12, + marginTop: 8, + color: 'rgb(200,200,200)' + }, subScreen: { backgroundColor: '#FAFCFE', paddingTop: 75, diff --git a/android/Gemfile.lock b/android/Gemfile.lock index c8c56aecd..984ba4df0 100644 --- a/android/Gemfile.lock +++ b/android/Gemfile.lock @@ -1,3 +1,10 @@ +GIT + remote: git://github.com/cball/fastlane-plugin-android_versioning.git + revision: 4fe9f3dd3109d58dc5870c417d7b17b016585a8d + ref: support-blank-id-suffix + specs: + fastlane-plugin-android_versioning (0.3.1) + GEM remote: https://rubygems.org/ specs: @@ -62,9 +69,6 @@ GEM xcodeproj (>= 1.6.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-get_version_code (0.2.0) - fastlane-plugin-get_version_name (0.2.2) - fastlane-plugin-increment_version_code (0.4.3) gh_inspector (1.1.3) google-api-client (0.23.9) addressable (~> 2.5, >= 2.5.1) @@ -147,9 +151,7 @@ PLATFORMS DEPENDENCIES dotenv fastlane - fastlane-plugin-get_version_code - fastlane-plugin-get_version_name - fastlane-plugin-increment_version_code + fastlane-plugin-android_versioning! BUNDLED WITH 1.16.2 diff --git a/android/app/build.gradle b/android/app/build.gradle index d86adba00..6fe796ce4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -127,8 +127,8 @@ android { } vectorDrawables.useSupportLibrary = true - versionName "1.6.10" - versionCode 214 + versionName "0" + versionCode 0 } splits { @@ -172,6 +172,7 @@ android { } dependencies { + compile project(':react-native-version-number') compile project(':react-native-push-notification') compile project(':react-native-fabric') compile project(':react-native-image-picker') diff --git a/android/app/src/main/java/com/textile/MainApplication.java b/android/app/src/main/java/com/textile/MainApplication.java index c0d92c69d..b9b970ba1 100644 --- a/android/app/src/main/java/com/textile/MainApplication.java +++ b/android/app/src/main/java/com/textile/MainApplication.java @@ -19,6 +19,7 @@ import com.textile.textilenode.TextileNodePackage; import com.transistorsoft.rnbackgroundfetch.RNBackgroundFetchPackage; import com.vydia.RNUploader.UploaderReactPackage; +import com.apsl.versionnumber.RNVersionNumberPackage; import java.util.Arrays; import java.util.List; @@ -36,6 +37,7 @@ protected List getPackages() { return Arrays.asList( new FabricPackage(), new MainReactPackage(), + new RNVersionNumberPackage(), new ReactNativePushNotificationPackage(), new UploaderReactPackage(), new ImagePickerPackage(), diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile index 01b5b1e6c..33bc6a5d2 100644 --- a/android/fastlane/Fastfile +++ b/android/fastlane/Fastfile @@ -17,10 +17,6 @@ default_platform(:android) platform :android do - def set_version_code(gradle_build: 'app/build.gradle', version: 0) - sh %Q{cd ../ && echo "$(awk '{sub(/versionCode [0-9]+$/,"versionCode "#{version})}1' #{gradle_build})" > #{gradle_build}.tmp && mv #{gradle_build}.tmp #{gradle_build} && cd -} - end - desc "Runs all the tests" lane :test do gradle( @@ -29,10 +25,24 @@ platform :android do ) end + desc "Push internal test build to Fabric" + lane :adhoc do + increment_version_code(version_code: ENV['CIRCLE_BUILD_NUM']) + gradle( + task: "clean assembleRelease", + flags: "--init-script init.gradle" + ) + crashlytics( + api_token: ENV['FABRIC_API_TOKEN'], + build_secret: ENV['FABRIC_BUILD_SECRET'], + groups: 'textile-internal' + ) + end + desc "Submit a new Beta Build to Crashlytics Beta" lane :beta do versionCodes = google_play_track_version_codes(track: "internal") - set_version_code(version: versionCodes[0] + 1) + increment_version_code(version_code: versionCodes[0] + 1) gradle( task: "clean assembleRelease", flags: "--init-script init.gradle" @@ -53,6 +63,21 @@ platform :android do push_to_git_remote end + desc "Submit a new release to Google Play Store" + lane :release do + tag = ENV['CIRCLE_TAG'] # looks like android_1.2.3_456 + parts = tag.split("_") + increment_version_name(app_project_dir: "./app", version_name: parts[1]) + increment_version_code(app_project_dir: "./app", version_code: parts[2]) + gradle( + task: "clean assembleRelease", + flags: "--init-script init.gradle" + ) + supply( + track: "beta" + ) + end + desc "Deploy a new version to the Google Play" lane :deploy do gradle(task: "clean assembleRelease") diff --git a/android/fastlane/Pluginfile b/android/fastlane/Pluginfile index 25e37f291..dcae787ae 100644 --- a/android/fastlane/Pluginfile +++ b/android/fastlane/Pluginfile @@ -2,6 +2,4 @@ # # Ensure this file is checked in to source control! -gem 'fastlane-plugin-increment_version_code' -gem 'fastlane-plugin-get_version_code' -gem 'fastlane-plugin-get_version_name' +gem 'fastlane-plugin-android_versioning', github: "cball/fastlane-plugin-android_versioning", ref: "support-blank-id-suffix" diff --git a/android/fastlane/README.md b/android/fastlane/README.md index 739a20bcd..26c3275de 100644 --- a/android/fastlane/README.md +++ b/android/fastlane/README.md @@ -21,11 +21,21 @@ or alternatively using `brew cask install fastlane` fastlane android test ``` Runs all the tests +### android adhoc +``` +fastlane android adhoc +``` +Push internal test build to Fabric ### android beta ``` fastlane android beta ``` Submit a new Beta Build to Crashlytics Beta +### android release +``` +fastlane android release +``` +Submit a new release to Google Play Store ### android deploy ``` fastlane android deploy diff --git a/android/settings.gradle b/android/settings.gradle index 0064bc4df..e14ca7226 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'Textile' +include ':react-native-version-number' +project(':react-native-version-number').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-version-number/android') include ':react-native-push-notification' project(':react-native-push-notification').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-push-notification/android') include ':react-native-fabric' diff --git a/ios/TextilePhotos.xcodeproj/project.pbxproj b/ios/TextilePhotos.xcodeproj/project.pbxproj index ae1e7229a..180af26b0 100644 --- a/ios/TextilePhotos.xcodeproj/project.pbxproj +++ b/ios/TextilePhotos.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 932E4DC520B8D7E100358ED3 /* Biotif-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 932E4DB520B8D7E000358ED3 /* Biotif-SemiBoldItalic.ttf */; }; 932E4DC620B8D7E100358ED3 /* Biotif-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 932E4DB620B8D7E100358ED3 /* Biotif-Light.ttf */; }; 932E4DC720B8D7E100358ED3 /* Biotif-BookItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 932E4DB720B8D7E100358ED3 /* Biotif-BookItalic.ttf */; }; + 9331F517214D890B00E37A58 /* libRNVersionNumber.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9331F514214D88F300E37A58 /* libRNVersionNumber.a */; }; 9345CEA92102B24E0061EFD6 /* BentonSans.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9345CEA62102B24D0061EFD6 /* BentonSans.otf */; }; 9345CEAD2102B68A0061EFD6 /* BentonSans-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9345CEAB2102B68A0061EFD6 /* BentonSans-Light.otf */; }; 9345CEAE2102B68A0061EFD6 /* BentonSans-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9345CEAC2102B68A0061EFD6 /* BentonSans-Bold.otf */; }; @@ -276,6 +277,20 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; + 9331F513214D88F300E37A58 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9331F50E214D88F300E37A58 /* RNVersionNumber.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNVersionNumber; + }; + 9331F515214D88F300E37A58 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9331F50E214D88F300E37A58 /* RNVersionNumber.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2858ECD01F8B91B400610575; + remoteInfo = "RNVersionNumber-tvOS"; + }; 935215C4207E966C00D46B81 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 935215BC207E966B00D46B81 /* ART.xcodeproj */; @@ -578,6 +593,7 @@ 932E4DB520B8D7E000358ED3 /* Biotif-SemiBoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Biotif-SemiBoldItalic.ttf"; path = "../App/Fonts/Biotif-SemiBoldItalic.ttf"; sourceTree = ""; }; 932E4DB620B8D7E100358ED3 /* Biotif-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Biotif-Light.ttf"; path = "../App/Fonts/Biotif-Light.ttf"; sourceTree = ""; }; 932E4DB720B8D7E100358ED3 /* Biotif-BookItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Biotif-BookItalic.ttf"; path = "../App/Fonts/Biotif-BookItalic.ttf"; sourceTree = ""; }; + 9331F50E214D88F300E37A58 /* RNVersionNumber.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNVersionNumber.xcodeproj; path = "../node_modules/react-native-version-number/ios/RNVersionNumber.xcodeproj"; sourceTree = ""; }; 9345CEA62102B24D0061EFD6 /* BentonSans.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = BentonSans.otf; path = ../App/Fonts/BentonSans.otf; sourceTree = ""; }; 9345CEAB2102B68A0061EFD6 /* BentonSans-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BentonSans-Light.otf"; path = "../App/Fonts/BentonSans-Light.otf"; sourceTree = ""; }; 9345CEAC2102B68A0061EFD6 /* BentonSans-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BentonSans-Bold.otf"; path = "../App/Fonts/BentonSans-Bold.otf"; sourceTree = ""; }; @@ -628,6 +644,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9331F517214D890B00E37A58 /* libRNVersionNumber.a in Frameworks */, 93A9BDD321471BDC00BE4CE2 /* Mobile.framework in Frameworks */, A209E2322127748D0017E147 /* libRCTPushNotification.a in Frameworks */, 93B0F54F2119075100151B63 /* libSMXCrashlytics.a in Frameworks */, @@ -866,6 +883,7 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( + 9331F50E214D88F300E37A58 /* RNVersionNumber.xcodeproj */, A209E2292127747E0017E147 /* RCTPushNotification.xcodeproj */, 93B0F50A2119072900151B63 /* SMXCrashlytics.xcodeproj */, 93E3D607210E67E7000EB402 /* RNImagePicker.xcodeproj */, @@ -933,6 +951,15 @@ name = Products; sourceTree = ""; }; + 9331F50F214D88F300E37A58 /* Products */ = { + isa = PBXGroup; + children = ( + 9331F514214D88F300E37A58 /* libRNVersionNumber.a */, + 9331F516214D88F300E37A58 /* libRNVersionNumber-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; 9339E99E205C381700BCA4CF /* NativeModules */ = { isa = PBXGroup; children = ( @@ -1267,6 +1294,10 @@ ProductGroup = 93F072192051A31A0066155B /* Products */; ProjectRef = BCE1D0D0A2DC49468796E22E /* RNVectorIcons.xcodeproj */; }, + { + ProductGroup = 9331F50F214D88F300E37A58 /* Products */; + ProjectRef = 9331F50E214D88F300E37A58 /* RNVersionNumber.xcodeproj */; + }, { ProductGroup = 93B0F50B2119072900151B63 /* Products */; ProjectRef = 93B0F50A2119072900151B63 /* SMXCrashlytics.xcodeproj */; @@ -1474,6 +1505,20 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 9331F514214D88F300E37A58 /* libRNVersionNumber.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNVersionNumber.a; + remoteRef = 9331F513214D88F300E37A58 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9331F516214D88F300E37A58 /* libRNVersionNumber-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRNVersionNumber-tvOS.a"; + remoteRef = 9331F515214D88F300E37A58 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 935215C5207E966C00D46B81 /* libART.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; diff --git a/ios/TextilePhotos/Info.plist b/ios/TextilePhotos/Info.plist index dbd1700d7..088a8071b 100644 --- a/ios/TextilePhotos/Info.plist +++ b/ios/TextilePhotos/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.4.10 + 0 CFBundleSignature ???? CFBundleURLTypes @@ -34,7 +34,7 @@ CFBundleVersion - 0 + dev Fabric APIKey diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index ae2ccf2dc..13e9cba6a 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -27,6 +27,37 @@ platform :ios do ) end + desc "Push internal test build to Fabric" + lane :adhoc do + APP_ID = "io.textile.Wallet" + PROFILE = "match AdHoc io.textile.Wallet" + settings_to_override = { + :PROVISIONING_PROFILE_SPECIFIER => PROFILE + } + match(type: "adhoc") + increment_build_number( + build_number: ENV['CIRCLE_BUILD_NUM'], + xcodeproj: "TextilePhotos.xcodeproj" + ) + gym( + workspace: "TextilePhotos.xcworkspace", + scheme: "TextilePhotos", + xcargs: settings_to_override, + export_method: "ad-hoc", + export_options: { + provisioningProfiles: { + APP_ID => PROFILE + } + } + ) + crashlytics( + api_token: ENV['FABRIC_API_TOKEN'], + build_secret: ENV['FABRIC_BUILD_SECRET'], + groups: 'textile-internal' + ) + upload_symbols_to_crashlytics(dsym_path: "./TextilePhotos.app.dSYM.zip", api_token: ENV['FABRIC_API_TOKEN']) + end + desc "Push a new beta build to TestFlight" desc "This will also make sure the profile is up to date" lane :beta do @@ -57,11 +88,23 @@ platform :ios do desc "Deploy a new version to the App Store" lane :release do - match(type: "appstore") - # snapshot - gym # Build your app - more options available - deliver(force: true) - # frameit + match(type: "appstore") # more information: https://codesigning.guide + tag = ENV['CIRCLE_TAG'] # looks like ios_1.2.3_456 + parts = tag.split("_") + increment_version_number( + version_number: parts[1], + xcodeproj: "TextilePhotos.xcodeproj" + ) + increment_build_number( + build_number: parts[2], + xcodeproj: "TextilePhotos.xcodeproj" + ) + gym(workspace: "TextilePhotos.xcworkspace", scheme: "TextilePhotos") + deliver( + force: true, + app_version: parts[1], + skip_app_version_update: false + ) end desc "Register new device" diff --git a/ios/fastlane/README.md b/ios/fastlane/README.md index f815b4747..523f5e023 100644 --- a/ios/fastlane/README.md +++ b/ios/fastlane/README.md @@ -21,6 +21,11 @@ or alternatively using `brew cask install fastlane` fastlane ios test ``` Runs all the tests +### ios adhoc +``` +fastlane ios adhoc +``` +Push internal test build to Fabric ### ios beta ``` fastlane ios beta diff --git a/package.json b/package.json index a1177d523..f802a882e 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "react-native-push-notification": "^3.1.1", "react-native-scalable-image": "^0.4.0", "react-native-vector-icons": "^4.6.0", + "react-native-version-number": "^0.3.4", "react-navigation": "^2.11.2", "react-navigation-header-buttons": "^2.1.0", "react-redux": "^5.0.7", diff --git a/yarn.lock b/yarn.lock index 37b34ec48..5f8d20862 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6086,6 +6086,10 @@ react-native-vector-icons@^4.6.0: prop-types "^15.5.10" yargs "^8.0.2" +react-native-version-number@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/react-native-version-number/-/react-native-version-number-0.3.4.tgz#4850e1a40ea719ee43092812d0693f9dc3be5f40" + react-native@0.55.3: version "0.55.3" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.55.3.tgz#6ff1691bd0645d0480fba16377edb9dce5bd28c4"