-
#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