Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 16 additions & 17 deletions ios/AppStore/checklist.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
# 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` |

## Listing and privacy

| # | 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

Expand Down Expand Up @@ -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 |
|---|---|---|
Expand Down
2 changes: 1 addition & 1 deletion ios/AppStore/listing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion ios/RupertApp/project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading