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

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

SwiftUI Widget 딱대(짐).. : 딥링크가 안되는 뎁숑 ? 본문

오뚝이 개발자/SwiftUI

SwiftUI Widget 딱대(짐).. : 딥링크가 안되는 뎁숑 ?

rriver2 2024. 7. 23. 13:01
반응형


 ☁️ Widget 시리즈 

기본 시리즈

SwiftUI Widget 딱대.. (1/3) 위젯 기본 개념 + 구현

SwiftUI Widget 딱대.. (2/3) : 앱 내의 데이터를 widget에 띄우기

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

 

에러 시리즈

SwiftUI Widget 딱대(짐).. : 위젯 memory 제한

SwiftUI Widget 딱대(짐).. : localization 적용

SwiftUI Widget 딱대(짐).. : 위젯에 폰트가 안 먹혀요...

[Error 해결] Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.

SwiftUI Widget 딱대(짐).. : 딥링크가 안되는 뎁숑 ?


이번 포스팅 요약

1) link 안에는 띄어쓰기, 한글 등이 들어가면 안된다.

2) foreach 문을 사용한다면 widgetURL 말고 Link를 사용하자.


🔧 문제 상황

ㅎ... 오늘은 2024년 7월 23일 화요일...  Widget 이야기가... 다시 왔습니다

딥링크가 안되더라구요?

 

위젯에서 카드를 누르면 바로 해당 일기 형식으로 글을 적을 수 있는 기능이 있었는데... 없어졌어요(?)

작동을 더이상 안 하더라구요?

💬 고민 Point + 🌟 문제 해결

1️⃣ URL,,, 너어어? 제대로 되어 있는지 확인 좀 하자

일단 제일 합리적인 의심이었던 Link URL이 제대로 되어 있는지를 확인을 해야겠다는 생각을 했다.

구글링을 해보니까 한글이나 띄어쓰기가 있으면 오류가 뜰 수 있다는 글 발견!! 그래서 혹시나 해서 link를 프린트했더니... 

struct widgetEntryView : View {
    var entry: Provider.Entry
    
    var body: some View {
        Text(entry.date, style: .time)
            .widgetURL(getPercentEcododedString(urlString: "urlString 칭긔"))!) // 이 부분
    }
    
    // url에 띄어쓰기, 한글 등 오류가 날 수 있는 애들 없애는 함수
    private func getPercentEcododedString(urlString: String) -> String {
        return urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""

    }
}
struct ContentView: View {
	@State var url: String
    
    var body: some View {
       Vstack {
        	Text("url 이놈 : \(url)")
       }
        // 이 부분
        .onOpenURL(perform: { (url) 
            self.url= url.absoluteString.removingPercentEncoding ?? "" // string으로 만들어주는
        })
    }
}

 

오류 없이 잘 나오는 뎁숑?

이렇게 빨간 영역을 누르니까 letter로 링크가 잘 떴다.

 

2️⃣ 근데 왜 계속 Letter만 보내지는 거지?

여기서 어떤 카드를 누르든 letter만 보내졌다.

아래와 같은 코드였는데, ForEach로 Image를 반복하더라도, 마지막 요소만 linking이 되는 것 같았다.

( 왜냐면 파란색 영역을 누르면 다른 link가 떴고,

카드 배열이 바뀌면 list의 제일 마지막 요소만 링킹이 됐거든요 )

ForEach(recordList, id: \.self) { record in
     Image(record.imageName+"_widget")
        .widgetURL(URL(string: WidgetManager.getPercentEcododedString(string: record.imageName)))
}

 

그래서 구글링을 해보니까 나처럼 ForEach 문 안에서 link를 달면 각각의 요소로 인식이 안된다는 Apple Forums를 확인했다.

 

widgetURL is override inside Forea… | Apple Developer Forums

Did you read doc for widgetURL Widgets support one widgetURL modifier in their view hierarchy. If multiple views have widgetURL modifiers, the behavior is undefined. It seems you fall in this case.

forums.developer.apple.com

그리고 답변에서 누군가가 친절히 알려주신..

 

 

찾아보니까 .widgetURL의 경우에는 "위젯은 보기 계층에서 하나의 'widgetURL' 수식어를 지원하기 때문에 여러 뷰에 'widgeURL' 수식자가 있는 경우 동작은 구현되지 않는다"고 나와 있었다..

 

 

그러면서 알려주신 방법대로 WidgetEntryView 코드를 수정하니까 잘 작동!! 

ForEach(recordList, id: \.self) { record in
        Link(destination: URL(string: WidgetManager.getPercentEcododedString(string: record.imageName))!) {
     		Image(record.imageName+"_widget")
     	}
     }
}

 

 

낄낄 해치웠다.

반응형
Comments