Files
2025-08-06 13:49:11 +08:00

12 KiB

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"

  1. run jq -r '.version' package.json to echo
  2. npm run create:release:branch create release branch with version name
  3. npm run prerelease bumped version code when release to qa
  4. git flow release finish to 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: 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

  1. 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
  2. Add email address in Google Play Console > Settings > Account Details > License Testing
  3. Add email address in one of the list in Google Play Console > Manage email lists
  4. 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

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:

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