refactor: add mulitple customization features

This commit is contained in:
Rainer Killinger
2022-01-28 12:25:48 +01:00
parent 3afeb0e936
commit d22e6ff87f
14 changed files with 226 additions and 304 deletions

View File

@@ -1 +1,2 @@
json_key_file("../../../playstore_api_key.json") # Don't Change
json_key_file("../../playstore_api_key.json") # Don't Change
package_name ENV["ANDROID_PACKAGE_NAME"] || "de.anyschool.app.droid" # Don't Change

View File

@@ -13,22 +13,61 @@
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
require 'json'
default_platform(:android)
version_code = 1
playstore_track = "internal"
package_json = JSON.parse(File.read('../../package.json'))
platform :android do
desc "Runs all the tests"
lane :test do
gradle(task: "test")
end
desc "Submit a new Beta Build to Crashlytics Beta"
lane :fetch_version_code do
version_code = google_play_track_version_codes(
package_name: ENV['ANDROID_PACKAGE_NAME'],
track: playstore_track,
json_key: '../../playstore_api_key.json'
).max
end
lane :build do
gradle(
task: "clean assemble",
build_type: "Release",
print_command: false,
properties: {
"android.injected.signing.store.file" => "../../../playstore.keystore",
"android.injected.signing.store.password" => "",
"android.injected.signing.key.alias" => "",
"android.injected.signing.key.password" => "",
"versionCode" => version_code,
"versionName" => package_json['version']
}
)
end
desc "Submit a new beta build to internal testing track"
lane :beta do
gradle(task: "clean assembleRelease")
playstore_track = "internal"
build
upload_to_play_store(
track: playstore_track,
json_key: '../../playstore_api_key.json',
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true
)
end
desc "Deploy a new version to the Google Play"
lane :release do
gradle(task: "clean assembleRelease")
#upload_to_play_store
build
#upload_to_play_store(json_key: '../../playstore_api_key.json', skip_upload_metadata: true, skip_upload_images: true)
end
end

View File

@@ -13,26 +13,61 @@
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
require 'json'
default_platform(:ios)
package_json = JSON.parse(File.read('../../package.json'))
platform :ios do
desc "Push a new release build to the App Store"
lane :release do
lane :configure do
set_info_plist_value(
path: "App/Info.plist",
key: "NSLocationAlwaysAndWhenInUseUsageDescription",
value: ENV['LOCATION_USAGE_DESCRIPTION']
)
update_build_settings(
use_automatic_signing: false,
set_info_plist_value(
path: "App/Info.plist",
key: "NSLocationWhenInUseUsageDescription",
value: ENV['LOCATION_USAGE_DESCRIPTION']
)
set_info_plist_value(
path: "App/Info.plist",
key: "NSCalendarsUsageDescription",
value: ENV['CALENDAR_USAGE_DESCRIPTION']
)
update_url_schemes(
path: "App/Info.plist",
url_schemes: [ENV['APP_URL_SCHEME']]
)
update_code_signing_settings(
use_automatic_signing: true,
path: "App.xcodeproj",
team_id: ENV['TEAM_ID'],
bundle_identifier: ENV['IOS_APP_IDENTIFIER'],
profile_name: ENV['PROVISIONING_PROFILE_NAME'],
bundle_identifier: ENV['IOS_BUNDLE_IDENTIFIER'],
entitlements_file_path: "App/App.entitlements"
)
increment_version_number(
version_number: package_json['version'],
xcodeproj: "App.xcodeproj"
)
end
lane :build do
build_app(workspace: "App.xcworkspace", scheme: "App")
# upload_to_app_store(skip_metadata: true, skip_screenshots: true)
end
lane :release do
configure
build
#upload_to_app_store(skip_metadata: true, skip_screenshots: true)
end
lane :beta do
configure
build
upload_to_testflight(skip_submission: true)
end
end

View File

@@ -1,213 +0,0 @@
require 'xcodeproj'
module Fastlane
module Actions
class UpdateBuildSettingsAction < Action
def self.run(params)
FastlaneCore::PrintTable.print_values(config: params, title: "Summary for code signing settings")
path = params[:path]
path = File.join(File.expand_path(path), "project.pbxproj")
project = Xcodeproj::Project.open(params[:path])
UI.user_error!("Could not find path to project config '#{path}'. Pass the path to your project (not workspace)!") unless File.exist?(path)
UI.message("Updating the Automatic Codesigning flag to #{params[:use_automatic_signing] ? 'enabled' : 'disabled'} for the given project '#{path}'")
unless project.root_object.attributes["TargetAttributes"]
UI.user_error!("Seems to be a very old project file format - please open your project file in a more recent version of Xcode")
return false
end
changed_targets = []
changed_build_configurations = []
project.targets.each do |target|
if params[:targets]
unless params[:targets].include?(target.name)
UI.important("Skipping #{target.name} not selected (#{params[:targets].join(',')})")
next
end
end
target.build_configurations.each do |config|
if params[:build_configurations]
unless params[:build_configurations].include?(config.name)
UI.important("Skipping #{config.name} not selected (#{params[:build_configurations].join(',')})")
next
end
end
style_value = params[:use_automatic_signing] ? 'Automatic' : 'Manual'
set_build_setting(config, "CODE_SIGN_STYLE", style_value)
if params[:team_id]
set_build_setting(config, "DEVELOPMENT_TEAM", params[:team_id])
UI.important("Set Team id to: #{params[:team_id]} for target: #{target.name} for build configuration: #{config.name}")
end
if params[:code_sign_identity]
set_build_setting(config, "CODE_SIGN_IDENTITY", params[:code_sign_identity])
UI.important("Set Code Sign identity to: #{params[:code_sign_identity]} for target: #{target.name} for build configuration: #{config.name}")
end
if params[:profile_name]
set_build_setting(config, "PROVISIONING_PROFILE_SPECIFIER", params[:profile_name])
UI.important("Set Provisioning Profile name to: #{params[:profile_name]} for target: #{target.name} for build configuration: #{config.name}")
end
if params[:entitlements_file_path]
set_build_setting(config, "CODE_SIGN_ENTITLEMENTS", params[:entitlements_file_path])
UI.important("Set Entitlements file path to: #{params[:entitlements_file_path]} for target: #{target.name} for build configuration: #{config.name}")
end
# Since Xcode 8, this is no longer needed, you simply use PROVISIONING_PROFILE_SPECIFIER
if params[:profile_uuid]
set_build_setting(config, "PROVISIONING_PROFILE", params[:profile_uuid])
UI.important("Set Provisioning Profile UUID to: #{params[:profile_uuid]} for target: #{target.name} for build configuration: #{config.name}")
end
if params[:bundle_identifier]
set_build_setting(config, "PRODUCT_BUNDLE_IDENTIFIER", params[:bundle_identifier])
UI.important("Set Bundle identifier to: #{params[:bundle_identifier]} for target: #{target.name} for build configuration: #{config.name}")
end
changed_build_configurations << config.name
end
changed_targets << target.name
end
project.save
if changed_targets.empty?
UI.important("None of the specified targets has been modified")
UI.important("available targets:")
project.targets.each do |target|
UI.important("\t* #{target.name}")
end
else
UI.success("Successfully updated project settings to use Code Sign Style = '#{params[:use_automatic_signing] ? 'Automatic' : 'Manual'}'")
UI.success("Modified Targets:")
changed_targets.each do |target|
UI.success("\t * #{target}")
end
UI.success("Modified Build Configurations:")
changed_build_configurations.each do |name|
UI.success("\t * #{name}")
end
end
params[:use_automatic_signing]
end
def self.set_build_setting(configuration, name, value)
# Iterate over any keys that start with this name
# This will also set keys that have filtering like [sdk=iphoneos*]
keys = configuration.build_settings.keys.select { |key| key.to_s.match(/#{name}.*/) }
keys.each do |key|
configuration.build_settings[key] = value
end
# Explicitly set the key with value if keys don't exist
configuration.build_settings[name] = value
end
def self.description
"Configures Xcode's Codesigning options"
end
def self.details
"Configures Xcode's Codesigning options of all targets in the project"
end
def self.available_options
[
FastlaneCore::ConfigItem.new(key: :path,
env_name: "FL_PROJECT_SIGNING_PROJECT_PATH",
description: "Path to your Xcode project",
code_gen_sensitive: true,
default_value: Dir['*.xcodeproj'].first,
default_value_dynamic: true,
verify_block: proc do |value|
UI.user_error!("Path is invalid") unless File.exist?(File.expand_path(value))
end),
FastlaneCore::ConfigItem.new(key: :use_automatic_signing,
env_name: "FL_PROJECT_USE_AUTOMATIC_SIGNING",
description: "Defines if project should use automatic signing",
type: Boolean,
default_value: false),
FastlaneCore::ConfigItem.new(key: :team_id,
env_name: "FASTLANE_TEAM_ID",
optional: true,
description: "Team ID, is used when upgrading project"),
FastlaneCore::ConfigItem.new(key: :targets,
env_name: "FL_PROJECT_SIGNING_TARGETS",
optional: true,
type: Array,
description: "Specify targets you want to toggle the signing mech. (default to all targets)"),
FastlaneCore::ConfigItem.new(key: :build_configurations,
env_name: "FL_PROJECT_SIGNING_BUILD_CONFIGURATIONS",
optional: true,
type: Array,
description: "Specify build_configurations you want to toggle the signing mech. (default to all configurations)"),
FastlaneCore::ConfigItem.new(key: :code_sign_identity,
env_name: "FL_CODE_SIGN_IDENTITY",
description: "Code signing identity type (iPhone Developer, iPhone Distribution)",
optional: true),
FastlaneCore::ConfigItem.new(key: :entitlements_file_path,
env_name: "FL_CODE_SIGN_ENTITLEMENTS_FILE_PATH",
description: "Path to your entitlements file",
optional: true),
FastlaneCore::ConfigItem.new(key: :profile_name,
env_name: "FL_PROVISIONING_PROFILE_SPECIFIER",
description: "Provisioning profile name to use for code signing",
optional: true),
FastlaneCore::ConfigItem.new(key: :profile_uuid,
env_name: "FL_PROVISIONING_PROFILE",
description: "Provisioning profile UUID to use for code signing",
optional: true),
FastlaneCore::ConfigItem.new(key: :bundle_identifier,
env_name: "FL_APP_IDENTIFIER",
description: "Application Product Bundle Identifier",
optional: true)
]
end
def self.output
end
def self.example_code
[
' # manual code signing
update_code_signing_settings(
use_automatic_signing: false,
path: "demo-project/demo/demo.xcodeproj"
)',
' # automatic code signing
update_code_signing_settings(
use_automatic_signing: true,
path: "demo-project/demo/demo.xcodeproj"
)',
' # more advanced manual code signing
update_code_signing_settings(
use_automatic_signing: true,
path: "demo-project/demo/demo.xcodeproj",
team_id: "QABC123DEV",
bundle_identifier: "com.demoapp.QABC123DEV",
profile_name: "Demo App Deployment Profile",
entitlements_file_path: "Demo App/generated/New.entitlements"
)'
]
end
def self.category
:code_signing
end
def self.return_value
"The current status (boolean) of codesigning after modification"
end
def self.authors
["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55", "abcdev"]
end
def self.is_supported?(platform)
[:ios, :mac].include?(platform)
end
end
end
end

View File

@@ -1,35 +1,37 @@
#!/usr/bin/env sh
DEFAULT_APP_LINK_URL="your.deep.link.host.tld"
APP_LINK_URL="${APP_LINK_URL:-$DEFAULT_APP_LINK_URL}"
. $PWD/app.conf
if [ -n "$(xmlstarlet sel -T -t -v "/manifest/application/activity[intent-filter/@android:autoVerify='true']" app/android/app/src/main/AndroidManifest.xml)" ]; then
echo "Deep link capability already defined in AndroidManifest.xml"
else
echo "Adding deep link capability to AndroidManifest.xml"
xmlstarlet edit -L -s /manifest/application/activity -t elem -n tmpElement -v "" \
-i //tmpElement -t attr -n "android:autoVerify" -v "true" \
-r //tmpElement -v intent-filter \
app/android/app/src/main/AndroidManifest.xml
DEFAULT_APP_URL_SCHEME="de.anyschool.app"
APP_URL_SCHEME="${APP_URL_SCHEME:-$DEFAULT_APP_URL_SCHEME}"
xmlstarlet edit -L -s "/manifest/application/activity/intent-filter[@android:autoVerify='true']" -t elem -n tmpElement -v "" \
-i //tmpElement -t attr -n "android:name" -v "android.intent.action.VIEW" \
-r //tmpElement -v action \
app/android/app/src/main/AndroidManifest.xml
ANDROID_MANIFEST_PATH="app/android/app/src/main/AndroidManifest.xml"
ANDROID_STRINGS_PATH="app/android/app/src/main/res/values/strings.xml"
xmlstarlet edit -L -s "/manifest/application/activity/intent-filter[@android:autoVerify='true']" -t elem -n tmpElement -v "" \
-i //tmpElement -t attr -n "android:name" -v "android.intent.action.DEFAULT" \
-r //tmpElement -v category \
app/android/app/src/main/AndroidManifest.xml
xmlstarlet edit -L -s "/manifest/application/activity/intent-filter[@android:autoVerify='true']" -t elem -n tmpElement -v "" \
-i //tmpElement -t attr -n "android:name" -v "android.intent.action.BROWSABLE" \
-r //tmpElement -v category \
app/android/app/src/main/AndroidManifest.xml
git -C app checkout -- android/build.gradle
git -C app checkout -- android/app/src/main/AndroidManifest.xml
xmlstarlet edit -L -s "/manifest/application/activity/intent-filter[@android:autoVerify='true']" -t elem -n tmpElement -v "" \
-i //tmpElement -t attr -n "android:scheme" -v "https" \
-i //tmpElement -t attr -n "android:host" -v "$APP_LINK_URL" \
-r //tmpElement -v data \
app/android/app/src/main/AndroidManifest.xml
fi
# AndroidManifest.xml
xmlstarlet edit --pf --inplace \
--update "/manifest/@package" --value "$ANDROID_PACKAGE_NAME" \
$ANDROID_MANIFEST_PATH
xmlstarlet edit --pf --inplace \
--update "/manifest/application/activity/@android:name" --value "$ANDROID_PACKAGE_NAME".MainActivity \
$ANDROID_MANIFEST_PATH
# strings.xml
xmlstarlet edit --pf --inplace \
--update "/resources/string[@name='package_name']" --value "$ANDROID_PACKAGE_NAME" \
$ANDROID_STRINGS_PATH
xmlstarlet edit --pf --inplace \
--update "/resources/string[@name='custom_url_scheme']" --value "$APP_URL_SCHEME" \
$ANDROID_STRINGS_PATH
xmlstarlet edit --inplace \
--delete "/resources/string[@name='app_host']" \
--append "/resources/string[@name='custom_url_scheme']" --type elem -n string --value "$APP_LINK_HOST" \
--insert "/resources/string[not(@name)]" --type attr -n name --value "app_host" \
$ANDROID_STRINGS_PATH

View File

@@ -1,17 +1,37 @@
#!/usr/bin/env sh
DEFAULT_APP_NAME="Open StApps"
DEFAULT_APP_DISPLAY_NAME="StApps"
DEFAULT_APP_ID="de.any_school.app"
. $PWD/app.conf
DEFAULT_APP_ID="de.anyschool.app"
DEFAULT_CONFIG_MODE="WEB"
APP_NAME="${APP_NAME:-$DEFAULT_APP_NAME}"
APP_DISPLAY_NAME="${APP_DISPLAY_NAME:-$DEFAULT_APP_DISPLAY_NAME}"
APP_ID="${APP_ID:-$DEFAULT_APP_ID}"
APP_VERSION=$(jq '.version' app/package.json)
CONFIG_MODE="${CONFIG_MODE:-$DEFAULT_CONFIG_MODE}"
if [ "$CONFIG_MODE" = 'ANDROID' ]; then
APP_ID="$ANDROID_PACKAGE_NAME"
fi
if [ "$CONFIG_MODE" = 'IOS' ]; then
APP_ID="$IOS_BUNDLE_IDENTIFIER"
fi
# ionic config
cat app/ionic.config.json | jq '.name = $newName' --arg newName "$APP_NAME" > tmp.$$.json && mv tmp.$$.json app/ionic.config.json
sed -i -e 's@<title>StApps<\/title>@<title>'"$APP_DISPLAY_NAME"'<\/title>@g' app/src/index.html
ROOT_THEME_DEFINITONS=$(cat app/src/theme/variables.scss | grep -o :root | wc -l)
if [ $ROOT_THEME_DEFINITONS -gt 1 ]; then
#update
echo "SCSS theme has already been set"
else
#insert
cat customizable/theme/variables.scss >> app/src/theme/variables.scss
fi
# capacitor config
awk "/appName:.*,/ && !done { gsub(/appName:.*,/, \"appName: '$APP_NAME',\"); done=1}; 1" app/capacitor.config.ts > tmp.$$.json && mv tmp.$$.json app/capacitor.config.ts
@@ -22,7 +42,9 @@ xmlstarlet edit -L --update "/widget/@id" --value "$APP_ID" app/config.xml
xmlstarlet edit -L --update "/widget/@version" --value "$APP_VERSION" app/config.xml
xmlstarlet edit -L -N x="http://www.w3.org/ns/widgets" --update "//x:name" --value "$APP_NAME" app/config.xml
if [ -n $(xmlstarlet sel -N x="http://www.w3.org/ns/widgets" -T -t -v "//x:name[@short]" app/config.xml) ]; then
SHORT_EXISTS=$(xmlstarlet sel -N x='http://www.w3.org/ns/widgets' -T -t -v '//x:name[@short]' app/config.xml)
if [ -z "${SHORT_EXISTS:-}" ]; then
#insert
xmlstarlet edit -L -N x="http://www.w3.org/ns/widgets" -s "//x:name" -t attr -n "short" -v "$APP_DISPLAY_NAME" app/config.xml
else
@@ -31,5 +53,7 @@ else
fi
# environment config
awk "/backend_url:.*,/ && !done { gsub(/backend_url:.*,/, \"backend_url: '$BACKEND_URL',\"); done=1}; 1" app/src/environments/environment.prod.ts > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.t
awk "/backend_version:.*,/ && !done { gsub(/backend_version:.*,/, \"backend_version: '$BACKEND_VERSION',\"); done=1}; 1" app/src/environments/environment.prod.t > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.t
awk "/backend_url:.*,/ && !done { gsub(/backend_url:.*,/, \"backend_url: '$BACKEND_URL',\"); done=1}; 1" app/src/environments/environment.prod.ts > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.ts
awk "/backend_version:.*,/ && !done { gsub(/backend_version:.*,/, \"backend_version: '$BACKEND_VERSION',\"); done=1}; 1" app/src/environments/environment.prod.ts > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.ts
awk "/app_host:.*,/ && !done { gsub(/app_host:.*,/, \"app_host: '$APP_LINK_HOST',\"); done=1}; 1" app/src/environments/environment.prod.ts > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.ts
awk "/custom_url_scheme:.*,/ && !done { gsub(/custom_url_scheme:.*,/, \"custom_url_scheme: '$APP_URL_SCHEME',\"); done=1}; 1" app/src/environments/environment.prod.ts > tmp.$$.json && mv tmp.$$.json app/src/environments/environment.prod.ts

View File

@@ -1,9 +1,17 @@
#!/usr/bin/env sh
DEFAULT_APP_LINK_URL="your.deep.link.host.tld"
APP_LINK_URL="${APP_LINK_URL:-$DEFAULT_APP_LINK_URL}"
ENTITLEMENTS_FILE="app/ios/App/App/App.entitlements"
. $PWD/app.conf
/usr/libexec/PlistBuddy -c "Delete :com.apple.developer.associated-domains string $APP_LINK_URL" $ENTITLEMENTS_FILE
ENTITLEMENTS_FILE="app/ios/App/App/App.entitlements"
INFOPLIST_FILE="app/ios/App/App/Info.plist"
/usr/libexec/PlistBuddy -c "Delete :com.apple.developer.associated-domains string applinks:$APP_LINK_HOST" $ENTITLEMENTS_FILE
/usr/libexec/PlistBuddy -c "Add :com.apple.developer.associated-domains array" $ENTITLEMENTS_FILE
/usr/libexec/PlistBuddy -c "Add :com.apple.developer.associated-domains:0 string $APP_LINK_URL" $ENTITLEMENTS_FILE
/usr/libexec/PlistBuddy -c "Add :com.apple.developer.associated-domains:0 string applinks:$APP_LINK_HOST" $ENTITLEMENTS_FILE
/usr/libexec/PlistBuddy -c "Delete :BGTaskSchedulerPermittedIdentifiers string com.transistorsoft.fetch" $INFOPLIST_FILE
/usr/libexec/PlistBuddy -c "Add :BGTaskSchedulerPermittedIdentifiers array" $INFOPLIST_FILE
/usr/libexec/PlistBuddy -c "Add :BGTaskSchedulerPermittedIdentifiers:0 string com.transistorsoft.fetch" $INFOPLIST_FILE
git -C app checkout -- ios/App/App/AppDelegate.swift