반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기 본문

오뚝이 개발자/SwiftUI

SwiftUI Widget 딱대.. (3/3) : 위젯을 눌렀을 때 다른 화면으로 뜨게 하기

rriver2 2022. 8. 7. 19:45
반응형

위젯을 누르면 앱의 홈이 아니라 다른 화면으로 넘어가고 싶어서 해당 내용을 공부했다.

 

우선은 기본 화면이다.

main에는 navigationlink로 이어지는 button이 있다. 그리고 그 버튼을 누르면 다음 화면으로 넘어간다.

코드는 다음과 같다.

struct ContentView: View {
    @State var isPresent = false
    var body: some View {
        NavigationView {
            NavigationLink(isActive: $isPresent) {
                SecondView()
            } label: {
                Text("다음화면으로 가자")
                    .onTapGesture {
                        isPresent = true
                    }
            }
            .navigationBarTitle("Your Characters")
            
        }
        .onOpenURL(perform: { (url) in
            print("dd")
            self.isPresent = url == URL(string: "widgetPractice:///next")
        })
    }
}


struct SecondView: View {
    var body: some View {
        Text("다음화면임")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

위젯에서 어떤 걸 눌렀을 때 앱 화면으로 넘어가기 위해서는 해당 View의 URL이 필요하다.

(사람들이 widget deep link 라고 하더라..!?)

그래서 TimelineEntry 안에 url을 넣어주고,

struct SimpleEntry: TimelineEntry {
    let date: Date
    let configuration: ConfigurationIntent
    let url = URL(string: "widgetPractice:///next") // 이부분
}

그리고 이렇게 widget에 widgetURL을 쓰면 앱이 열릴 때 어느 URL로 이동할지를 담아 보내준다고 한다.

struct widgetEntryView : View {
    var entry: Provider.Entry
    
    var body: some View {
        Text(entry.date, style: .time)
            .widgetURL(entry.url) // 이 부분
    }
}

 

마지막으로 앱 내에서 그 시그널을 받는 부분은 이 onOpenURL 부분이다.

onOpenURL은 뷰가 scene이나 window에 대한 URL을 수신한다.

struct ContentView: View {
    @State var isPresent = false
    var body: some View {
        NavigationView {
            NavigationLink(isActive: $isPresent) {
                SecondView()
            } label: {
                Text("다음화면으로 가자")
                    .onTapGesture {
                        isPresent = true
                    }
            }
            .navigationBarTitle("Your Characters")
            
        }
        // 이 부분
        .onOpenURL(perform: { (url) in
            self.isPresent = url == URL(string: "widgetPractice:///next")
        })
    }
}

 

그러면 이렇게 위젯을 눌렀을 때 해당 뷰가 열리는 것을 확인할 수 있다 !

 

 

 

추가적인 궁금증

궁금한게... 제일 처음 뷰에서 좀 더 깊은 뷰로 이동해야 할 때는 어떻게 해야 하는 걸까..?

누르는 버튼에 따라 달리하는 거는 appDelegate 또는 sceneDeleagate의 openURL이랑 link를 이용해서 한다는 데 이 부분도 공부가 필요할 거 같다.

반응형
Comments