Showing 2 changed files with 85 additions and 2 deletions
+81 -0
Platform Decision - iOS 15.md
@@ -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
+4 -2
USB Meter.xcodeproj/project.pbxproj
@@ -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;