MAAGApp Mobile App
1. Setup
1.1 Compatibility
To run this mobile app, we need to have node 8.x.x installed.
To install and manage multiple versions of node, we can use nvm
We also need to have installed Ruby version 2.3.X to use Gem.
1.2 Install
Install cocoapod
Clone the repository and then install all dependencies by running the following command
nvm use
npm install
1.3 Run
To run on iOS simulator
pre install pod
npm run pod
or
cd ios
pod install
cd ../
npm run ios
Run specific scheme
npm run ios -- --scheme "Nixplay" --device "e32c0db8ed7e5ac2be743dcada78b57ac944fd6e"
or
npm run ios:rnd -- --simulator "iPhone X"
or
npm run ios:rnd -- --device "iPhone X"
npm run ios:qa -- --device "iPhone X"
To run on Android emulator
npm run android
To run the unit tests
npm test
To run the unit tests in watch mode
npm run test:watch
2. Deploying Alpha build (We will use this until we release to PROD)
2.1 Increment build number
Alpha build is built using the develop branch with only the build number set to git rev-list --count develop. To create a new alpha build simply run the following command to update build number and commit it:
Update package.json version e.g
"version": "3.0.1"
- run
jq -r '.version' package.jsonto echo npm run create:release:branchcreate release branch with version namenpm run prereleasebumped version code when release to qagit flow release finishto close release branch
2.2 Release an iOS build
After running the prerelease script, we can release iOS build by running the following command:
npm run ios:release:alpha
2.3 Release an Android build
After running the prerelease script, we can release Android build by running the following command:
npm run android:release:alpha
3. Deploying to QA
3.1 Before you begin
3.1.A Setup prpvisioning profile
You need to install Fabric app to your mac. You need a account with https://fabric.io/, ask Kumar / James to send an invite so an account on Fabric can be created. After creating an account you can download and install the Fabric app.
You need 2 passwords to successfully deploy the app to crashlytics 1) the passcode for decrypting developer certificates to use with match and 2) the password for mobile@nix-digital.com apple developer account. Again ask Kumar / James for these.
You also need to install Fastlane CLI. Run the following command to do so:
gem install fastlane -NV
3.1.B sync certificat
If certificate is outdate/not be synced run the following commnad to sync up from repo
fastlane ios certificates --env=<env>
e.g.
fastlane ios certificates --env=rnd
for specific type of cert
fastlane ios read_dev_cert --env=<env>
fastlane ios read_adhoc_cert --env=<env>
fastlane ios read_appstore_cert --env=<env>
3.2 Create release branch
You can either use gitflow or simply use git to create a new branch:
git flow release start <version>
or
git checkout -b release/<version>
3.3 Bump build number
Bump build number and run other prerelease scripts like npm install etc
npm run prerelease
3.3.1 Bump version number
npm --no-git-tag-version version [major|minor|patch] patch -m "Upgrade to version %s"
example output
npm --no-git-tag-version version patch -m "Upgrade to version %s"
v0.1.2
[RNV] Versioning Android...
[RNV] Android updated
[RNV] Versioning iOS...
[RNV] iOS updated
[RNV] Amending...
[RNV] Adjusting Git tag...
[RNV] Done
3.4 Release to QA
Release iOS version to QA:
npm run ios:release:qa
Release Android version to QA:
npm run android:release:qa
3.4.1 Extra command
Release to Alpha:
npm run ios:release:alpha
npm run android:release:alpha
3.5 Merge the release branch back to Develop and Master
4. Workflow
Always create a new git branch to work on a user story. After a user story is completed then commit the code and push your changes. Login to https://git.nixplay.ninja/ and create a Merge Request, make sure to assign it to someone. The assignee should review the code and discuss if any issues with the committer and if no issues then merge it back to the develop branch.
Note: Please never use --no-verify when pushing your changes to any branch including feature branches.
4.1 Create a new branch
You can either create a new branch using git or use gitflow if you have that set up
To create and switch to a new branch you can:
git checkout -b <branch name>
Work on a user story and make sure to add unit tests to cover your changes and to fix any broken unit tests due to the changes made.
4.2 Commit your changes and create merge request
Continue to commit changes regularly but make sure all tests and eslint issues is fixed before pushing. If you think a user story is done then go to https://git.nixplay.ninja/ and create a new merge request and assign it to someone to merge.
Note: Do not commit directly to master or develop branch unless the changes is minimal. This means changing this README file is okay to commit directly to develop branch or changing the padding of a component. Any changes that requires more changes than that should be committed to feature branch.
4.3 Merge back from develop branch often
When we are working on a feature branch we may diverge from the develop branch. To ensure what we are doing is as upto date as possible and also to avoid merge conflicts, we should merge develop branch to our feature branch as often as possible.
5 Update reducerVersion when modifying the index reducer
Whenever we modify src/reducers/index.js we should also make sure we update the reducerVersion in src/config/ReduxPersist.js to prevent the app from crashing.
Troubleshooting
iOS error No bundle url present, can try:
iOS error related to bundle url, you can also try:
- Kill the existing bundler process and then run the bundler
watchman watch-del-all yarn cache clean npm start -- --reset-cache
iOS error Entry, :CFBundleIdentifier, Does Not Exist, can try:
- Run
npm run build:ios
Android stuck on splash screen, can try:
- Uninstall the app, then run
npm run android
If you see a version mismatch error message then try running the following command:
npm run ios:reset
Android build failed
Could not find manifest-merger.jar ...
run rm -rf $HOME/.gradle/caches
run ./android/gradlew cleanBuildCache -p ./android
Update app icon with single command
https://blog.bam.tech/developper-news/change-your-react-native-app-icons-in-a-single-command-line
Testing Subscription
Library used: react-native-iap
Subscription flow:
Reference: https://medium.com/dooboolab/react-native-iap-v3-1259e0b0c017
Creating subscription item for iOS
Apple Store Connect > My Apps > Select an App > Features > In-App Purchases > Create your item
IMPORTANT: Your item need to be Ready to Submit in RND and QA for it to purchasable.
IMPORTANT 2: Product ID is unique and is for all apps. Even if you delete the item, you still cannot create with the same product ID even in another env.
Creating subscription item for Android
Google Play Console > Select an App > Store presence > In-app products > Subscriptions > Create your item
NOTE: Once you activate the subscription item, there is no way to deactivate or delete.
Setting up sandbox on iOS
Create an email address under:
Apple Store Connect > Users and Access > Testers
Note: Cannot create with email that is used for existing appleID, you can create using a non-existing email address. There will be no purchase related email sent for sandbox purchase.
Setting up sandbox on Android
- Make sure the email address you register for testing is the primary account in your phone. That means the account is the first ever account you use in your phone. If not, remove all gmail account, then login with that email. Or, create another user profile in your phone (if the function is enabled), and use the email address registered as a user
- Add email address in
Google Play Console > Settings > Account Details > License Testing - Add email address in one of the list in
Google Play Console > Manage email lists - Open this url with the email account you register:
- RND:
https://play.google.com/apps/testing/com.creedon.Nixplay.rnd - QA:
https://play.google.com/apps/testing/com.creedon.Nixplay.qa
- RND:
Extra: The enabled countries might matters. Go to App (RND / QA) > Store presence > Pricing & distribution > Countries, and enable the country.
Subscription renewal timing
There is no way to manually unsubscribe in iOS sandbox, need to wait. For Android, can unsubsribe in playstore. Here are the info for the timings:
- https://help.apple.com/app-store-connect/#/dev7e89e149d
- https://developer.android.com/google/play/billing/billing_testing#testing-renewals
Trouble Shooting
xcrun: error: unable to find utility "instruments", not a developer
- if you have the following error message
Found Xcode project TestProject.xcodeproj
xcrun: error: unable to find utility "instruments", not a developer
tool or in PATH
Command failed: xcrun instruments -s
xcrun: error: unable to find utility "instruments", not a developer
tool or in PATH
sudo xcode-select -s /Applications/Xcode.app
xcode-select --install
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
- if you have the following error
Fetching json 1.8.1
Installing json 1.8.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /usr/local/rvm/gems/ruby-2.3.4/gems/json-1.8.1/ext/json/ext/generator
/usr/local/rvm/rubies/ruby-2.3.4/bin/ruby -r ./siteconf20180608-11801-sqv5ra.rb extconf.rb
creating Makefile
current directory: /usr/local/rvm/gems/ruby-2.3.4/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR=" clean
current directory: /usr/local/rvm/gems/ruby-2.3.4/gems/json-1.8.1/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
In file included from generator.c:1:
./../fbuffer/fbuffer.h:175:47: error: too few arguments provided to function-like macro invocation
VALUE result = rb_str_new(FBUFFER_PAIR(fb));
^
/usr/local/rvm/rubies/ruby-2.3.4/include/ruby-2.3.0/ruby/intern.h:798:9: note: macro 'rb_str_new' defined here
#define rb_str_new(str, len) __extension__ ( \
^
In file included from generator.c:1:
./../fbuffer/fbuffer.h:175:11: warning: incompatible pointer to integer conversion initializing 'VALUE' (aka 'unsigned
long') with an expression of type 'VALUE (const char *, long)' (aka 'unsigned long (const char *, long)')
[-Wint-conversion]
VALUE result = rb_str_new(FBUFFER_PAIR(fb));
^ ~~~~~~~~~~
1 warning and 1 error generated.
make: *** [generator.o] Error 1
make failed, exit code 2
Gem files will remain installed in /usr/local/rvm/gems/ruby-2.3.4/gems/json-1.8.1 for inspection.
Results logged to /usr/local/rvm/gems/ruby-2.3.4/extensions/x86_64-darwin-16/2.3.0/json-1.8.1/gem_make.out
An error occurred while installing json (1.8.1), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.1' --source 'https://rubygems.org/'` succeeds before bundling.
run the following command to update gem file
https://github.com/flori/json/issues/229
'config.h' file not found
Copy and paste the following commands
cd ./node_modules/react-native
./scripts/ios-install-third-party.sh
cd third-party/glog-0.3.4
./configure
cd ../../../..
clean the cache
npm run clean
you can run any one of the command individually
watchman watch-del-all
rm -rf node_modules
npm cache clean
rm -rf android/build/
rm -rf ./android/app/build/
rm -rf ./android/.gradle/
rm -rf ./android/.idea/
rm -rf ./ios/build
rm -rf ~/Library/Developer/Xcode/DerivedData && npm install
Android subscription item not found in RND and QA
Check the Setting up sandbox on Android section above