Cách setup nhiều firebase google-service trên IOS khi dùng react-native-config

Vấn đề

Nếu anh em dùng react-native-config, thì thường mọi người sẽ chia làm 3 env chính:

  • dev
  • stag
  • prod

Nếu sử dụng 3 env trên, thì thường trên firebase mọi người sẽ phải tạo ra 3 app tương ứng với env trên.

Và anh em ai dùng firebase đều biết nó sẽ có 1 file config gọi là google-service. Và vấn đề là nếu như bên Android, thì kể cả bạn có 3 app thì cũng chỉ cần sử dụng duy nhất 1 file google-service.json.

Nhưng IOS thì said tao đ*o thích làm thế, và thế là chúng ta có 3 file GoogleService-Info.plist tương ứng với 3 app (dev, stag và prod)

Cách giải quyết

Thường là anh em nếu làm theo hướng dẫn của react-native-config, thì họ sẽ hướng dẫn anh em tạo ra 3 schema tương ứng với số env. Và tất cả đều chung 1 target. Đến đây chắc một số anh em nghĩ là:

"Thế thì thêm 2 cái target nữa là xong nhỉ"

Ờ thì... cũng đúng, chỉ cần thêm 2 cái target nữa rồi cho nó sử dụng cái GoogleService-Info.plist tương ứng là xong, nhưng như thế thì mình đã có 3 cái schema rồi giờ lại còn đẻ thêm 3 cái target nữa thì quả thật là nó có hơi...

Vậy thì mình xin phép giới thiệu 1 cách mình cho là đơn giản hơn, đó là chỉ cần tạo 1 Phase mới trong Build Phases , phase này chịu trách nhiệm lấy file config tương ứng và sử dụng , thế là xong.

- Đầu tiên, mình có 1 con app tên là MyApp với bundle_identifiercom.myapp , com.myapp.dev , com.myapp.staging
- Sau đó, lấy 3 file GoogleServices-info.plist để vào 1 folder Config trong folder ios, đổi tên 3 file này thành GoogleServices-nfo-{bundle_identifier}.plist

Nó sẽ trông như này

- Tiếp theo, mở Xcode, chọn target và vào tab `Build Phases`, tạo 1 phase mới, đặt tên là `Copy Google-Service` chẳng hạn

- Sau đó, vào phase này, thêm vào đoạn bash script sau

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist
FILENAME_IN_BUNDLE=GoogleService-Info.plist
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
Giống thế này là được

Thế là xong, nhìn đoạn script trên thì chắc mọi người cũng thấy được nó hoạt động thế nào, chỉ là lấy ra file GoogleServices có cái bundle_indentifier tương ứng rồi thay vào lúc build. Bao đơn giản phải không?