Organisasi Flavours di Flutter

Apa itu Flavour?


Bayangkan situasinya: ada aplikasi dengan analitik. Ada tim pengembangan, penguji dan pengguna akhir. Baik itu maupun yang menggunakan satu versi aplikasi. Misalkan kita ingin menganalisis seberapa menarik fitur A bagi pengguna. Apa yang kita lakukan dalam kasus ini? Kami pergi ke analytics dan melihat berapa banyak kegunaan fitur ini (misalnya, transisi ke layar). Tetapi apa yang kita lihat: sejumlah transisi yang terlarang, yang tidak berarti mustahil dengan audiens saat ini, dan semua transisi ini berada dalam periode waktu tertentu. Kami melangkah lebih jauh dan memahami bahwa saat ini pengujian fitur ini telah dilakukan. Dan sedikit lebih awal perkembangannya. Pada saat yang sama, analitik juga dikirimkan. Intinya: analitik itu kotor dan di bawah standar.


Di sini Anda dapat mengganti analitik kata dengan yang lain: pemberitahuan push, pelaporan kerusakan, dll.


Dan dalam situasi ini, kita diselamatkan dengan membagi aplikasi menjadi dua versi yang berbeda minimal, misalnya, Bundle ID (nama paket). Pengembang dan penguji hanya menggunakan versi pengembang khusus, dan pengguna menggunakan versi penjualan.


Ini hanyalah salah satu dari tugas rasa. Di sini rasa akan digunakan, karena ini adalah nama yang digunakan oleh Flutter. Orang-orang yang akrab dengan pengembangan Android, saya pikir segera mengenali mekanisme ini.



Flutter Flutter?


Ya, kami sudah menemukan tugasnya. Tetapi bagaimana cara mengimplementasikannya? Apakah semuanya sesederhana yang mereka katakan?
Mari kita segera memutuskan: pengorganisasian rasa adalah tugas murni asli. Informasi tentang mereka tidak akan tersedia dari kode panah. Oleh karena itu, untuk cara-cara pengorganisasian, kami akan pergi ke pengembangan ponsel asli.


Android


. android. : « buildType?», .


, , :


flavorDimensions "release-type"

    productFlavors {
        dev {
            dimension "release-type"
            applicationIdSuffix  ".dev"
            versionNameSuffix "-dev"
        }

        prod {
            dimension "release-type"
        }
    }

, :


flutter run --flavor dev

android .


: « buildType?» : Flutter buildType . , .


.
, builtTypes. IOS.
:


AndroidIOS
build typesbuild configurations
flavorstargets

— , ( ). flavor’ target’ — .


, , «»...


Runner — .


, target flavors iOS . , Flutter . , . . .


IOS


: (dev, prod, ).


:


  1. .
  2. .
  3. !

.



: dev, prod. :


    #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"
    #include "Generated.xcconfig"
    #include "common.xcconfig"

    bundle_suffix=.dev
    IDENTIFIER=$(identifier)$(bundle_suffix)

, bundle_suffix.


, Flutter Release Debug. bundle_suffix. , IDE.


IDENTIFIER — .


, :


ios/Flutter/dev.xcconfig
ios/Flutter/prod.xcconfig

XCode ( , ). Runner → New File → Configuration Settings File → .


Build Configurations. .


. Runner.xcworkspace Xcode Project.


«+» Configurations : Release Debug, .


:



, , IOS .


Scheme


, .



. : — Runner.
Edit Scheme .


Info.plist


(: ) — Bundle Identifier Info.plist


$(PRODUCT_BUNDLE_IDENTIFIER)$(bundle_suffix)

...


, , Android , fastlane gym iOS — . , IOS - … .


No Provisioning Profile


— . , .


, Info.plist , gym PRODUCT_BUNDLE_IDENTIFIER, .
common.xcconfig IDENTIFIER? .


, , , PRODUCT_BUNDLE_IDENTIFIER.


:


identifier=your.bundle.identifier

include User Defined
IDENTIFIER:


#include "common.xcconfig"

IDENTIFIER=$(identifier)$(bundle_suffix)

Xcode. Build Settings:



Product Bundle Identifier ( Packaging):



:


$(IDENTIFIER)


Info.plist bundle suffix, :


$(PRODUCT_BUNFLE_IDENTIFIER)

. .


bundle id


. Firebase, ( ).


— google-services.json(Google-Services.Info.plist). Android : flavor’ .


IOS - .



, . :



: XCode. . XCode — IDE, Add to target.
.



, . - , .


Run Script (setup firebase ):



, !


, :


# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/prod/${GOOGLESERVICE_INFO_PLIST}

# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1 # 1
fi

# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1 # 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

# Copy over the prod GoogleService-Info.plist for Release builds
if [[ "${CONFIGURATION}" == *-prod ]]
then
echo "Using ${GOOGLESERVICE_INFO_PROD}"
cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
echo "Using ${GOOGLESERVICE_INFO_DEV}"
cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi


. , , Flutter ( ). , . .


All Articles