@@ -0,0 +1,81 @@ |
||
| 1 |
+# Platform Decision: iOS 15 |
|
| 2 |
+ |
|
| 3 |
+Date: 2026-03-22 |
|
| 4 |
+ |
|
| 5 |
+## Decision |
|
| 6 |
+ |
|
| 7 |
+Minimum deployment target for the app becomes `iOS 15`. |
|
| 8 |
+ |
|
| 9 |
+This is the last iOS version supported by `iPhone 6s`, which remains a valid target device for this product: |
|
| 10 |
+ |
|
| 11 |
+- BLE communication is fully capable on this hardware. |
|
| 12 |
+- Live data acquisition, diagnostics, and logging are within its capabilities. |
|
| 13 |
+- Local history and long-term battery tracking are also realistic for the product goals. |
|
| 14 |
+ |
|
| 15 |
+## Product Goals |
|
| 16 |
+ |
|
| 17 |
+The application is intended to support: |
|
| 18 |
+ |
|
| 19 |
+- live data collection for device diagnostics |
|
| 20 |
+- real battery capacity measurement using USB meters |
|
| 21 |
+- long-term degradation tracking through historical data |
|
| 22 |
+- efficiency analysis for charging chains |
|
| 23 |
+- charger efficiency analysis |
|
| 24 |
+ |
|
| 25 |
+## Why We Are Leaving iOS 13 |
|
| 26 |
+ |
|
| 27 |
+`iOS 13` is too old for the current development direction: |
|
| 28 |
+ |
|
| 29 |
+- first-generation SwiftUI requires more workarounds and compatibility code |
|
| 30 |
+- maintenance and testing cost is higher |
|
| 31 |
+- newer Xcode / App Store tooling trends are centered around more recent deployment targets |
|
| 32 |
+ |
|
| 33 |
+Moving to `iOS 15` reduces risk without dropping `iPhone 6s`. |
|
| 34 |
+ |
|
| 35 |
+## Why We Are Not Moving to iOS 16 Yet |
|
| 36 |
+ |
|
| 37 |
+`iOS 16` would unlock APIs such as `NavigationStack` and `Swift Charts`, but it would also exclude `iPhone 6s`. |
|
| 38 |
+ |
|
| 39 |
+At this stage, preserving `iPhone 6s` support is considered more valuable than gaining those APIs. |
|
| 40 |
+ |
|
| 41 |
+## Charts Decision |
|
| 42 |
+ |
|
| 43 |
+Current conclusion: |
|
| 44 |
+ |
|
| 45 |
+- keep the in-house chart solution for live charts |
|
| 46 |
+- do not adopt `Swift Charts` for the live measurement view |
|
| 47 |
+- reconsider `Swift Charts` later only for historical reports and analysis screens |
|
| 48 |
+ |
|
| 49 |
+Reasoning: |
|
| 50 |
+ |
|
| 51 |
+- `Swift Charts` looks strong for reports and final analysis |
|
| 52 |
+- it does not appear ideal for high-frequency live updates |
|
| 53 |
+- zoom and pan would still require custom work |
|
| 54 |
+- the current in-house renderer gives better control for instrument-style live views |
|
| 55 |
+ |
|
| 56 |
+## Device Coverage Notes |
|
| 57 |
+ |
|
| 58 |
+Choosing `iOS 15` preserves `iPhone 6s` support. |
|
| 59 |
+ |
|
| 60 |
+There are also older iPads that remain on `iPadOS 15`. Apple security release notes for January 26, 2026 still list devices such as: |
|
| 61 |
+ |
|
| 62 |
+- `iPad Air 2` |
|
| 63 |
+- `iPad mini 4` |
|
| 64 |
+ |
|
| 65 |
+So this platform decision likely preserves some older iPad coverage as well. |
|
| 66 |
+ |
|
| 67 |
+## Revisit Trigger |
|
| 68 |
+ |
|
| 69 |
+We should revisit the minimum deployment target when one of the following becomes important: |
|
| 70 |
+ |
|
| 71 |
+- a strong need for `Swift Charts` |
|
| 72 |
+- a move toward `SwiftData` / more modern SwiftUI app architecture |
|
| 73 |
+- loss of business value in keeping `iPhone 6s` support |
|
| 74 |
+- support or distribution constraints imposed by newer Xcode / App Store requirements |
|
| 75 |
+ |
|
| 76 |
+## References |
|
| 77 |
+ |
|
| 78 |
+- Apple Xcode system requirements: https://developer.apple.com/xcode/system-requirements/ |
|
| 79 |
+- Apple upcoming App Store requirements: https://developer.apple.com/news/upcoming-requirements/ |
|
| 80 |
+- Apple App Store platform usage: https://developer.apple.com/support/app-store/ |
|
| 81 |
+- Apple security releases: https://support.apple.com/en-lamr/100100 |
|
@@ -53,6 +53,7 @@ |
||
| 53 | 53 |
/* End PBXBuildFile section */ |
| 54 | 54 |
|
| 55 | 55 |
/* Begin PBXFileReference section */ |
| 56 |
+ 1C6B6B8A2A2D4F5100A0B001 /* Platform Decision - iOS 15.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "Platform Decision - iOS 15.md"; sourceTree = "<group>"; };
|
|
| 56 | 57 |
4308CF8524176CAB0002E80B /* DataGroupRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataGroupRowView.swift; sourceTree = "<group>"; };
|
| 57 | 58 |
4308CF872417770D0002E80B /* DataGroupsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataGroupsView.swift; sourceTree = "<group>"; };
|
| 58 | 59 |
430CB4FB245E07EB006525C2 /* ChevronView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChevronView.swift; sourceTree = "<group>"; };
|
@@ -182,6 +183,7 @@ |
||
| 182 | 183 |
43CBF653240BF3EB00255B8B = {
|
| 183 | 184 |
isa = PBXGroup; |
| 184 | 185 |
children = ( |
| 186 |
+ 1C6B6B8A2A2D4F5100A0B001 /* Platform Decision - iOS 15.md */, |
|
| 185 | 187 |
437AEE1424249AAA0025C373 /* Readme.rtf */, |
| 186 | 188 |
43CBF65E240BF3EB00255B8B /* USB Meter */, |
| 187 | 189 |
43CBF65D240BF3EB00255B8B /* Products */, |
@@ -451,7 +453,7 @@ |
||
| 451 | 453 |
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
| 452 | 454 |
GCC_WARN_UNUSED_FUNCTION = YES; |
| 453 | 455 |
GCC_WARN_UNUSED_VARIABLE = YES; |
| 454 |
- IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|
| 456 |
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0; |
|
| 455 | 457 |
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; |
| 456 | 458 |
MTL_FAST_MATH = YES; |
| 457 | 459 |
ONLY_ACTIVE_ARCH = YES; |
@@ -506,7 +508,7 @@ |
||
| 506 | 508 |
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
| 507 | 509 |
GCC_WARN_UNUSED_FUNCTION = YES; |
| 508 | 510 |
GCC_WARN_UNUSED_VARIABLE = YES; |
| 509 |
- IPHONEOS_DEPLOYMENT_TARGET = 13.0; |
|
| 511 |
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0; |
|
| 510 | 512 |
MTL_ENABLE_DEBUG_INFO = NO; |
| 511 | 513 |
MTL_FAST_MATH = YES; |
| 512 | 514 |
SDKROOT = iphoneos; |