ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #20. 딥링크(DeepLink)
    SwiftUI 앱만들기 2022. 7. 12. 12:35

    Info의 URLType의 URL Schemes에 추가

     

    #1. App화일 수정

    import SwiftUI

     

    @main

    struct _20_DeepLinkApp: App {

        

        @State var selectedTab = TabIdentifier.todos

        

        var body: some Scene {

            WindowGroup {

                TabView(selection: $selectedTab, content: {

                    

                    ToDosView().tabItem{

                        VStack{

                            Image(systemName: "list.bullet")

                            Text("할일 목록")

                        }

                    }.tag(TabIdentifier.todos)

                    ProfileView().tabItem{

                        Image(systemName: "person.circle.fill")

                        Text("프로필")

                    }.tag(TabIdentifier.profile)

     

                    

                })

                //열려야 하는 url 처리

                .onOpenURL(perform: {url in

                    //열려야 하는 url 처리

                    guard let tabId = url.tabIdentifier else { return}

                    selectedTab = tabId

                })

            }

        }

    }

     

     

    struct _20_DeepLinkApp_Previews: PreviewProvider {

        static var previews: some View {

            Text("Hello")

        }

    }

     

    // 어떤 탭이 선택되었는지 여부

    enum TabIdentifier: Hashable{

        

        case todos

        case profile

    }

    // 어떤 페이지를 보여줘야 하는지

    enum PageIdentifier : Hashable {

        case todoItem(id: UUID)

    }

     

    //딥링크설정

    extension URL {

        //info에서 추가한 딥링크가 들어왔는지 여부

        var isDeepLink : Bool{

            return scheme == "deeplink-swiftui"

        }

        //url 들어오는 것으로 어떤 타입의 탭을 보여줘야 하는지 가져오기

        var tabIdentifier: TabIdentifier? {

            guard isDeepLink else { return nil}

            

            //deeplink-swiftui://hohoho

            switch host{

            case "todos":

                return .todos

            case "profile":

                return .profile

            default: return nil

            }

        }

        

        var detailPage: PageIdentifier?{

            guard let tabId = tabIdentifier,

                  pathComponents.count > 1,

            let uuid = UUID(uuidString: pathComponents[1])

            else {return nil}

            

            switch tabId{

            case .todos:

                return .todoItem(id: uuid)

            default:

                return nil

            }

        }

    }

     

    #2. ToDosView

     

    import SwiftUI

     

    struct TodoItem : Identifiable, Hashable {

        

        var id: UUID

        var title: String

    }

     

    func preparedData() -> [TodoItem]{

        

        print("prepareData() called")

        

        var newList = [TodoItem]()

        

        for i in 0...20{

            let newTodo = TodoItem(id: UUID(), title: "내 할일 \(i)")

            print("newTodo.id: \(newTodo.id) / title: \(newTodo.title)")

            newList.append(newTodo)

        }

        return newList

        

    }

     

    struct ToDosView: View {

        

        @State var todoItems = [TodoItem]()

        

        @State var activeUUID: UUID?

        

        //생성자 메소드

        init(){

            _todoItems = State(initialValue: preparedData())

        }

        

        var body: some View {

            NavigationView{

                List(todoItems){ todoItem in

                    

                    NavigationLink(destination: Text("\(todoItem.title)"),

                        tag: todoItem.id,

                        // activeUUID값이 변경되면 해당 하는 링크로 이동

                        selection: $activeUUID, label: {

                        Text("\(todoItem.title)")

                    })

                    

                }

                .navigationTitle(Text("할일 목록"))

                .onOpenURL(perform: { url in

                    if case .todoItem(let id) = url.detailPage{

                        print("넘어온 id: \(id)")

                        activeUUID = id

                    }

                    

                })

            }

        }

    }

     

    struct ToDosView_Previews: PreviewProvider {

        static var previews: some View {

            ToDosView()

        }

    }

     

    #3. ProfileView

    import SwiftUI

     

    struct ProfileView: View {

        var body: some View {

            Rectangle()

                .foregroundColor(Color.init(#colorLiteral(red: 0.7216244729, green: 0.2885139788, blue: 1, alpha: 1)))

                .frame(width: 100, height: 100)

                .cornerRadius(15)

                .overlay(Text("프로필")

                    .font(.system(size: 23))

                    .fontWeight(.black)

                    .foregroundColor(.white)

                         

                )

        }

    }

     

    struct ProfileView_Previews: PreviewProvider {

        static var previews: some View {

            ProfileView()

        }

    }

     

     


    출처: https://youtu.be/kjDl_15fOEQ

     

    'SwiftUI 앱만들기' 카테고리의 다른 글

    #21. 메뉴(Menu)  (0) 2022.07.12
    #19. 피커뷰(PickerView)  (0) 2022.07.11
    #18. 토스트, 팝업(Toast, Popup)  (0) 2022.07.11
    #17. 텍스트필드(TextField, SecureField)  (0) 2022.07.11
    #16. 버튼 스타일(Button Style)  (0) 2022.07.11

    댓글

Designed by Tistory.