Skip to content

feature: [위젯] - 뭉치 위젯 구현#41

Merged
giljihun merged 4 commits intodevelopfrom
feature/-위젯-뭉치-위젯
Feb 2, 2026

Hidden character warning

The head ref may contain hidden characters: "feature/-\uc704\uc82f-\ubb49\uce58-\uc704\uc82f"
Merged

feature: [위젯] - 뭉치 위젯 구현#41
giljihun merged 4 commits intodevelopfrom
feature/-위젯-뭉치-위젯

Conversation

@giljihun
Copy link
Member

@giljihun giljihun commented Feb 2, 2026

🎯 PR 내용

위젯에서 키링뿐만 아니라 뭉치(Bundle)도 선택하여 표시할 수 있도록 기능 추가

뭉치 이미지 캐시를 App Group으로 마이그레이션하여 위젯에서 접근 가능하도록 변경
위젯용 이미지는 배경 없이 캡처하고 투명 여백을 제거하여 최적화
그래서 뭉치는 캐싱 할 때, 보관함용 + 위젯용 두번 캐싱함.
왜냐면 키링은 백그라운드가 없는데, 뭉치는 있으니까.

핵심 코드 설명

1. BundleImageCache - App Group 마이그레이션 및 ImageType 추가

위젯 타겟에서도 앱의 이미지 데이터에 접근할 수 있도록 공유 컨테이너 구조로 변경하고, 용도에 따른 이미지 타입을 정의했습니다.

// 위젯에서 접근 가능하도록 App Group 사용, 타겟을 위젯도 해야하니
private let appGroupIdentifier = "group.keychy.app"

enum ImageType {
    case full    // 배경 포함 (앱용)
    case widget  // 배경 없음 (위젯용)
}

func syncBundle(
    id: String, 
    name: String, 
    fullImageData: Data, 
    widgetImageData: Data?, 
    createdAt: Date
) {
    // App Group 경로 기반 동기화 및 저장 로직 구현
}

2. MultiKeyringCaptureScene+Capture - 배경 옵션화 및 투명 여백 제거

캡처 시 투명 여백을 제거하고 최대 해상도를 500px로 제한하는 최적화를 진행했습니다.

static func captureBundleImage(
    backgroundImageURL: String? = nil,  // nil이면 배경 없이 캡처
    trimTransparentEdges: Bool = false  // 투명 여백 제거 여부
) async -> Data? {
    // 이미지 캡처 프로세스 수행
}

// 투명 픽셀 스캔 후 크롭 + 리사이즈 (최대 500px)
private static func trimTransparentEdgesFromPNG(_ pngData: Data) -> Data? {
    // PNG의 알파 채널을 계산하여 불필요한 투명 여백 제거 및 리사이징
}

3. AppIntent - 뭉치 Entity 추가 및 Intent 확장

위젯 구성(Configuration)에서 개별 키링뿐만 아니라 '뭉치(Bundle)' 단위로도 선택하여 표시할 수 있도록 기능을 확장했습니다.

struct BundleEntity: AppEntity {
    static var typeDisplayRepresentation: TypeDisplayRepresentation = "뭉치"
    
    var id: String
    var displayString: String
}

struct KeyringSelectionIntent: WidgetConfigurationIntent {
    @Parameter(title: "키링") 
    var selectedKeyring: KeyringEntity?
    
    @Parameter(title: "뭉치") 
    var selectedBundle: BundleEntity?  // 뭉치 선택 파라미터 추가
}

4. WidgetKeychy - 뭉치 표시 및 크기 최적화

선택된 엔티티가 '뭉치'일 경우의 분기 처리를 추가하고, 위젯 레이아웃 내 시각적 밸런스를 위해 스케일을 조정했습니다.

var body: some View {
    Group {
        if let bundle = entry.configuration.selectedBundle,
           let uiImage = loadBundleImage(bundleId: bundle.id) {
            Image(uiImage: uiImage)
                .resizable()
                .scaledToFit()
                .scaleEffect(0.85)  // 뭉치는 시각적 조화를 위해 85% 크기로 조정
        } else if let keyring = entry.configuration.selectedKeyring {
            // 기존 개별 키링 표시 로직
        }
    }
}

키링과 마찬가지로, 얘도 뭉치 보관함 접속해줘야 적용됩니다.

📱 스크린샷 (UI 변경 시)

ScreenRecording_02-02-2026.11-38-58_1.MP4

🔗 관련 이슈

✅ 체크리스트

  • 빌드 성공
  • 테스트 완료
  • Self-review 완료

@giljihun giljihun self-assigned this Feb 2, 2026
@giljihun giljihun linked an issue Feb 2, 2026 that may be closed by this pull request
@giljihun giljihun merged commit 80acd14 into develop Feb 2, 2026
@freshfresh22
Copy link
Member

오예~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: [위젯] - 뭉치 위젯

2 participants