Compare commits
	
		
			1 Commits
		
	
	
		
			89ff7591b9
			...
			v0.0.37
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e764393706 | 
							
								
								
									
										24
									
								
								frontend/.github/workflows/build_app_ios.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								frontend/.github/workflows/build_app_ios.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -6,14 +6,17 @@ on: | |||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: macos-latest |     runs-on: macos-latest | ||||||
|  |     env: | ||||||
|  |       # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps | ||||||
|  |       BUNDLE_GEMFILE: ios/Gemfile | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|  |  | ||||||
|       - name: Set up ruby env |       - name: Set up ruby env | ||||||
|         uses: ruby/setup-ruby@v1 |         uses: ruby/setup-ruby@v1 | ||||||
|         with: |         with: | ||||||
|           ruby-version: 3.2.1 |           ruby-version: 3.3 | ||||||
|           bundler-cache: true |           bundler-cache: true # runs 'bundle install' and caches installed gems automatically | ||||||
|  |  | ||||||
|       - name: Install Flutter |       - name: Install Flutter | ||||||
|         uses: subosito/flutter-action@v2 |         uses: subosito/flutter-action@v2 | ||||||
| @@ -31,16 +34,24 @@ jobs: | |||||||
|           echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV |           echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV | ||||||
|  |  | ||||||
|       - name: Setup SSH key for match git repo |       - name: Setup SSH key for match git repo | ||||||
|         run: echo "$MATCH_REPO_SSH_KEY" | base64 --decode > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa |         # and mark the host as known | ||||||
|  |         run: | | ||||||
|  |           echo $MATCH_REPO_SSH_KEY | base64 --decode > ~/.ssh/id_rsa | ||||||
|  |           chmod 600 ~/.ssh/id_rsa | ||||||
|  |           ssh-keyscan -p 2222 git.kluster.moll.re > ~/.ssh/known_hosts | ||||||
|         env: |         env: | ||||||
|           MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }} |           MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }} | ||||||
|  |  | ||||||
|       - name: Install fastlane |       - name: Install dependencies and clean up | ||||||
|         run: bundle install |         run: | | ||||||
|  |           flutter pub get | ||||||
|  |           bundle exec pod install | ||||||
|  |           flutter clean | ||||||
|  |           bundle exec pod cache clean --all | ||||||
|         working-directory: ios |         working-directory: ios | ||||||
|  |  | ||||||
|       - name: Run fastlane lane |       - name: Run fastlane lane | ||||||
|         run: bundle exec fastlane deploy_release |         run: bundle exec fastlane deploy_release --verbose | ||||||
|         working-directory: ios |         working-directory: ios | ||||||
|         env: |         env: | ||||||
|           BUILD_NUMBER: ${{ github.run_number }} |           BUILD_NUMBER: ${{ github.run_number }} | ||||||
| @@ -50,3 +61,4 @@ jobs: | |||||||
|           IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }} |           IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }} | ||||||
|           IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }} |           IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }} | ||||||
|           MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }} |           MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }} | ||||||
|  |           IOS_GOOGLE_MAPS_API_KEY: ${{ secrets.IOS_GOOGLE_MAPS_API_KEY }} | ||||||
|   | |||||||
| @@ -17,17 +17,7 @@ flutter pub get | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ## Development | ## Development | ||||||
| ### TODO | ### ... | ||||||
|  |  | ||||||
| ## Deployment and metadata |  | ||||||
| ### Deploying a new version |  | ||||||
| To truly deploy a new version of the application, i.e. to the official app stores, a special CI step is required. This listens for new tags. To create a new tag position yourself on the main branch and run |  | ||||||
| ```bash |  | ||||||
| git tag -a v<name> -m "Release <name>" |  | ||||||
| git push origin v<name> |  | ||||||
| ``` |  | ||||||
| We adhere to the [Semantic Versioning](https://semver.org/) standard, so the tag should be of the form `v0.1.8` for example.  |  | ||||||
|  |  | ||||||
| ### Icons and logos | ### Icons and logos | ||||||
| The application uses a custom launcher icon and splash screen. These are managed platform-independently using the `flutter_launcher_icons` package. | The application uses a custom launcher icon and splash screen. These are managed platform-independently using the `flutter_launcher_icons` package. | ||||||
|  |  | ||||||
| @@ -35,10 +25,14 @@ To update the icons, change the `flutter_launcher_icons.yaml` configuration file | |||||||
| ```bash | ```bash | ||||||
| dart run flutter_launcher_icons | dart run flutter_launcher_icons | ||||||
| ``` | ``` | ||||||
| ### Other metadata |  | ||||||
| Fastlane provides mechanisms to update the metadata of the application. This includes the name, description, screenshots, etc. The metadata is stored in the `fastlane/metadata` directory of both the `android`and the `ios` version of the application. Both versions have different structures but **they should be kept in sync**. For more information see the [fastlane documentation](https://docs.fastlane.tools/): | ### Deploying a new version | ||||||
| - https://docs.fastlane.tools/actions/deliver/ | To truly deploy a new version of the application, i.e. to the official app stores, a special CI step is required. This listens for new tags. To create a new tag position yourself on the main branch and run | ||||||
| - https://docs.fastlane.tools/actions/supply/ | ```bash | ||||||
|  | git tag -a v<name> -m "Release <name>" | ||||||
|  | git push origin v<name> | ||||||
|  | ``` | ||||||
|  | We adhere to the [Semantic Versioning](https://semver.org/) standard, so the tag should be of the form `v0.1.8` for example.  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Fastlane - in depth | ## Fastlane - in depth | ||||||
| @@ -52,22 +46,16 @@ bundle exec fastlane <lane> | |||||||
| ``` | ``` | ||||||
| This is reused in the CI/CD pipeline to automate the deployment process. | This is reused in the CI/CD pipeline to automate the deployment process. | ||||||
|  |  | ||||||
| Secrets used by fastlane are stored on the github push mirror used for builds. See below. | Secrets used by fastlane are stored on hashicorp vault and are fetched by the CI/CD pipeline. See below. | ||||||
|  |  | ||||||
| ## Secrets | ## Secrets | ||||||
| These are mostly used by the CI/CD pipeline to deploy the application.  | These are mostly used by the CI/CD pipeline to deploy the application. The main usage for github actions is documented under [https://github.com/hashicorp/vault-action](https://github.com/hashicorp/vault-action). | ||||||
|  |  | ||||||
| **Global secrets** are used for both versions of the app (android and ios).  |  | ||||||
| - `GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API |  | ||||||
|  |  | ||||||
| **Platform-specific secrets** are used by the CI/CD pipeline to deploy to the respective app stores. | **Platform-specific secrets** are used by the CI/CD pipeline to deploy to the respective app stores. | ||||||
| - `ANDROID_KEYSTORE_BASE64` is used to sign the android apk | - `GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the android platform | ||||||
| - `ANDROID_SECRET_PROPERTIES_BASE64` contains the keystore password and key password | - `ANDROID_KEYSTORE` is used to sign the android apk | ||||||
| - `ANDROID_GOOGLE_PLAY_JSON_BASE64` is used to authenticate with the Google Play Store api | - `ANDROID_GOOGLE_KEY` is used to authenticate with the Google Play Store api | ||||||
| - `IOS_ASC_ISSUER_ID` is used to authenticate with the App Store Connect API | - `IOS_GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the ios platform | ||||||
| - `IOS_ASC_KEY` as well | - `IOS_GOOGLE_...` | ||||||
| - `IOS_ASC_KEY_ID` as well | - `IOS_GOOGLE_...` | ||||||
| - `IOS_MATCH_PASSWORD` is used by fastlane match to download the certificates | - `IOS_GOOGLE_...` | ||||||
| - `IOS_MATCH_REPO_SSH_KEY_BASE64` is used to authenticate with the git repository where the certificates are stored |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| AnyWay is an application that helps you plan truly unique city trips. When planning a new trip, you can specify <our> preferences and constraints and anyway generates a personalized itinerary just for you.  | AnyWay - plan city trips your way | ||||||
|  |  | ||||||
| Anyway follows these core principles: | AnyWay is a mobile application that helps users plan city trips. The app allows users to specify their preferences and constraints, and then generates a personalized itinerary for them. The planning follows some guiding principles: | ||||||
| - **Personalization**: Trips should be match your interests - not just the most popular destinations. | - **Personalization**:The user's preferences should be reflected in the choice of destinations. | ||||||
| - **Efficiency**: Don't just walk in circles! Anyway creates the most efficient route for you. | - **Efficiency**:The itinerary should be optimized for the user's constraints. | ||||||
| - **Flexibility**: Vacations are the time to be spontaneous. Anyway lets you update your plans on the go. | - **Flexibility**: We aknowledge that tourism is a dynamic activity, and that users may want to change their plans on the go. | ||||||
| - **Discoverability**: Tourism means exploration. Anyway encourages you to take detours and make spontaneous decisions. | - **Discoverability**: Tourism is an inherently exploratory activity. Once a rough itinerary is generated, detours and spontaneous decisions should be encouraged. | ||||||
| @@ -4,17 +4,15 @@ PODS: | |||||||
|     - Flutter |     - Flutter | ||||||
|   - geolocator_apple (1.2.0): |   - geolocator_apple (1.2.0): | ||||||
|     - Flutter |     - Flutter | ||||||
|   - Google-Maps-iOS-Utils (6.0.0): |   - Google-Maps-iOS-Utils (6.1.0): | ||||||
|     - GoogleMaps (~> 9.0) |     - GoogleMaps (~> 9.0) | ||||||
|   - google_maps_flutter_ios (0.0.1): |   - google_maps_flutter_ios (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|     - Google-Maps-iOS-Utils (< 7.0, >= 5.0) |     - Google-Maps-iOS-Utils (< 7.0, >= 5.0) | ||||||
|     - GoogleMaps (< 10.0, >= 8.4) |     - GoogleMaps (< 10.0, >= 8.4) | ||||||
|   - GoogleMaps (9.1.1): |   - GoogleMaps (9.2.0): | ||||||
|     - GoogleMaps/Maps (= 9.1.1) |     - GoogleMaps/Maps (= 9.2.0) | ||||||
|   - GoogleMaps/Base (9.1.1) |   - GoogleMaps/Maps (9.2.0) | ||||||
|   - GoogleMaps/Maps (9.1.1): |  | ||||||
|     - GoogleMaps/Base |  | ||||||
|   - map_launcher (0.0.1): |   - map_launcher (0.0.1): | ||||||
|     - Flutter |     - Flutter | ||||||
|   - path_provider_foundation (0.0.1): |   - path_provider_foundation (0.0.1): | ||||||
| @@ -74,9 +72,9 @@ SPEC CHECKSUMS: | |||||||
|   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 |   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 | ||||||
|   geocoding_ios: bcbdaa6bddd7d3129c9bcb8acddc5d8778689768 |   geocoding_ios: bcbdaa6bddd7d3129c9bcb8acddc5d8778689768 | ||||||
|   geolocator_apple: d981750b9f47dbdb02427e1476d9a04397beb8d9 |   geolocator_apple: d981750b9f47dbdb02427e1476d9a04397beb8d9 | ||||||
|   Google-Maps-iOS-Utils: cfe6a0239c7ca634b7e001ad059a6707143dc8dc |   Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96 | ||||||
|   google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 |   google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 | ||||||
|   GoogleMaps: 80ea184ed6bf44139f383a8b0e248ba3ec1cc8c9 |   GoogleMaps: 634ec3ca99698b31ca2253d64f017217d70cfb38 | ||||||
|   map_launcher: fe43bda6720bb73c12fcc1bdd86123ff49a4d4d6 |   map_launcher: fe43bda6720bb73c12fcc1bdd86123ff49a4d4d6 | ||||||
|   path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 |   path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 | ||||||
|   permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d |   permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d | ||||||
| @@ -84,6 +82,6 @@ SPEC CHECKSUMS: | |||||||
|   sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3 |   sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3 | ||||||
|   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d |   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d | ||||||
|  |  | ||||||
| PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 | PODFILE CHECKSUM: bd1a78910c05ac1e3a220e80f392c61ab2cc8789 | ||||||
|  |  | ||||||
| COCOAPODS: 1.10.2 | COCOAPODS: 1.10.2 | ||||||
|   | |||||||
| @@ -8,9 +8,7 @@ import GoogleMaps | |||||||
|     _ application: UIApplication, |     _ application: UIApplication, | ||||||
|     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? |     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | ||||||
|   ) -> Bool { |   ) -> Bool { | ||||||
|     // load the key from env |     GMSServices.provideAPIKey("IOS_GOOGLE_MAPS_API_KEY") | ||||||
|     let key = ProcessInfo.processInfo.environment["GOOGLE_MAPS_API_KEY"]! |  | ||||||
|     GMSServices.provideAPIKey(key) |  | ||||||
|     GeneratedPluginRegistrant.register(with: self) |     GeneratedPluginRegistrant.register(with: self) | ||||||
|     return super.application(application, didFinishLaunchingWithOptions: launchOptions) |     return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -10,4 +10,4 @@ IOS_ASC_ISSUER_ID="sample" | |||||||
| SIGNING_KEY_FILE_PATH="sample" | SIGNING_KEY_FILE_PATH="sample" | ||||||
| SIGNING_KEY_PASSWORD="sample" | SIGNING_KEY_PASSWORD="sample" | ||||||
|  |  | ||||||
| GOOGLE_MAPS_API_KEY="sample" | IOS_GOOGLE_MAPS_API_KEY="sample" | ||||||
|   | |||||||
| @@ -1,3 +0,0 @@ | |||||||
| # The Deliverfile allows you to store various App Store Connect metadata |  | ||||||
| # For more information, check out the docs |  | ||||||
| # https://docs.fastlane.tools/actions/deliver/ |  | ||||||
| @@ -33,7 +33,7 @@ platform :ios do | |||||||
|       "flutter", |       "flutter", | ||||||
|       "build", |       "build", | ||||||
|       "ipa", |       "ipa", | ||||||
|       "--release", |       "--debug", | ||||||
|       "--build-name=#{build_name}", |       "--build-name=#{build_name}", | ||||||
|       "--build-number=#{build_number}", |       "--build-number=#{build_number}", | ||||||
|     ) |     ) | ||||||
| @@ -44,7 +44,9 @@ platform :ios do | |||||||
|       archive_path: "../build/ios/archive/Runner.xcarchive" |       archive_path: "../build/ios/archive/Runner.xcarchive" | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     upload_to_testflight |     upload_to_testflight( | ||||||
|  |       skip_waiting_for_build_processing: true, | ||||||
|  |     ) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -62,6 +64,16 @@ platform :ios do | |||||||
|       readonly: true, |       readonly: true, | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|  |     # replace secrets by real values, the stupid way | ||||||
|  |     sh( | ||||||
|  |       "sed", | ||||||
|  |       "-i", | ||||||
|  |       "", | ||||||
|  |       "s/IOS_GOOGLE_MAPS_API_KEY/#{ENV["IOS_GOOGLE_MAPS_API_KEY"]}/g", | ||||||
|  |       "../Runner/AppDelegate.swift" | ||||||
|  |  | ||||||
|  |     ) | ||||||
|  |  | ||||||
|     sh( |     sh( | ||||||
|       "flutter", |       "flutter", | ||||||
|       "build", |       "build", | ||||||
|   | |||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1,7 +0,0 @@ | |||||||
| AnyWay is an application that helps you plan truly unique city trips. When planning a new trip, you can specify <our> preferences and constraints and anyway generates a personalized itinerary just for you.  |  | ||||||
|  |  | ||||||
| Anyway follows these core principles: |  | ||||||
| - **Personalization**: Trips should be match your interests - not just the most popular destinations. |  | ||||||
| - **Efficiency**: Don't just walk in circles! Anyway creates the most efficient route for you. |  | ||||||
| - **Flexibility**: Vacations are the time to be spontaneous. Anyway lets you update your plans on the go. |  | ||||||
| - **Discoverability**: Tourism means exploration. Anyway encourages you to take detours and make spontaneous decisions. |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| tourism, cities, travel, guide |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| https://anydev.info |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| AnyWay |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| https://anydev.info/privacy |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| AnyWay - plan city trips your way! |  | ||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| Plan city trips your way! |  | ||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
|  |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| ## Screenshots Naming Rules |  | ||||||
|  |  | ||||||
| Put all screenshots you want to use inside the folder of its language (e.g. `en-US`). |  | ||||||
| The device type will automatically be recognized using the image resolution. |  | ||||||
|  |  | ||||||
| The screenshots can be named whatever you want, but keep in mind they are sorted |  | ||||||
| alphabetically, in a human-friendly way. See https://github.com/fastlane/fastlane/pull/18200 for more details. |  | ||||||
|  |  | ||||||
| ### Exceptions |  | ||||||
|  |  | ||||||
| #### iPad Pro (3rd Gen) 12.9" |  | ||||||
|  |  | ||||||
| Since iPad Pro (3rd Gen) 12.9" and iPad Pro (2nd Gen) 12.9" have the same image |  | ||||||
| resolution, screenshots of the iPad Pro (3rd gen) 12.9" must contain either the |  | ||||||
| string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129` |  | ||||||
| (App Store Connect's internal naming of the display family for the 3rd generation iPad Pro) |  | ||||||
| in its filename to be assigned the correct display family and to be uploaded to |  | ||||||
| the correct screenshot slot in your app's metadata. |  | ||||||
|  |  | ||||||
| ### Other Platforms |  | ||||||
|  |  | ||||||
| #### Apple TV |  | ||||||
|  |  | ||||||
| Apple TV screenshots should be stored in a subdirectory named `appleTV` with language |  | ||||||
| folders inside of it. |  | ||||||
|  |  | ||||||
| #### iMessage |  | ||||||
|  |  | ||||||
| iMessage screenshots, like the Apple TV ones, should also be stored in a subdirectory |  | ||||||
| named `iMessage`, with language folders inside of it. |  | ||||||
		Reference in New Issue
	
	Block a user