diff --git a/.gitignore b/.gitignore index 4d9e4b52..f100695a 100644 --- a/.gitignore +++ b/.gitignore @@ -53,5 +53,4 @@ build_logs/ android/app/src/main/assets/public android/app/src/main/res -android/.gradle/buildOutputCleanup/buildOutputCleanup.lock -android/.gradle/file-system.probe + diff --git a/BUILDING.md b/BUILDING.md index ad7b1d41..b7a02db0 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -337,6 +337,8 @@ Prerequisites: macOS with Xcode installed npx cap sync ios ``` + - If that fails with "Could not find..." then look at the "gem_path" instructions above. + 3. Copy the assets: ```bash @@ -344,20 +346,38 @@ Prerequisites: macOS with Xcode installed npx capacitor-assets generate --ios ``` -3. Open the project in Xcode: +4. Bump the version to match Android + + ``` + cd ios/App + xcrun agvtool new-version 15 + # Unfortunately this edits Info.plist directly. + #xcrun agvtool new-marketing-version 0.4.5 + cat App.xcodeproj/project.pbxproj | sed "s/MARKETING_VERSION = .*;/MARKETING_VERSION = 0.4.5;/g" > temp + mv temp App.xcodeproj/project.pbxproj + cd - + ``` + +5. Open the project in Xcode: ```bash npx cap open ios ``` -4. Use Xcode to build and run on simulator or device. +6. Use Xcode to build and run on simulator or device. -5. Release +7. Release * Under "General" renamed a bunch of things to "Time Safari" - * Choose Product -> Destination -> Any iOS - * Choose Product -> Archive (which will trigger a build and take time, and "login" keychain password is machine user login, repeatedly) - * Click Distribute + * Choose Product -> Destination -> Build Any iOS + * Choose Product -> Archive + * This will trigger a build and take time, needing user's "login" keychain password which is just their login password, repeatedly. + * If it fails with `building for 'iOS', but linking in dylib (.../.pkgx/zlib.net/v1.3.0/lib/libz.1.3.dylib) built for 'macOS'` then run XCode outside that terminal (ie. not with `npx cap open ios`). + * Click Distribute -> App Store Connect + * In AppStoreConnect, add the build to the distribution: remove the current build with the "-" when you hover over it, then "Add Build" with the new build. + * It can take 15 minutes for the build to show up in the list of builds. + * You'll probably have to "Manage" something about encryption, disallowed in France. + * Then "Save" and "Add to Review" and "Resubmit to App Review". #### First-time iOS Configuration @@ -393,13 +413,15 @@ Prerequisites: Android Studio with SDK installed npx capacitor-assets generate --android ``` -4. Open the project in Android Studio: +4. Bump version to match iOS, in android/app/build.gradleq + +5. Open the project in Android Studio: ```bash npx cap open android ``` -5. Use Android Studio to build and run on emulator or device. +6. Use Android Studio to build and run on emulator or device. ## Android Build from the console @@ -429,6 +451,12 @@ Prerequisites: Android Studio with SDK installed ... and find your `aab` file at app/build/outputs/bundle/release +At play.google.com/console: + +- Create new release, upload, hit Next. + +- Save & send changes for review. + ## First-time Android Configuration for deep links diff --git a/README.md b/README.md index 9f3f2bd1..f8d6ca21 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ See [TESTING.md](test-playwright/TESTING.md) for detailed test instructions. ## Icons -To add an icon, add to main.ts and reference with `fa` element and `icon` attribute with the hyphenated name. +Application icons are in the `assets` directory, processed by the `capacitor-assets` command. + +To add a Font Awesome icon, add to main.ts and reference with `font-awesome` element and `icon` attribute with the hyphenated name. ## Other diff --git a/android/.gitignore b/android/.gitignore index acab7f87..680ed864 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -1,5 +1,17 @@ # Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore +app/build/* +!app/build/.npmkeep + +# Copied web assets +app/src/main/assets/public + +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml + +# secrets app/gradle.properties.secrets app/time-safari-upload-key-pkcs12.jks @@ -94,11 +106,3 @@ lint/tmp/ # Cordova plugins for Capacitor capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/android/.gradle/buildOutputCleanup/cache.properties b/android/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 55624b6e..00000000 --- a/android/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Apr 09 09:01:13 UTC 2025 -gradle.version=8.11.1 diff --git a/android/.gradle/file-system.probe b/android/.gradle/file-system.probe deleted file mode 100644 index 21f85321..00000000 Binary files a/android/.gradle/file-system.probe and /dev/null differ diff --git a/android/.gradle/vcs-1/gc.properties b/android/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.gitignore b/android/app/.gitignore deleted file mode 100644 index 043df802..00000000 --- a/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 00000000..b9272ff0 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,2 @@ + +Application icons are here. They are processed for android & ios by the `capacitor-assets` command, as indicated in the BUILDING.md file. diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 848ad8dc..9b78b67e 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -122,8 +122,8 @@ 504EC2FC1FED79650016851F /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; + LastSwiftUpdateCheck = 920; + LastUpgradeCheck = 920; TargetAttributes = { 504EC3031FED79650016851F = { CreatedOnToolsVersion = 9.2; @@ -348,18 +348,19 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 7XVXYPEQYJ; + CURRENT_PROJECT_VERSION = 17; + DEVELOPMENT_TEAM = GM3FS5JQPH; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.4.6; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = com.brownspank.timesafari; + PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; /* allows agvtool to set *_VERSION settings */ }; name = Debug; }; @@ -369,17 +370,18 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 7XVXYPEQYJ; + CURRENT_PROJECT_VERSION = 17; + DEVELOPMENT_TEAM = GM3FS5JQPH; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.brownspank.timesafari; + MARKETING_VERSION = 0.4.6; + PRODUCT_BUNDLE_IDENTIFIER = app.timesafari; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; /* allows agvtool to set *_VERSION settings */ }; name = Release; }; diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png index adf6ba01..f5aba734 100644 Binary files a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json index 9b7d382d..b1a84833 100644 --- a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,14 +1,14 @@ { - "images" : [ + "images": [ { - "filename" : "AppIcon-512@2x.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" + "idiom": "universal", + "size": "1024x1024", + "filename": "AppIcon-512@2x.png", + "platform": "ios" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 } -} +} \ No newline at end of file diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist index 08c0cee2..b0b1f21a 100644 --- a/ios/App/App/Info.plist +++ b/ios/App/App/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - TimeSafari + TimeSafari CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -22,6 +22,10 @@ $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS + NSCameraUsageDescription + Time Safari allows you to take photos, and also scan QR codes from contacts. + NSPhotoLibraryUsageDescription + Time Safari allows you to upload photos. UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -45,9 +49,5 @@ UIViewControllerBasedStatusBarAppearance - NSCameraUsageDescription - This app uses the camera to scan QR codes and capture photos. - NSPhotoLibraryUsageDescription - This app needs access to your photo library to save and select photos. diff --git a/package-lock.json b/package-lock.json index 1ad0b837..fce02999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "0.4.4", + "version": "0.4.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "0.4.4", + "version": "0.4.6", "dependencies": { "@capacitor-mlkit/barcode-scanning": "^6.0.0", "@capacitor/android": "^6.2.0", diff --git a/package.json b/package.json index 57cad6d1..b73c0967 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "timesafari", - "version": "0.4.4", + "version": "0.4.6", "description": "Time Safari Application", "author": { "name": "Time Safari Team" diff --git a/pkgx.yaml b/pkgx.yaml index 48f895b8..08559bf2 100644 --- a/pkgx.yaml +++ b/pkgx.yaml @@ -1,5 +1,6 @@ dependencies: - gradle - java + - pod # other dependencies are discovered via package.json & requirements.txt & Gemfile (I'm guessing). diff --git a/test-playwright/test-playwright/test-results/.last-run.json b/test-playwright/test-playwright/test-results/.last-run.json deleted file mode 100644 index 5fca3f84..00000000 --- a/test-playwright/test-playwright/test-results/.last-run.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "status": "failed", - "failedTests": [] -} \ No newline at end of file diff --git a/test-playwright/test-results/.last-run.json b/test-playwright/test-results/.last-run.json deleted file mode 100644 index e0f4d0b3..00000000 --- a/test-playwright/test-results/.last-run.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "status": "failed", - "failedTests": [ - "a29eb57667e0fb28c7e9-7a80e551e7f16a766d0d", - "a29eb57667e0fb28c7e9-1a8c76601bb6ea4f735c", - "a29eb57667e0fb28c7e9-0a3670fa77fcd5ac9827", - "a29eb57667e0fb28c7e9-90c8866cf70c7f96647d", - "a29eb57667e0fb28c7e9-4abc584edcf7a6a12389", - "a29eb57667e0fb28c7e9-3b443656a23fd8e7eb76", - "a29eb57667e0fb28c7e9-1f63cf7a41b756ffe01f", - "a29eb57667e0fb28c7e9-4eb03633761e58eac0a4", - "db48a48c514e3e2940e5-cef25040a0b285eed2ba", - "1c818805c9b0ac973736-726f18ba6163d57238c8", - "c52ae54d86eda05904f3-adf7525a07e75f4e3cc2", - "2fac21b9c9c3eb062631-9d2d2e9a199603c11b9b", - "64242279fe0133650483-20fbacc4e45c5561df6c", - "a7ff64a290be94f9d82c-e26ceb13031dafad1133", - "868977083268005e6ec0-c27d226d34e20ba4863d", - "5e149db5da4a5e319bcc-3298c84d0ebfff5e6d7c", - "5e149db5da4a5e319bcc-1981ba81641b6000f80b", - "2b5f6d3352de2040032d-bf5ed3a9483d90c396dd", - "2b5f6d3352de2040032d-6f52c3699c55c19ccad8", - "2b5f6d3352de2040032d-0f478a3208f64651daa1", - "2b5f6d3352de2040032d-a05f542cad739ee3b5b9", - "955bdfdfe05b442c0f5d-a9ec2b8bc7bd90ea0439", - "955bdfdfe05b442c0f5d-2c38171f673436923a8b", - "1a1fd29d3f0573e705e6-a3a6805908fe9a29ab11" - ] -} \ No newline at end of file