Skip to content
Open
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
52 changes: 50 additions & 2 deletions Atcha-iOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@
6D1EE2F72E0A933000F7BBF1 /* OnboardingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D1EE2F62E0A933000F7BBF1 /* OnboardingCoordinator.swift */; };
6D26DFA82F289E64005097A4 /* HeadingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26DFA72F289E64005097A4 /* HeadingManager.swift */; };
6D26DFAA2F2D3B27005097A4 /* CloseOnlyNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26DFA92F2D3B27005097A4 /* CloseOnlyNavigationBar.swift */; };
6D26DFFC2F3C16FD005097A4 /* SubwayInfoUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26DFFB2F3C16FD005097A4 /* SubwayInfoUseCase.swift */; };
6D26E0002F3C17C3005097A4 /* SubwayRealTimeInfoRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26DFFF2F3C17C3005097A4 /* SubwayRealTimeInfoRequest.swift */; };
6D26E0022F3C17DE005097A4 /* SubwayRealTimeInfoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26E0012F3C17DE005097A4 /* SubwayRealTimeInfoResponse.swift */; };
6D26E0052F3C18B0005097A4 /* SubwayRealTimeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26E0042F3C18B0005097A4 /* SubwayRealTimeInfo.swift */; };
6D26E0072F3C197F005097A4 /* SubwayInfoRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26E0062F3C197F005097A4 /* SubwayInfoRepository.swift */; };
6D26E0092F3C1A0C005097A4 /* SubwayInfoRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D26E0082F3C1A0C005097A4 /* SubwayInfoRepositoryImpl.swift */; };
6D2B8C942E38A97500608104 /* BusDetailHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2B8C932E38A97500608104 /* BusDetailHeaderView.swift */; };
6D2B8C972E38ABF600608104 /* BusInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2B8C962E38ABF600608104 /* BusInfoViewController.swift */; };
6D2B8C992E38ABFD00608104 /* BusInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2B8C982E38ABFD00608104 /* BusInfoViewModel.swift */; };
Expand Down Expand Up @@ -336,6 +342,12 @@
6D1EE2F62E0A933000F7BBF1 /* OnboardingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingCoordinator.swift; sourceTree = "<group>"; };
6D26DFA72F289E64005097A4 /* HeadingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadingManager.swift; sourceTree = "<group>"; };
6D26DFA92F2D3B27005097A4 /* CloseOnlyNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseOnlyNavigationBar.swift; sourceTree = "<group>"; };
6D26DFFB2F3C16FD005097A4 /* SubwayInfoUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayInfoUseCase.swift; sourceTree = "<group>"; };
6D26DFFF2F3C17C3005097A4 /* SubwayRealTimeInfoRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayRealTimeInfoRequest.swift; sourceTree = "<group>"; };
6D26E0012F3C17DE005097A4 /* SubwayRealTimeInfoResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayRealTimeInfoResponse.swift; sourceTree = "<group>"; };
6D26E0042F3C18B0005097A4 /* SubwayRealTimeInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayRealTimeInfo.swift; sourceTree = "<group>"; };
6D26E0062F3C197F005097A4 /* SubwayInfoRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayInfoRepository.swift; sourceTree = "<group>"; };
6D26E0082F3C1A0C005097A4 /* SubwayInfoRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubwayInfoRepositoryImpl.swift; sourceTree = "<group>"; };
6D2B8C932E38A97500608104 /* BusDetailHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusDetailHeaderView.swift; sourceTree = "<group>"; };
6D2B8C962E38ABF600608104 /* BusInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusInfoViewController.swift; sourceTree = "<group>"; };
6D2B8C982E38ABFD00608104 /* BusInfoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusInfoViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -703,6 +715,31 @@
path = HeadingManager;
sourceTree = "<group>";
};
6D26DFFD2F3C179D005097A4 /* SubwayInfoDTO */ = {
isa = PBXGroup;
children = (
6D26DFFE2F3C17B3005097A4 /* SubwayRealTimeInfo */,
);
path = SubwayInfoDTO;
sourceTree = "<group>";
};
6D26DFFE2F3C17B3005097A4 /* SubwayRealTimeInfo */ = {
isa = PBXGroup;
children = (
6D26DFFF2F3C17C3005097A4 /* SubwayRealTimeInfoRequest.swift */,
6D26E0012F3C17DE005097A4 /* SubwayRealTimeInfoResponse.swift */,
);
path = SubwayRealTimeInfo;
sourceTree = "<group>";
};
6D26E0032F3C189D005097A4 /* SubwayInfo */ = {
isa = PBXGroup;
children = (
6D26E0042F3C18B0005097A4 /* SubwayRealTimeInfo.swift */,
);
path = SubwayInfo;
sourceTree = "<group>";
};
6D2B8C952E38ABED00608104 /* BusInfo */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -1128,6 +1165,7 @@
B65C12CF2E04292F0016D2F0 /* Entity */ = {
isa = PBXGroup;
children = (
6D26E0032F3C189D005097A4 /* SubwayInfo */,
6D2B8CA02E39A73300608104 /* BusInfo */,
B65C12DD2E042CF00016D2F0 /* UserInfo.swift */,
B66401842E2244CF00A397AE /* Location.swift */,
Expand All @@ -1147,6 +1185,7 @@
6DC3BF5F2E071F0900831470 /* LoginUseCase.swift */,
6D1EE2ED2E0A7D7300F7BBF1 /* OnboardingUseCase.swift */,
6D73EBE52E1B51E000F8DF8B /* CourseUseCase.swift */,
6D26DFFB2F3C16FD005097A4 /* SubwayInfoUseCase.swift */,
6D2B8CB92E39C8E100608104 /* BusInfoUseCase.swift */,
6DB7636A2E45C5EC00D06A49 /* AlarmUseCase.swift */,
);
Expand All @@ -1162,6 +1201,7 @@
6D1EE2EF2E0A7F0000F7BBF1 /* OnboardingRepository.swift */,
6D73EBE72E1B54A500F8DF8B /* CourseRepository.swift */,
6D2B8CBD2E39C9CB00608104 /* BusInfoRepository.swift */,
6D26E0062F3C197F005097A4 /* SubwayInfoRepository.swift */,
6DB7636C2E45C69400D06A49 /* AlarmRepository.swift */,
);
path = Repository;
Expand All @@ -1181,6 +1221,7 @@
children = (
B6C5074B2E129656000AB39F /* Location */,
6D2B8CBF2E39CC8800608104 /* BusInfoRepositoryImpl.swift */,
6D26E0082F3C1A0C005097A4 /* SubwayInfoRepositoryImpl.swift */,
B65C12E32E042D6B0016D2F0 /* UserRepositoryImpl.swift */,
B65C131F2E058C360016D2F0 /* AppVersionRepositoryImpl.swift */,
6D73EBE92E1B551600F8DF8B /* CourseRepositoryImpl.swift */,
Expand Down Expand Up @@ -1265,6 +1306,7 @@
6DB763672E45C52600D06A49 /* AlarmDTO */,
6D6879CC2E42119500E59C55 /* UserInfoPatchDTO */,
6D2B8C9F2E39A70500608104 /* BusInfoDTO */,
6D26DFFD2F3C179D005097A4 /* SubwayInfoDTO */,
B6AC8BDC2E2BAD6100410ECD /* UserDTO */,
6D5E03BA2E24F3D50065AFBE /* SearchHistoryDTO */,
B664017E2E2243C800A397AE /* LocationDTO */,
Expand Down Expand Up @@ -1988,6 +2030,7 @@
6D91A90F2E38A1C60081BAFC /* BusDetailViewModel.swift in Sources */,
B6CF46F52E09620100304A85 /* LoginCoordinator.swift in Sources */,
B6FB208A2E1BE5200032751B /* FetchTaxiFareRepositoryImpl.swift in Sources */,
6D26DFFC2F3C16FD005097A4 /* SubwayInfoUseCase.swift in Sources */,
6DB4DE932F114D6A00F2DC4E /* AtchaActionToast.swift in Sources */,
B68309532E005A3600E2D029 /* AppDelegate.swift in Sources */,
B65402D52E76CACC00AB5862 /* DetailRouteSummaryView.swift in Sources */,
Expand Down Expand Up @@ -2042,6 +2085,7 @@
B6793D542E386DFE001BE9F5 /* DetailRouteViewController.swift in Sources */,
B65C12FE2E057AF90016D2F0 /* NetworkConstant.swift in Sources */,
B6AC8BE72E2BC4E300410ECD /* AlarmSettingDIContainer.swift in Sources */,
6D26E0092F3C1A0C005097A4 /* SubwayInfoRepositoryImpl.swift in Sources */,
6D8D8B132E01B338003DABB2 /* AtchaButton.swift in Sources */,
B66401832E22449000A397AE /* SearchLocationResponse.swift in Sources */,
6D368BA42E02D5E200144EE7 /* IconTitleNavigationBar.swift in Sources */,
Expand Down Expand Up @@ -2084,6 +2128,7 @@
6D26DFA82F289E64005097A4 /* HeadingManager.swift in Sources */,
6D91A9012E33E3620081BAFC /* LoadingView.swift in Sources */,
B664018B2E2277A900A397AE /* PushAlarmOption.swift in Sources */,
6D26E0072F3C197F005097A4 /* SubwayInfoRepository.swift in Sources */,
B65C13082E057C590016D2F0 /* APIService.swift in Sources */,
6D6879D02E4211B800E59C55 /* HomePatchRequest.swift in Sources */,
6D9283742E3AFF6A0090889B /* BusRouteCell.swift in Sources */,
Expand Down Expand Up @@ -2165,10 +2210,12 @@
6DD632C22E544DB500C6A66E /* PushAlarmBottomView.swift in Sources */,
6D5E03D02E28853E0065AFBE /* CourseSearchResponse.swift in Sources */,
6D91A8E62E29F5BC0081BAFC /* CourseSettingViewModel.swift in Sources */,
6D26E0002F3C17C3005097A4 /* SubwayRealTimeInfoRequest.swift in Sources */,
B673C4912E0424FD00EE4AD0 /* SplashViewModel.swift in Sources */,
6DB763692E45C53A00D06A49 /* AlarmRequest.swift in Sources */,
B6C507502E129693000AB39F /* LocationStreamRepositoryImpl.swift in Sources */,
B6AC8BD92E2A85D800410ECD /* SignOutUseCase.swift in Sources */,
6D26E0022F3C17DE005097A4 /* SubwayRealTimeInfoResponse.swift in Sources */,
6D1EE2F02E0A7F0000F7BBF1 /* OnboardingRepository.swift in Sources */,
6D1EE2E52E09A42F00F7BBF1 /* PushAlarmViewController.swift in Sources */,
B6793D4F2E34972B001BE9F5 /* FetchTaxiFareRequest.swift in Sources */,
Expand Down Expand Up @@ -2223,6 +2270,7 @@
B69E31AC2E2683B8001040F4 /* PermissionViewController.swift in Sources */,
6D1EE2EE2E0A7D7300F7BBF1 /* OnboardingUseCase.swift in Sources */,
B6AC8BDB2E2B3AA200410ECD /* LogoutuseCase.swift in Sources */,
6D26E0052F3C18B0005097A4 /* SubwayRealTimeInfo.swift in Sources */,
6DFF29912E0CBE820039399F /* RegisterLocationViewController.swift in Sources */,
B6793D692E3B3FB8001BE9F5 /* DetailRouteSubwayCell.swift in Sources */,
B6793D602E3A5E23001BE9F5 /* DetailRouteProgressView.swift in Sources */,
Expand Down Expand Up @@ -2301,7 +2349,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4.5;
MARKETING_VERSION = 1.7;
PRODUCT_BUNDLE_IDENTIFIER = com.atcha.iOS;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down Expand Up @@ -2349,7 +2397,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4.5;
MARKETING_VERSION = 1.7;
PRODUCT_BUNDLE_IDENTIFIER = com.atcha.iOS;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand Down
2 changes: 2 additions & 0 deletions Atcha-iOS/App/DIContainer/Route/RouteDIContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ final class RouteDIContainer {
private lazy var requestUseCase = RequestLocationAuthorizationUseCaseImpl(repository: PermissionRepositoryImpl())
private lazy var streamUseCase = ObserLocationStreamUseCaseImpl(repository: LocationStreamRepositoryImpl())
private lazy var busInfoUseCase = BusInfoUseCaseImpl(repository: BusInfoRepositoryImpl(apiService: apiService))
private lazy var subwayInfoUseCase = SubwayInfoUseCaseImpl(repository: SubwayInfoRepositoryImpl(apiService: apiService))
private lazy var alarmUseCase = AlarmUseCaseImpl(repository: AlarmRepositoryImpl(apiService: apiService))

init(apiService: APIService) {
Expand All @@ -24,6 +25,7 @@ final class RouteDIContainer {
infos: infos,
context: context,
busInfoUseCase: busInfoUseCase,
subwayInfoUseCase: subwayInfoUseCase,
authorizationUseCase: requestUseCase,
streamUseCase: streamUseCase,
alarmUseCase: alarmUseCase)
Expand Down
2 changes: 1 addition & 1 deletion Atcha-iOS/Core/Manager/AlarmManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ extension AlarmManager {
// 1) UserDefaults에서 값 다시 읽기
let savedVolume = UserDefaultsWrapper.shared.float(
forKey: UserDefaultsWrapper.Key.alarmVolume.rawValue
) ?? 0.7
) ?? 0.3

// 2) AlarmManager 상태 업데이트
alarmVolume = savedVolume
Expand Down
21 changes: 20 additions & 1 deletion Atcha-iOS/Core/ViewWrapper/TMapWrapper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ final class TMapWrapper: NSObject, MapRendering {
private var trafficMarkers: [TMapMarker] = []

public init(frame: CGRect) {
self.mapView = TMapView(frame: UIScreen.main.bounds)
self.mapView = TMapView(frame: frame)
super.init()
configureDefaultSettings()
}
Expand Down Expand Up @@ -153,6 +153,7 @@ final class TMapWrapper: NSObject, MapRendering {
trafficMarkers.forEach { $0.map = nil }
trafficMarkers.removeAll()
}

}

extension TMapWrapper: TMapViewDelegate, TmapViewLocationDelegate {
Expand Down Expand Up @@ -180,3 +181,21 @@ extension TMapWrapper: TMapViewDelegate, TmapViewLocationDelegate {
delegate?.mapView(self, didUpdateLocation: newPosition)
}
}

extension TMapWrapper {
/// 현위치를 "routeInset 기준"으로 센터링하되, 화면에서 위로 50pt 올라가 보이게
func centerUserWithRouteInset(_ location: CLLocationCoordinate2D, yOffsetUp points: CGFloat = 50) {
let dLat = 0.00015
let dLon = 0.00015

let box = [
CLLocationCoordinate2D(latitude: location.latitude - dLat, longitude: location.longitude - dLon),
CLLocationCoordinate2D(latitude: location.latitude + dLat, longitude: location.longitude + dLon)
]

// 기존 route inset 그대로 + bottom만 50 증가 = 화면에서 더 위로 보임
let inset = UIEdgeInsets(top: 110, left: 30, bottom: 160 + points, right: 30)

mapView.fitMapBoundsWithPolygons([TMapPolygon(coordinates: box)], inset: inset)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// BusRealTimeInfoRequest.swift
// Atcha-iOS
//
// Created by wodnd on 2/11/26.
//

import Foundation

struct SubwayRealTimeInfoRequest: Codable {
let routeName: String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//
// BusRealTimeInfoResponse.swift
// Atcha-iOS
//
// Created by wodnd on 2/11/26.
//

import Foundation

struct SubwayRealTimeInfoResponse: Codable {
let routeName: String?
let subwayArrivalStatus: String?
let remainingTime: Int?
let isLast: Bool?
let expectedArrivalTime: String?
let trainNo: String?
let destination: String?
let direction: String?
}

extension SubwayRealTimeInfoResponse {
func toEntity() -> SubwayRealTimeInfo? {
guard
let routeName,
let subwayArrivalStatus,
let remainingTime,
let isLast,
let expectedArrivalTime,
let trainNo,
let destination,
let direction
else { return nil }

return SubwayRealTimeInfo(
routeName: routeName,
subwayArrivalStatus: subwayArrivalStatus,
remainingTime: remainingTime,
isLast: isLast,
expectedArrivalTime: expectedArrivalTime,
trainNo: trainNo,
destination: destination,
direction: direction
)
}
}
31 changes: 31 additions & 0 deletions Atcha-iOS/Data/Repository/SubwayInfoRepositoryImpl.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// SubwayInfoRepositoryImpl.swift
// Atcha-iOS
//
// Created by wodnd on 2/11/26.
//

import Foundation
import Alamofire

final class SubwayInfoRepositoryImpl: SubwayInfoRepository {

private let apiService: APIService

init(apiService: APIService) {
self.apiService = apiService
}

// 실시간 지하철 정보 조회
func subwayRealTimeInfo(_ request: SubwayRealTimeInfoRequest) async throws -> [SubwayRealTimeInfoResponse] {
let endpoint = Endpoint(
path: "/routes/user-routes/subway-arrival",
method: .get,
parameters: ["routeName": request.routeName],
encoding: URLEncoding.queryString
)

let result: [SubwayRealTimeInfoResponse] = try await apiService.request(endpoint)
return result
}
}
1 change: 1 addition & 0 deletions Atcha-iOS/DesignSource/AtchaColor/AtchaColor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ enum AtchaColor{
static let town = UIColor(named: "town")!
static let mainline = UIColor(named: "mainline")!
static let widearea = UIColor(named: "widearea")!
static let general = UIColor(named: "general")!
}

// MARK: - Transportation/Subway
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xA9",
"green" : "0x9B",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "general-getOff.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "general-getOff@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "general-getOff@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "general.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "general@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "general@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading