평소 길치인 저를 타겟으로 만든 보행자용 네비게이션입니다. 시중에 존재하는 많은 길안내 앱이 존재하지만 오직 길안내에만 집중할 수 있는 앱은 없었습니다.
따라서 불필요한 UI를 제거한 최소한의 기능으로 작동되는 앱을 만들게 되었습니다.
![]() |
![]() |
![]() |
- Swift
- StoryBoard
- Alamofire
- TmapSDK
- CoreLocation
- MVC
개발 과정
아묻따지하철
1. 스플래시 -> 로그인창 -> 설정창 만들기2. 클릭시 저장하기화면까지 구현하기 (일단은 하나)
3. 모달뷰로 테이블뷰 서치바 연결함
1. 맵 지도에 띄우는 것 까지 구현
2. 현재위치 받는 것 까지 구현 -> 버튼을 클릭해야 현재위치가 출력
3. 그렇다면 서치바를 통해 목적지를 입력받고, 테이블셀을 클릭하면 그때 같이 맵에 띄워주는 형식으로 구현해야 할 것 같음 ,그전에는 맵을 보여주지 않게 해야함
4. 서치바의 검색을 통해 테이블 셀을 클릭, 테이블 셀에는 경도 위도 이름 정보가 필요함 셀의 정보는 목적지
- 사용자로부터 받은 현재위치 : 출발지
- 셀:목적지 까지의 경도위도를 입력받아 보행자네비 만들기
- 애플 기본지도로 받아오기
- 검색창에서 목적지를 입력받고 경도 위도 그리고 이름까지는 잘 받아와짐 하지만 이전 뷰로 이동하면서 이 값들을 가지고 dismiss해야하는데 잘 되지 않았음
해결방법 모색
1.performSegue
2.프로토콜 사용
-> selectRow func 실행시 dismiss 말고 바로 mapview로 present하면서 값 넘겼더니 받아짐
viewDidLoad 에다가 미리 설정해둔 변수를 label.text에 넘긴다.
1.검색한 결과로부터 경도 위도를 받아서 마커를 찍기로함
2.경도 위도값이 .case로 감싸져있어 뽑아지지가 않음 -> 단일값을 뽑을때는 case를 쓰는거 ok, [배열]로 값이 오는데 caseArray가 써지지 않는이유는? -> 그래서 case단일값을 2개를 불러서 뽑아야하나 ? -> if문안에서만 사용되는.case(let 값)이라서 사용되지가 않음 -> 단일값으로다가 내일 테스트 해 볼 예정
type별로 들어오는 값이 달랐었다. 단일 목적지만 표시하는 Point와 Line을 그려주는 LineString 두개가 있는데 이를 if문을 통해 분기를 처리했고,
문제는 LineString일때 [[1,2,3],[3,4,5]]와 같이 배열이 들어온다.
현재 구현한 처리방법은 [] 배열이 한개일때 뿐이므로 값으로 들어온 이중배열의 값을 for문을 통해 한번 벗겨내었고
그 인덱스를 if case .doubleArray를 통해 집어넣으니 배열이 정상적으로 벗겨진 것 확인, 이를 LoadArray에 append를 통해 담으면 목표지까지 그릴 라인을 담은 배열을 만들었다.
2.현재 내위치의 경도위도부터 잡기
3.현재 내 목적지 경도위도 업로드
4.목적지까지 이동하면서 라인 분기별로 안내멘트를 텍스트로 출력하게 한다. 안내멘트는 배열로 받고 +- 해당 경도위치에 도달하면 인덱스+1 을 하는식으로 해서 목적지까지 안내 해주는 것 구현해보기
찾고자하는 목적지까지의 값을 통신해서 가져오는데, viewDidLoad에서 하고 있었다.
즉 현재위치부터 목적지가 아닌 초기에 하드코딩해서 만들어 놓은 경도 위치로부터 라인이 그려졌고
사용자로부터 목적지를 입력받고 그다음 목적지까지의 통신결과로 라인을 그리니 정상적으로 그려졌다.
type을 lineString에서 Point로 바꾸었다.
바꾼 이유는 lineString에서 경도 위도가 너무나도 많았고(가까운 거리임에도 불구하고 경도 위도배열의 count를 세어보니 250개)
따라서 현재 사용자가 어느 위치에 도달했는지에 대한 경도 위도를 정확히 파악하기 어려웠다.
(정확히는 몇번째 배열에 접근해 어떤 안내문구를 출력해야하는지 파악하기 어려웠음)
따라서 Point로 바꾸었고 새로 type이 Point인 배열을 만들어 확인해보니 23개로 정상적인 출력이 되었고 안내문구는 총 24개가 출력이 되었다.
두개가 갯수가 일치한다. 안내문구의 마지막은 무조건 [도착] 문구가 포함되어 있기 때문에 포인트의 갯수만큼 안내문구가 출력되는 것을 확인하였음 (실제 폰에 이식해 확인완료)
1.받아온 경도위도의 배열을 마커로 한번 찍어보기 (만약 찍어서 잘 나온다면 해당 마커를 지나갈때마다 안내문구를 출력하면 될듯) 현재 배열은 [[Double]]의 형태로 담겨져 있다. 마커를 찍는 함수는 input으로 CLLOcationCoordinate2D형태로 받는데,
해당 형태로 받을 수 있게 배열을 반복문을 통해 한번 벗겨내고, input으로 배열의 0번째 인덱스,1번째인덱스에 접근해 setMark의 input으로 값을 넘겨주었다.
처음에는 앱이 강제종료되길래 확인했더니 Dispatch.global().async에서 받고 있어서 오류가 나왔었고
해당 비동기가 끝난 다음줄에서 배열의 값을 집어넣을 것이기 때문에 Dispatch.main.async를 만들어 배열을 넘겨주었더니 정상적으로 마커가 찍힘 1.해볼 것 출발지마크 커스텀, 도착지마크 커스텀 다음 목적지의 마커를 중심으로 해당 마커의 원 반경에 접근하게 되면 다음 안내문구가 출력되게끔 구현하는 것 목표
좌표들을 이용해 마커를 찍었었는데 이 마커와 다음마커의 경,위도를 통해 얼마나 거리가 떨어져있는지 구할 수 있었다.
우선 마커로 원을 그리고 반지름을 10으로 정한뒤, 다음마커까지의 거리가 10보다 같거나 작아진다면 이는 원에 들어온 것으로 간주하고 다음 안내문구를 출력한다. 기존에는 맵뷰를 초기화 하고 버튼을 클릭해 현재위치로 이동함과 동시에 마커들,path를 확인할 수 있었다.
하지만 생성이 끝나기도전에 버튼을 먼저 눌러버리면 마커들과 원 범위가 표시가 뜨지 않는 오류를 발견하였다.
이후 문서를 잘 읽어보니 mapViewDidFinishLoadingMap라는 함수가 있었는데 프로토콜을 채택하고 사용할 수 있었다.
mapViewDidFinishLoadingMap - 지도 초기화 후 호출되는 인터페이스 함수
- 2022.11.12 ~ 2022.12.20 (39일)