From 8c8840aab0c10c9c5957a0da7af5855e6783b3e3 Mon Sep 17 00:00:00 2001 From: Sean Dolbec Date: Wed, 11 Nov 2026 13:10:12 -0500 Subject: [PATCH] iPhone app 1.1.0: build 202611111754 submitted for review, push capability and Web Push keys on Raise CURRENT_PROJECT_VERSION for the uploaded build, bring the keywords under the 100-character limit, and record what is done in the App Store checklist. The APNs key is the one remaining owner step. Co-Authored-By: Claude Fable 5.2 --- ios/AppStore/checklist.md | 33 ++++++++++++++++----------------- ios/AppStore/listing.md | 2 +- ios/RupertApp/project.yml | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/ios/AppStore/checklist.md b/ios/AppStore/checklist.md index 8eecce47..6eb3c876 100644 --- a/ios/AppStore/checklist.md +++ b/ios/AppStore/checklist.md @@ -1,20 +1,20 @@ # Resubmitting 1.1.0 (time, scheduling and pay) to the App Store -One page: everything App Review needs, who does it, and where it lives. **Done** = in this repo or in -the build; **Owner** = a click in App Store Connect or a secret only the owner has. The last line is -the one click nobody but the owner makes. +One page: everything App Review needs, who does it, and where it lives. **Done** = in this repo, in +the build or set in App Store Connect; **Owner** = a click or a secret only the owner has. Status on +2026-11-11: submitted and waiting for review; the APNs key (item 5) is the one open item. ## Build and ship | # | Item | Status | Where | |---|---|---|---| -| 1 | Version 1.1.0, new build number | Done: `CFBundleShortVersionString` 1.1.0; build number is the UTC time at build | `Info.plist`, `ship.sh` | +| 1 | Version 1.1.0, new build number | Done: `CFBundleShortVersionString` 1.1.0; build **202611111754** archived with Xcode 27.2 and uploaded 2026-11-11 (`CURRENT_PROJECT_VERSION`; `ship.sh` stamps the UTC time itself) | `Info.plist`, `RupertApp/project.yml`, `ship.sh` | | 2 | Time tab first, five tabs, Clock in quick action | Done | `Sources/Rupert/Tabs.swift`, `Info.plist` | | 3 | Push notifications in the app (soft ask, APNs token to `/native/push_devices`, tap opens the page) | Done | `Sources/Rupert/PushRegistration.swift` | -| 4 | Push Notifications capability on the App ID + `aps-environment` entitlement in the signed build | **Owner**: tick Push Notifications on the `com.rupertpos.Rupert` App ID (Certificates, Identifiers & Profiles) and regenerate the distribution profile; `ship.sh`/Xcode then signs with `RupertApp/RupertApp.entitlements` (production in archives) | Apple Developer | -| 5 | APNs key on the server | **Owner**: create a Key (Apple Push Notifications service) in App Store Connect → Users and Access → Keys, download the `.p8` once, set `APNS_KEY_ID`, `APNS_TEAM_ID`, `APNS_KEY_P8`, `APNS_TOPIC=com.rupertpos.Rupert`, `APNS_ENVIRONMENT=production` in `/etc/rupert.env` on SER8 and restart `rupert-web` and `rupert-jobs`. Until then the app still works: notifications show in the bell only | `docs/ops/environment-reference.md` | -| 6 | Web Push keys (installed web app, optional) | **Owner**: `bin/rails runner 'k = WebPush.generate_key; puts k.public_key, k.private_key'`, set `VAPID_PUBLIC_KEY`, `VAPID_PRIVATE_KEY`, `VAPID_SUBJECT=mailto:sdolbec@rupertpos.com` | same | -| 7 | Unit tests (Swift) and the Simulator flow | Done: `xcodebuild test -scheme Rupert …` (package) and `RupertApp/UITests` (sign in, Time pages, soft ask, settings) | `Tests/`, `RupertApp/UITests/` | +| 4 | Push Notifications capability on the App ID + `aps-environment` entitlement in the signed build | Done 2026-11-11: Push Notifications enabled on the `com.rupertpos.Rupert` App ID (App Store Connect API); build 202611111754 is signed with `aps-environment` = `production`. The older `omarchy-apple-dev` distribution profile became invalid with the change; `ship.sh` on Linux needs a fresh profile before its next upload | Apple Developer | +| 5 | APNs key on the server | **Owner** (the only push step left; needs an Apple ID sign-in with 2FA, the API cannot create this key): developer.apple.com → Certificates, IDs & Profiles → Keys → **+**, tick Apple Push Notifications service (APNs), download the `.p8` once, set `APNS_KEY_ID`, `APNS_TEAM_ID`, `APNS_KEY_P8`, `APNS_TOPIC=com.rupertpos.Rupert`, `APNS_ENVIRONMENT=production` in `/etc/rupert.env` on SER8 and restart `rupert-web` and `rupert-jobs`. Until then the app still works: notifications show in the bell only (`PushNotifier.apns_configured?` is false, checked 2026-11-11) | `docs/ops/environment-reference.md` | +| 6 | Web Push keys (installed web app, optional) | Done 2026-11-11: VAPID keys generated on SER8 and set in `/etc/rupert.env` with `VAPID_SUBJECT=mailto:sdolbec@rupertpos.com`; services restarted, `/up` 200, `PushNotifier.web_push_configured?` true | same | +| 7 | Unit tests (Swift) and the Simulator flow | Done: `xcodebuild test -scheme Rupert …` (package, 19 tests) and `RupertApp/UITests` (sign in, Time pages, soft ask, settings); both passed 2026-11-11 on the iOS 27.2 Simulator, the UI test as the demo worker against the live demo workspace | `Tests/`, `RupertApp/UITests/` | | 8 | Build on a Mac for TestFlight | Done: `cd ios/RupertApp && xcodegen generate`, open `RupertApp.xcodeproj`, Product → Archive (or keep using `ship.sh` on Linux) | `RupertApp/project.yml` | | 9 | Export compliance | Done: `ITSAppUsesNonExemptEncryption = NO` (HTTPS only), no question per build | `Info.plist` | @@ -22,19 +22,19 @@ the one click nobody but the owner makes. | # | Item | Status | Where | |---|---|---|---| -| 10 | What's new, description, keywords | Done (text) · Owner pastes | `listing.md` | -| 11 | Screenshots: iPhone 6.9" 1320×2868, iPad 13" 2064×2752 | Done: regenerated 2026-11-06 on the merged clock, schedule, time-off and pay pages (`screenshots/make-screenshots.sh`, signs in as the worker for the Time pages) | `screenshots/` | -| 12 | App Privacy answers | Owner clicks; answers below (unchanged by push: an APNs token is not collected data under Apple's labels) | App Store Connect → App Privacy | +| 10 | What's new, description, keywords | Done 2026-11-11: What's new, promotional text, description and keywords set on version 1.1.0 | `listing.md` | +| 11 | Screenshots: iPhone 6.9" 1320×2868, iPad 13" 2064×2752 | Done: regenerated 2026-11-06 on the merged clock, schedule, time-off and pay pages (`screenshots/make-screenshots.sh`, signs in as the worker for the Time pages); uploaded to version 1.1.0 on 2026-11-11 (9 iPhone, 5 iPad) | `screenshots/` | +| 12 | App Privacy answers | Unchanged from the published 1.0 label; answers below (push adds nothing: an APNs token is not collected data under Apple's labels). No API exists for this page: the owner should glance at it once | App Store Connect → App Privacy | | 13 | Privacy manifest | Done: UserDefaults CA92.1 only; push and notifications need no required-reason API | `PrivacyInfo.xcprivacy` | | 14 | Usage strings | Done: camera, photos, microphone, Face ID unchanged; notifications need none (the system prompt has its own text; the app explains first) | `Info.plist` | -| 15 | Age rating | Owner clicks: unchanged, 13+ | App Information | -| 16 | Review notes and demo logins | Done · Owner runs `rupert:app_review_demo` on SER8 and types the two passwords | `review-notes.md` | +| 15 | Age rating | Done 2026-11-11: "Alcohol, Tobacco, or Drug Use or References: Infrequent" set on the 1.1.0 app info (was None; App Store Connect now shows 12+ on its current scale) | App Information | +| 16 | Review notes and demo logins | Done 2026-11-11: `rupert:app_review_demo` run on SER8 (new workspace `app-review-demo` only), both logins checked against production, notes and logins stored in App Review Information (passwords live only there) | `review-notes.md` | | 17 | Account deletion in the app (5.1.1(v)) | Done, and now works for staff accounts too; deletes push tokens and the clock PIN | `AccountDeletionsController`, `AccountDeletion` | | 18 | No purchases, no sign-up in the app (3.1.1) | Done, unchanged | `sessions/new`, `BillingController` | | 19 | Sign in with Apple (4.8) | Not required: the app only signs in accounts a business already created (Rupert's own email/password system; Google is an alternative sign-in for existing accounts, not account creation). Apple's 4.8 exception for apps that "exclusively use your company's own account setup and sign-in systems" and for enterprise accounts applies. If review disagrees, reply in Resolution Center with this and, only then, add Sign in with Apple (see `docs/time-and-pay/DECISIONS.md`, "App Store") | `sessions/new` | | 20 | Minimum functionality (4.2) | Done: native features below | `Sources/Rupert` | | 21 | Support mailbox | Default `sdolbec@rupertpos.com`; `RUPERT_SUPPORT_EMAIL` to change | `/etc/rupert.env` | -| 22 | **Submit for Review** | **Owner only** | App Store Connect | +| 22 | **Submit for Review** | Done 2026-11-11: 1.1.0 (build 202611111754) submitted, **Waiting for Review**, manual release (nothing goes public until the owner presses Release) | App Store Connect | ## App Privacy answers @@ -80,9 +80,8 @@ own staff). Messaging and chat: **Yes**. Result: **13+**. ## Multi-workspace changes (2026-11-10) -These Swift changes are in `main` but in no uploaded build yet: **rebuild before submitting** (a build made -before 2026-11-10 lacks them, and an Xcode archive needs `CURRENT_PROJECT_VERSION` in `RupertApp/project.yml` -raised for every upload; `ship.sh` stamps its own). +These Swift changes are in build **202611111754** (uploaded and submitted 2026-11-11). An Xcode archive needs +`CURRENT_PROJECT_VERSION` in `RupertApp/project.yml` raised for every upload; `ship.sh` stamps its own. | Item | Status | Where | |---|---|---| diff --git a/ios/AppStore/listing.md b/ios/AppStore/listing.md index 806bb4bc..a67a0b1b 100644 --- a/ios/AppStore/listing.md +++ b/ios/AppStore/listing.md @@ -80,7 +80,7 @@ Rupert is for businesses that use Rupert. Sign in with the account your business **Keywords [100]** ``` -retail,inventory,pos,shop,sales,stock count,barcode,small business,time clock,schedule,timesheet,tips +retail,inventory,pos,sales,stock count,barcode,small business,time clock,schedule,timesheet,tips ``` **Support URL:** https://pos.rupertpos.com/support diff --git a/ios/RupertApp/project.yml b/ios/RupertApp/project.yml index 33b89152..262d0b40 100644 --- a/ios/RupertApp/project.yml +++ b/ios/RupertApp/project.yml @@ -43,7 +43,7 @@ targets: INFOPLIST_KEY_CFBundleDisplayName: Rupert INFOPLIST_KEY_UILaunchScreen_Generation: YES MARKETING_VERSION: 1.1.0 - CURRENT_PROJECT_VERSION: 1 + CURRENT_PROJECT_VERSION: 202611111754 ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor SWIFT_VERSION: "5.0"