Skip to content

Commit a1aeeea

Browse files
authored
Merge pull request #10 from easydev991/develop
Доработки 1.5
2 parents 535a62a + 0417b0e commit a1aeeea

File tree

46 files changed

+482
-103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+482
-103
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ SwiftUI-Days.xcodeproj/project.xcworkspace/xcuserdata/oleg991.xcuserdatad/UserIn
77
fastlane/.env
88
*.ipa
99
*.dSYM.zip
10-
*.dSYM
10+
*.dSYM
11+
buildServer.json

Gemfile.lock

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@ GEM
99
public_suffix (>= 2.0.2, < 7.0)
1010
artifactory (3.0.17)
1111
atomos (0.1.3)
12-
aws-eventstream (1.3.2)
13-
aws-partitions (1.1109.0)
14-
aws-sdk-core (3.224.1)
12+
aws-eventstream (1.4.0)
13+
aws-partitions (1.1131.0)
14+
aws-sdk-core (3.226.3)
1515
aws-eventstream (~> 1, >= 1.3.0)
1616
aws-partitions (~> 1, >= 1.992.0)
1717
aws-sigv4 (~> 1.9)
1818
base64
1919
jmespath (~> 1, >= 1.6.1)
2020
logger
21-
aws-sdk-kms (1.101.0)
22-
aws-sdk-core (~> 3, >= 3.216.0)
21+
aws-sdk-kms (1.106.0)
22+
aws-sdk-core (~> 3, >= 3.225.0)
2323
aws-sigv4 (~> 1.5)
24-
aws-sdk-s3 (1.188.0)
25-
aws-sdk-core (~> 3, >= 3.224.1)
24+
aws-sdk-s3 (1.193.0)
25+
aws-sdk-core (~> 3, >= 3.225.0)
2626
aws-sdk-kms (~> 1)
2727
aws-sigv4 (~> 1.5)
28-
aws-sigv4 (1.11.0)
28+
aws-sigv4 (1.12.1)
2929
aws-eventstream (~> 1, >= 1.0.2)
3030
babosa (1.0.4)
3131
base64 (0.3.0)
@@ -57,10 +57,10 @@ GEM
5757
faraday (>= 0.8.0)
5858
http-cookie (~> 1.0.0)
5959
faraday-em_http (1.0.0)
60-
faraday-em_synchrony (1.0.0)
60+
faraday-em_synchrony (1.0.1)
6161
faraday-excon (1.1.0)
6262
faraday-httpclient (1.0.1)
63-
faraday-multipart (1.1.0)
63+
faraday-multipart (1.1.1)
6464
multipart-post (~> 2.0)
6565
faraday-net_http (1.0.2)
6666
faraday-net_http_persistent (1.2.0)
@@ -70,7 +70,7 @@ GEM
7070
faraday_middleware (1.2.1)
7171
faraday (~> 1.0)
7272
fastimage (2.4.0)
73-
fastlane (2.227.2)
73+
fastlane (2.228.0)
7474
CFPropertyList (>= 2.3, < 4.0.0)
7575
addressable (>= 2.8, < 3.0.0)
7676
artifactory (~> 3.0)
@@ -157,17 +157,17 @@ GEM
157157
httpclient (2.9.0)
158158
mutex_m
159159
jmespath (1.6.2)
160-
json (2.12.2)
161-
jwt (2.10.1)
160+
json (2.13.0)
161+
jwt (2.10.2)
162162
base64
163163
logger (1.7.0)
164164
mini_magick (4.13.2)
165165
mini_mime (1.1.5)
166-
multi_json (1.15.0)
166+
multi_json (1.17.0)
167167
multipart-post (2.4.1)
168168
mutex_m (0.3.0)
169169
nanaimo (0.4.0)
170-
naturally (2.2.1)
170+
naturally (2.3.0)
171171
nkf (0.2.0)
172172
optparse (0.6.0)
173173
os (1.1.4)

Makefile

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: help setup setup_hook setup_snapshot setup_fastlane update update_fastlane update_swiftformat format screenshots
1+
.PHONY: help setup setup_hook setup_snapshot setup_fastlane update update_fastlane update_swiftformat format screenshots build test fastlane testflight upload_screenshots
22

33
# Цвета и шрифт
44
YELLOW=\033[1;33m
@@ -245,6 +245,31 @@ format:
245245
@printf "$(YELLOW)Запуск swiftformat...$(RESET)\n"
246246
@swiftformat .
247247

248+
## build: Сборка проекта в терминале
249+
build:
250+
xcodebuild -project SwiftUI-Days.xcodeproj -scheme SwiftUI-Days -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build
251+
252+
## test: Запускает unit-тесты в терминале
253+
test:
254+
xcodebuild -project SwiftUI-Days.xcodeproj -scheme SwiftUI-Days -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test -testPlan SwiftUI-DaysTests
255+
256+
## fastlane: Запустить меню команд fastlane
257+
fastlane:
258+
@bash -c '\
259+
set -e; \
260+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
261+
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
262+
$(MAKE) setup_fastlane; \
263+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
264+
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
265+
exit 1; \
266+
fi; \
267+
fi; \
268+
eval "$$(rbenv init -)"; \
269+
rbenv shell $(RUBY_VERSION); \
270+
bundle exec fastlane; \
271+
'
272+
248273
## screenshots: Запустить fastlane snapshot для генерации скриншотов приложения
249274
screenshots:
250275
@bash -c '\
@@ -262,6 +287,41 @@ screenshots:
262287
rbenv shell $(RUBY_VERSION); \
263288
bundle exec fastlane snapshot; \
264289
'
290+
## upload_screenshots: Загрузить существующие скриншоты в App Store Connect
291+
upload_screenshots:
292+
@bash -c '\
293+
set -e; \
294+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
295+
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
296+
$(MAKE) setup_fastlane; \
297+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
298+
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
299+
exit 1; \
300+
fi; \
301+
fi; \
302+
printf "$(YELLOW)Загрузка существующих скриншотов в App Store Connect...$(RESET)\n"; \
303+
eval "$$(rbenv init -)"; \
304+
rbenv shell $(RUBY_VERSION); \
305+
bundle exec fastlane ios upload_screenshots; \
306+
'
307+
308+
## testflight: Собрать и отправить сборку в TestFlight через fastlane
309+
testflight:
310+
@bash -c '\
311+
set -e; \
312+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
313+
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
314+
$(MAKE) setup_fastlane; \
315+
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
316+
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
317+
exit 1; \
318+
fi; \
319+
fi; \
320+
printf "$(YELLOW)Запуск fastlane release для отправки в TestFlight...$(RESET)\n"; \
321+
eval "$$(rbenv init -)"; \
322+
rbenv shell $(RUBY_VERSION); \
323+
bundle exec fastlane ios release; \
324+
'
265325

266326
.DEFAULT:
267327
@printf "$(RED)Неизвестная команда: 'make $@'\n$(RESET)"

README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,27 @@ make setup
2727
5. Удалить все записи разом, если нужно
2828

2929
## Скриншоты
30+
Для автоматической загрузки скриншотов в App Store Connect через fastlane используются устройства, которые соответствуют требованиям App Store Connect по размерам скриншотов:
31+
- **iPhone 15 Pro Max** (1290x2796) - стандартный размер для iPhone
32+
- **iPad Pro (12.9-inch) (6th generation)** (2048x2732) - стандартный размер для iPad
33+
34+
При ручной загрузке в App Store Connect можно использовать скриншоты с любых устройств, но для автоматической загрузки через fastlane нужны именно эти модели.
35+
3036
Для генерации скриншотов используется команда:
3137
```shell
32-
make fastlane
38+
make screenshots
39+
```
40+
41+
Для загрузки скриншотов в App Store Connect используется команда:
42+
```shell
43+
make upload_screenshots
3344
```
3445
### iPhone
3546
| Список записей | Создание новой записи | Сортировка на главном экране |
3647
| --- | --- | --- |
37-
| <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-1-demoList.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-2-chooseDate.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-3-sortByDate.png"> |
48+
| <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-1-demoList.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-2-chooseDate.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-3-sortByDate.png"> |
3849

3950
### iPad
4051
| Список записей | Создание новой записи | Сортировка на главном экране |
4152
| --- | --- | --- |
42-
| <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-1-demoList.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-2-chooseDate.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-3-sortByDate.png"> |
53+
| <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-1-demoList.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-2-chooseDate.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-3-sortByDate.png"> |

SwiftUI-Days.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@
532532
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
533533
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
534534
MACOSX_DEPLOYMENT_TARGET = 14.0;
535-
MARKETING_VERSION = 1.4;
535+
MARKETING_VERSION = 1.5;
536536
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SwiftUI-Days";
537537
PRODUCT_NAME = "$(TARGET_NAME)";
538538
SDKROOT = auto;
@@ -578,7 +578,7 @@
578578
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
579579
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
580580
MACOSX_DEPLOYMENT_TARGET = 14.0;
581-
MARKETING_VERSION = 1.4;
581+
MARKETING_VERSION = 1.5;
582582
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SwiftUI-Days";
583583
PRODUCT_NAME = "$(TARGET_NAME)";
584584
SDKROOT = auto;

SwiftUI-Days/Models/BackupFileDocument.swift

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ struct BackupFileDocument: FileDocument {
1212
static var readableContentTypes: [UTType] { [.json] }
1313
static var writableContentTypes: [UTType] { [.json] }
1414
static func toBackupItem(item: Item) -> BackupItem {
15-
.init(title: item.title, details: item.details, timestamp: item.timestamp)
15+
.init(
16+
title: item.title,
17+
details: item.details,
18+
timestamp: item.timestamp,
19+
colorTag: item.colorTag
20+
)
1621
}
1722

1823
let items: [BackupItem]
@@ -39,9 +44,57 @@ extension BackupFileDocument {
3944
let title: String
4045
let details: String
4146
let timestamp: Date
47+
let colorTag: Color?
4248

4349
var realItem: Item {
44-
.init(title: title, details: details, timestamp: timestamp)
50+
.init(
51+
title: title,
52+
details: details,
53+
timestamp: timestamp,
54+
colorTag: colorTag
55+
)
56+
}
57+
58+
private enum CodingKeys: String, CodingKey {
59+
case title, details, timestamp, colorTag
60+
}
61+
62+
init(title: String, details: String, timestamp: Date, colorTag: Color? = nil) {
63+
self.title = title
64+
self.details = details
65+
self.timestamp = timestamp
66+
self.colorTag = colorTag
67+
}
68+
69+
init(from decoder: Decoder) throws {
70+
let container = try decoder.container(keyedBy: CodingKeys.self)
71+
title = try container.decode(String.self, forKey: .title)
72+
details = try container.decode(String.self, forKey: .details)
73+
timestamp = try container.decode(Date.self, forKey: .timestamp)
74+
// Для обратной совместимости со старыми резервными копиями
75+
if let colorData = try container.decodeIfPresent(Data.self, forKey: .colorTag) {
76+
colorTag = try NSKeyedUnarchiver.unarchivedObject(
77+
ofClass: UIColor.self,
78+
from: colorData
79+
).map(Color.init)
80+
} else {
81+
colorTag = nil
82+
}
83+
}
84+
85+
func encode(to encoder: Encoder) throws {
86+
var container = encoder.container(keyedBy: CodingKeys.self)
87+
try container.encode(title, forKey: .title)
88+
try container.encode(details, forKey: .details)
89+
try container.encode(timestamp, forKey: .timestamp)
90+
if let colorTag {
91+
let uiColor = UIColor(colorTag)
92+
let colorData = try NSKeyedArchiver.archivedData(
93+
withRootObject: uiColor,
94+
requiringSecureCoding: false
95+
)
96+
try container.encode(colorData, forKey: .colorTag)
97+
}
4598
}
4699
}
47100
}

SwiftUI-Days/Models/Item.swift

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,26 @@
77

88
import Foundation
99
import SwiftData
10+
import SwiftUI
1011

1112
@Model
1213
final class Item {
1314
private static let calendar = Calendar.current
1415
var title = ""
1516
var details = ""
1617
var timestamp = Date.now
18+
var colorTagData: Data?
1719

18-
init(title: String, details: String = "", timestamp: Date) {
20+
init(title: String, details: String = "", timestamp: Date, colorTag: Color? = nil) {
1921
self.title = title
2022
self.details = details
2123
self.timestamp = timestamp
24+
colorTagData = colorTag.flatMap { color in
25+
try? NSKeyedArchiver.archivedData(
26+
withRootObject: UIColor(color),
27+
requiringSecureCoding: false
28+
)
29+
}
2230
}
2331

2432
/// Количество дней с момента события
@@ -29,8 +37,33 @@ final class Item {
2937
return daysCount ?? 0
3038
}
3139

40+
var colorTag: Color? {
41+
get {
42+
guard let colorTagData,
43+
let uiColor = try? NSKeyedUnarchiver.unarchivedObject(
44+
ofClass: UIColor.self,
45+
from: colorTagData
46+
)
47+
else { return nil }
48+
return Color(uiColor: uiColor)
49+
}
50+
set {
51+
colorTagData = newValue.flatMap { color in
52+
try? NSKeyedArchiver.archivedData(
53+
withRootObject: UIColor(color),
54+
requiringSecureCoding: false
55+
)
56+
}
57+
}
58+
}
59+
3260
var backupItem: BackupFileDocument.BackupItem {
33-
.init(title: title, details: details, timestamp: timestamp)
61+
.init(
62+
title: title,
63+
details: details,
64+
timestamp: timestamp,
65+
colorTag: colorTag
66+
)
3467
}
3568
}
3669

0 commit comments

Comments
 (0)