From 4c9898741306c0ae33317ec3b9b8b116681d9fca Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Wed, 3 May 2023 13:34:00 +0900 Subject: [PATCH 01/18] =?UTF-8?q?feat:=20=EB=A7=A4=EA=B0=9C=EB=A9=B4?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cardUUID 로 수정 --- NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift index 28d74be2..99542de4 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift @@ -16,7 +16,7 @@ public class GroupAPI { public init() { } func cardDeleteInGroup(cardUUID: String, cardGroupName: String, completion: @escaping (NetworkResult) -> Void) { - groupProvider.request(.cardDeleteInGroup(cardUuid: cardUUID, cardGroupName: cardGroupName)) { (result) in + groupProvider.request(.cardDeleteInGroup(cardUUID: cardUUID, cardGroupName: cardGroupName)) { (result) in switch result { case .success(let response): let statusCode = response.statusCode From 2d34b7ef66f0329800bfd70d63226c0dd6d9bb3d Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Wed, 3 May 2023 13:38:56 +0900 Subject: [PATCH 02/18] =?UTF-8?q?fix:=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20widgetURL=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cardID 에서 cardUUID 로 수정. --- Widgets/WidgetsBundle/MyCardWidget.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Widgets/WidgetsBundle/MyCardWidget.swift b/Widgets/WidgetsBundle/MyCardWidget.swift index d2b8d842..4550c4f3 100644 --- a/Widgets/WidgetsBundle/MyCardWidget.swift +++ b/Widgets/WidgetsBundle/MyCardWidget.swift @@ -11,7 +11,7 @@ import Intents struct MyCardProvider: IntentTimelineProvider { func placeholder(in context: Context) -> MyCardEntry { - MyCardEntry(date: Date(), widgetCard: WidgetCard(cardID: "", title: "일이삼사오육칠팔구", userName: "일이삼사오육", backgroundImage: UIImage())) + MyCardEntry(date: Date(), widgetCard: WidgetCard(cardUUID: "", title: "일이삼사오육칠팔구", userName: "일이삼사오육", backgroundImage: UIImage())) } func getSnapshot(for configuration: MyCardIntent, in context: Context, completion: @escaping (MyCardEntry) -> Void) { @@ -19,7 +19,7 @@ struct MyCardProvider: IntentTimelineProvider { if let card = configuration.myCard { entry = MyCardEntry(date: Date(), - widgetCard: WidgetCard(cardID: card.identifier ?? "", + widgetCard: WidgetCard(cardUUID: card.identifier ?? "", title: card.displayString, userName: card.userName ?? "", backgroundImage: fetchImage(card.cardImage ?? ""))) @@ -39,7 +39,7 @@ struct MyCardProvider: IntentTimelineProvider { for hourOffset in 0 ..< 5 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate) ?? Date() let entry = MyCardEntry(date: entryDate, - widgetCard: WidgetCard(cardID: card.identifier ?? "", + widgetCard: WidgetCard(cardUUID: card.identifier ?? "", title: card.displayString, userName: card.userName ?? "", backgroundImage: fetchImage(card.cardImage ?? ""))) @@ -68,7 +68,7 @@ extension MyCardProvider { } struct WidgetCard { - let cardID: String + let cardUUID: String let title: String let userName: String let backgroundImage: UIImage @@ -120,7 +120,7 @@ struct MyCardEntryView: View { } } } - .widgetURL(URL(string: "openMyCardWidget")) + .widgetURL(URL(string: "openMyCardWidget://?cardUUID=\(widgetCard.cardUUID)")) } else { Image("widgetEmpty") .resizable() @@ -148,7 +148,7 @@ struct MyCardWidget_Previews: PreviewProvider { static var previews: some View { MyCardEntryView(entry: MyCardEntry(date: Date(), widgetCard: nil)) .previewContext(WidgetPreviewContext(family: .systemSmall)) - MyCardEntryView(entry: MyCardEntry(date: Date(), widgetCard: WidgetCard(cardID: Card.mockData[0].cardUUID, title: Card.mockData[0].cardName, userName: Card.mockData[0].userName, backgroundImage: UIImage(named: Card.mockData[2].cardImage) ?? UIImage()))) + MyCardEntryView(entry: MyCardEntry(date: Date(), widgetCard: WidgetCard(cardUUID: Card.mockData[0].cardUUID, title: Card.mockData[0].cardName, userName: Card.mockData[0].userName, backgroundImage: UIImage(named: Card.mockData[2].cardImage) ?? UIImage()))) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } From 5d6aaedcddf2eb0df01184e7f36d6ad661f0697a Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Thu, 4 May 2023 15:59:40 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat:=20=EB=82=B4=20=EB=AA=85=ED=95=A8/qr?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9C=84=EC=A0=AF=EC=9D=84=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EC=95=B1=EC=97=90=EC=84=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/SceneDelegate.swift | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/NADA-iOS-forRelease/Sources/SceneDelegate.swift b/NADA-iOS-forRelease/Sources/SceneDelegate.swift index 96fa7187..e3c67841 100644 --- a/NADA-iOS-forRelease/Sources/SceneDelegate.swift +++ b/NADA-iOS-forRelease/Sources/SceneDelegate.swift @@ -5,6 +5,7 @@ // Created by kimhyungyu on 2021/08/08. // +import Photos import UIKit import FirebaseDynamicLinks @@ -45,7 +46,65 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { - if let url = URLContexts.first?.url { + let myCardURL = "openMyCardWidget" + let qrCodeURL = "openQRCodeWidget" + + guard let url = URLContexts.first?.url, + let urlComponents = URLComponents(string: url.absoluteString) else { return } + + if qrCodeURL == url.absoluteString { + // qr code 위젯. + switch AVCaptureDevice.authorizationStatus(for: .video) { + case .denied: + window?.rootViewController?.makeOKCancelAlert(title: "카메라 권한이 허용되어 있지 않아요.", + message: "QR코드 인식을 위해 카메라 권한이 필요합니다. 앱 설정으로 이동해 허용해 주세요.", + okAction: { _ in UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)}, + cancelAction: nil, + completion: nil) + case .authorized: + guard let nextVC = UIStoryboard.init(name: Const.Storyboard.Name.qrScan, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.qrScanViewController) as? QRScanViewController else { return } + nextVC.modalPresentationStyle = .overFullScreen + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { + let topVC = UIApplication.mostTopViewController() + topVC?.present(nextVC, animated: true) + } + case .notDetermined: + AVCaptureDevice.requestAccess(for: .video) { granted in + if granted { + DispatchQueue.main.async { + guard let nextVC = UIStoryboard.init(name: Const.Storyboard.Name.qrScan, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.qrScanViewController) as? QRScanViewController else { return } + nextVC.modalPresentationStyle = .overFullScreen + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { + let topVC = UIApplication.mostTopViewController() + topVC?.present(nextVC, animated: true) + } + } + } + } + default: + break + } + } else if url.absoluteString.starts(with: myCardURL) { + // 내 명함 위젯. + guard let queryItems = urlComponents.queryItems, + let cardUUID = queryItems.filter({ $0.name == "cardUUID" }).first?.value else { return } + + let nextVC = CardShareBottomSheetViewController() + .setTitle("명함공유") + .setHeight(606.0) + + nextVC.cardDataModel = Card(birth: "", cardID: 0, cardUUID: cardUUID, cardImage: "imgCardBg01", cardName: "첫 번째 카드", cardTastes: [CardTasteInfo(cardTasteName: "", isChoose: false, sortOrder: 0)], cardType: "", departmentName: "", isRepresentative: false, mailAddress: "", mbti: "", phoneNumber: "", instagram: "", twitter: "", tmi: "", urls: [], userName: "1현규") + + nextVC.isActivate = false + nextVC.modalPresentationStyle = .overFullScreen + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { + let topVC = UIApplication.mostTopViewController() + topVC?.present(nextVC, animated: true) + } + } else { if (AuthApi.isKakaoTalkLoginUrl(url)) { _ = AuthController.handleOpenUrl(url: url) } From 4fddc68f59f81044f0540c31826f651f10d3a2bd Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Thu, 4 May 2023 16:09:27 +0900 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20=EB=AA=85=ED=95=A8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=9B=84=20=EB=AA=85=ED=95=A8=EA=B3=B5=EC=9C=A0=20?= =?UTF-8?q?=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20=EB=93=B1=EC=9E=A5=20(#4?= =?UTF-8?q?70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/SceneDelegate.swift | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/SceneDelegate.swift b/NADA-iOS-forRelease/Sources/SceneDelegate.swift index e3c67841..efb35e8d 100644 --- a/NADA-iOS-forRelease/Sources/SceneDelegate.swift +++ b/NADA-iOS-forRelease/Sources/SceneDelegate.swift @@ -94,15 +94,16 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let nextVC = CardShareBottomSheetViewController() .setTitle("명함공유") .setHeight(606.0) - - nextVC.cardDataModel = Card(birth: "", cardID: 0, cardUUID: cardUUID, cardImage: "imgCardBg01", cardName: "첫 번째 카드", cardTastes: [CardTasteInfo(cardTasteName: "", isChoose: false, sortOrder: 0)], cardType: "", departmentName: "", isRepresentative: false, mailAddress: "", mbti: "", phoneNumber: "", instagram: "", twitter: "", tmi: "", urls: [], userName: "1현규") - - nextVC.isActivate = false - nextVC.modalPresentationStyle = .overFullScreen - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { - let topVC = UIApplication.mostTopViewController() - topVC?.present(nextVC, animated: true) + cardDetailFetchWithAPI(cardUUID: cardUUID) { cardDataModel in + nextVC.isActivate = false + nextVC.modalPresentationStyle = .overFullScreen + nextVC.cardDataModel = cardDataModel + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { + let topVC = UIApplication.mostTopViewController() + topVC?.present(nextVC, animated: true) + } } } else { if (AuthApi.isKakaoTalkLoginUrl(url)) { @@ -166,3 +167,27 @@ extension SceneDelegate { return cardUUID } } + +// MARK: - Network + +extension SceneDelegate { + private func cardDetailFetchWithAPI(cardUUID: String, completion: @escaping (Card) -> Void) { + CardAPI.shared.cardDetailFetch(cardUUID: cardUUID) { response in + switch response { + case .success(let data): + if let cardDataModel = data as? Card { + completion(cardDataModel) + } + print("cardDetailFetchWithAPI - success") + case .requestErr(let message): + print("cardDetailFetchWithAPI - requestErr", message) + case .pathErr: + print("cardDetailFetchWithAPI - pathErr") + case .serverErr: + print("cardDetailFetchWithAPI - serverErr") + case .networkFail: + print("deleteGroupWithAPI - networkFail") + } + } + } +} From 5a97fbea79aeffdcf1b98c6af1fe2df95d3d6e40 Mon Sep 17 00:00:00 2001 From: dlwns33 Date: Thu, 4 May 2023 23:45:32 +0900 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=ED=94=8C=EB=9D=BC=EC=9D=B4=ED=8A=B8=EC=9A=A9=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntentsExtension/IntentHandler.swift | 2 +- NADA-iOS-forRelease.xcodeproj/project.pbxproj | 34 +++++++++---------- .../xcschemes/IntentsExtension.xcscheme | 2 +- .../xcschemes/IntentsExtensionUI.xcscheme | 2 +- .../NADA-iOS-forRelease (Beta).xcscheme | 2 +- .../NADA-iOS-forRelease (Release).xcscheme | 2 +- .../xcschemes/NADA-iOS-forRelease.xcscheme | 2 +- .../xcschemes/WidgetsExtension.xcscheme | 2 +- NADA-iOS-forRelease/Info.plist | 8 ++--- .../Extensions/UserDefaults+Extension.swift | 2 +- .../NetworkService/Group/GroupAPI.swift | 2 +- Podfile.lock | 28 +++++++-------- Widgets/Resource/Widgets.intentdefinition | 4 ++- 13 files changed, 47 insertions(+), 45 deletions(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index f8615baf..cac35de2 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -85,7 +85,7 @@ extension IntentHandler { guard let url = URL(string: "http://3.35.107.3:8080/api/v1/card") else { return } var urlRequest = URLRequest(url: url) urlRequest.httpMethod = "GET" - urlRequest.addValue("Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEwfQ.rq__Rzvunpxq3paeo2fK4i_oeupyDlHp3q1RW6uSHSQ", forHTTPHeaderField: "Authorization") + urlRequest.addValue("Bearer \(UserDefaults.appGroup.string(forKey: "accessToken") ?? "")", forHTTPHeaderField: "Authorization") print("😀", UserDefaults.appGroup.string(forKey: "accessToken") ?? "") URLSession.shared.dataTask(with: urlRequest) { data, response, error in diff --git a/NADA-iOS-forRelease.xcodeproj/project.pbxproj b/NADA-iOS-forRelease.xcodeproj/project.pbxproj index 314955f5..b130f520 100644 --- a/NADA-iOS-forRelease.xcodeproj/project.pbxproj +++ b/NADA-iOS-forRelease.xcodeproj/project.pbxproj @@ -3,11 +3,10 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ - 2566DBA723D1370275ECE593 /* Pods_NADA_iOS_forRelease.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D86FBA2B7966CFE6EEF0E7E8 /* Pods_NADA_iOS_forRelease.framework */; }; 39007F2C27080D8200E7143E /* UIViewController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39007F2B27080D8200E7143E /* UIViewController+Extension.swift */; }; 3903CC202769F4F40094C458 /* EmptyCardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3903CC1E2769F4F40094C458 /* EmptyCardCell.swift */; }; 3903CC212769F4F40094C458 /* EmptyCardCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3903CC1F2769F4F40094C458 /* EmptyCardCell.xib */; }; @@ -218,6 +217,7 @@ F8FC43BA26C022900033E151 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8FC43B926C022900033E151 /* ViewController.swift */; }; F8FC43BC26C022A20033E151 /* Storyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8FC43BB26C022A20033E151 /* Storyboard.swift */; }; F8FC43BF26C025180033E151 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = F8FC43BE26C025180033E151 /* .swiftlint.yml */; }; + FF46241630BB3F2D09D5A1AF /* Pods_NADA_iOS_forRelease.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F6A2AA0066BA1941116A267 /* Pods_NADA_iOS_forRelease.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -261,7 +261,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 00BC6C525F13C9651D73976F /* Pods-NADA-iOS-forRelease.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NADA-iOS-forRelease.debug.xcconfig"; path = "Target Support Files/Pods-NADA-iOS-forRelease/Pods-NADA-iOS-forRelease.debug.xcconfig"; sourceTree = ""; }; + 0F6A2AA0066BA1941116A267 /* Pods_NADA_iOS_forRelease.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NADA_iOS_forRelease.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B19E918E93248BE054C89A /* Pods-NADA-iOS-forRelease.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NADA-iOS-forRelease.debug.xcconfig"; path = "Target Support Files/Pods-NADA-iOS-forRelease/Pods-NADA-iOS-forRelease.debug.xcconfig"; sourceTree = ""; }; + 19298D75B81F3260A870AB0B /* Pods-NADA-iOS-forRelease.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NADA-iOS-forRelease.release.xcconfig"; path = "Target Support Files/Pods-NADA-iOS-forRelease/Pods-NADA-iOS-forRelease.release.xcconfig"; sourceTree = ""; }; 39007F2B27080D8200E7143E /* UIViewController+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extension.swift"; sourceTree = ""; }; 3903CC1E2769F4F40094C458 /* EmptyCardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCardCell.swift; sourceTree = ""; }; 3903CC1F2769F4F40094C458 /* EmptyCardCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EmptyCardCell.xib; sourceTree = ""; }; @@ -371,15 +373,12 @@ 77F2C0EA27632A91007641E3 /* CardHarmonyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardHarmonyViewController.swift; sourceTree = ""; }; 77F2C0EC27632AA7007641E3 /* CardHarmony.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CardHarmony.storyboard; sourceTree = ""; }; 77F47D92276C79B600414659 /* Header.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; - 78FC1ADEA3CAB995C08D47DB /* Pods-NADA-iOS-forRelease.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NADA-iOS-forRelease.release.xcconfig"; path = "Target Support Files/Pods-NADA-iOS-forRelease/Pods-NADA-iOS-forRelease.release.xcconfig"; sourceTree = ""; }; - D86FBA2B7966CFE6EEF0E7E8 /* Pods_NADA_iOS_forRelease.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NADA_iOS_forRelease.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F805588429C993E7002E8EA3 /* UpdateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateViewController.swift; sourceTree = ""; }; F80C679129F21BB7002C5ECC /* onboarding01.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = onboarding01.json; sourceTree = ""; }; F80C679229F21BB7002C5ECC /* onboarding02.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = onboarding02.json; sourceTree = ""; }; F81171FF27383097002742CF /* ChangeGroupRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeGroupRequest.swift; sourceTree = ""; }; F822E7A82709CEB60020452C /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; F8268DB827730B0100BF114B /* FirstCardAlertBottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstCardAlertBottomSheetViewController.swift; sourceTree = ""; }; - F82AF6A029FBBAF50051545B /* IntentsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = IntentsExtension.entitlements; sourceTree = ""; }; F82AF6A129FBBEE50051545B /* UserDefaults+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Extension.swift"; sourceTree = ""; }; F82FEB4A27639F3100DA7847 /* MainCardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainCardCell.swift; sourceTree = ""; }; F82FEB4B27639F3100DA7847 /* MainCardCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainCardCell.xib; sourceTree = ""; }; @@ -510,7 +509,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2566DBA723D1370275ECE593 /* Pods_NADA_iOS_forRelease.framework in Frameworks */, + FF46241630BB3F2D09D5A1AF /* Pods_NADA_iOS_forRelease.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -520,8 +519,8 @@ 186051B2C99DBAECC539DAC9 /* Pods */ = { isa = PBXGroup; children = ( - 00BC6C525F13C9651D73976F /* Pods-NADA-iOS-forRelease.debug.xcconfig */, - 78FC1ADEA3CAB995C08D47DB /* Pods-NADA-iOS-forRelease.release.xcconfig */, + 13B19E918E93248BE054C89A /* Pods-NADA-iOS-forRelease.debug.xcconfig */, + 19298D75B81F3260A870AB0B /* Pods-NADA-iOS-forRelease.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -748,7 +747,7 @@ F838B661298E5C5300D84340 /* SwiftUI.framework */, F87D2229298ECAFB001A882B /* Intents.framework */, F87D2234298ECAFB001A882B /* IntentsUI.framework */, - D86FBA2B7966CFE6EEF0E7E8 /* Pods_NADA_iOS_forRelease.framework */, + 0F6A2AA0066BA1941116A267 /* Pods_NADA_iOS_forRelease.framework */, ); name = Frameworks; sourceTree = ""; @@ -1517,13 +1516,13 @@ isa = PBXNativeTarget; buildConfigurationList = F8FC439626C01CDE0033E151 /* Build configuration list for PBXNativeTarget "NADA-iOS-forRelease" */; buildPhases = ( - 63B126249E7D65994A592714 /* [CP] Check Pods Manifest.lock */, + 968E60C36CA3B9A2790CB1AA /* [CP] Check Pods Manifest.lock */, F8FC437E26C01CDD0033E151 /* Sources */, F8FC437F26C01CDD0033E151 /* Frameworks */, F8FC438026C01CDD0033E151 /* Resources */, F8FC43BD26C0244D0033E151 /* ShellScript */, F838B673298E5C5400D84340 /* Embed Foundation Extensions */, - 2FD8F2B3BF35A3CA09A8E81C /* [CP] Embed Pods Frameworks */, + 3DFB37457B9A5C839910082B /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -1543,8 +1542,9 @@ F8FC437A26C01CDD0033E151 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1250; + LastUpgradeCheck = 1430; TargetAttributes = { F838B65D298E5C5300D84340 = { CreatedOnToolsVersion = 14.2; @@ -1669,7 +1669,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2FD8F2B3BF35A3CA09A8E81C /* [CP] Embed Pods Frameworks */ = { + 3DFB37457B9A5C839910082B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1686,7 +1686,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NADA-iOS-forRelease/Pods-NADA-iOS-forRelease-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 63B126249E7D65994A592714 /* [CP] Check Pods Manifest.lock */ = { + 968E60C36CA3B9A2790CB1AA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2278,7 +2278,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.2; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = "YJC.NADA-iOS-forRelease"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match Development YJC.NADA-iOS-forRelease"; @@ -2307,7 +2307,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.2; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = "YJC.NADA-iOS-forRelease"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore YJC.NADA-iOS-forRelease"; diff --git a/NADA-iOS-forRelease.xcodeproj/xcshareddata/xcschemes/IntentsExtension.xcscheme b/NADA-iOS-forRelease.xcodeproj/xcshareddata/xcschemes/IntentsExtension.xcscheme index e859c310..d93c9ea0 100644 --- a/NADA-iOS-forRelease.xcodeproj/xcshareddata/xcschemes/IntentsExtension.xcscheme +++ b/NADA-iOS-forRelease.xcodeproj/xcshareddata/xcschemes/IntentsExtension.xcscheme @@ -1,6 +1,6 @@ - NSLocationWhenInUseUsageDescription - "사용자의 위치를 받아오려고 합니다." - NSLocationAlwaysAndWhenInUseUsageDescription - "사용자의 위치를 받아오려고 합니다." CFBundleDevelopmentRegion ko_KR CFBundleDisplayName @@ -52,6 +48,10 @@ NSCameraUsageDescription QR코드를 인식하여 명함을 추가하기 위해 카메라 권한 허용이 필요해요. + NSLocationAlwaysAndWhenInUseUsageDescription + "사용자의 위치를 받아오려고 합니다." + NSLocationWhenInUseUsageDescription + "사용자의 위치를 받아오려고 합니다." NSPhotoLibraryAddUsageDescription 명함을 이미지로 저장하기 위해 갤러리 권한 허용이 필요해요. NSPhotoLibraryUsageDescription diff --git a/NADA-iOS-forRelease/Resouces/Extensions/UserDefaults+Extension.swift b/NADA-iOS-forRelease/Resouces/Extensions/UserDefaults+Extension.swift index 50258ba6..dfc14713 100644 --- a/NADA-iOS-forRelease/Resouces/Extensions/UserDefaults+Extension.swift +++ b/NADA-iOS-forRelease/Resouces/Extensions/UserDefaults+Extension.swift @@ -8,5 +8,5 @@ import Foundation extension UserDefaults { - static var appGroup = UserDefaults(suiteName: "group.NADA-iOS-forRelease")! + static var appGroup = UserDefaults(suiteName: "group.YJC.NADA-iOS-forRelease")! } diff --git a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift index 28d74be2..99542de4 100644 --- a/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift +++ b/NADA-iOS-forRelease/Sources/NetworkService/Group/GroupAPI.swift @@ -16,7 +16,7 @@ public class GroupAPI { public init() { } func cardDeleteInGroup(cardUUID: String, cardGroupName: String, completion: @escaping (NetworkResult) -> Void) { - groupProvider.request(.cardDeleteInGroup(cardUuid: cardUUID, cardGroupName: cardGroupName)) { (result) in + groupProvider.request(.cardDeleteInGroup(cardUUID: cardUUID, cardGroupName: cardGroupName)) { (result) in switch result { case .success(let response): let statusCode = response.statusCode diff --git a/Podfile.lock b/Podfile.lock index 1a7a2874..7913bae5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,17 +1,17 @@ PODS: - Alamofire (5.6.4) - - Firebase/CoreOnly (10.8.0): - - FirebaseCore (= 10.8.0) - - Firebase/DynamicLinks (10.8.0): + - Firebase/CoreOnly (10.9.0): + - FirebaseCore (= 10.9.0) + - Firebase/DynamicLinks (10.9.0): - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 10.8.0) - - FirebaseCore (10.8.0): + - FirebaseDynamicLinks (~> 10.9.0) + - FirebaseCore (10.9.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreInternal (10.8.0): + - FirebaseCoreInternal (10.9.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseDynamicLinks (10.8.0): + - FirebaseDynamicLinks (10.9.0): - FirebaseCore (~> 10.0) - FlexLayout (1.3.31) - GoogleUtilities/Environment (7.11.1): @@ -32,7 +32,7 @@ PODS: - KakaoSDKUser (2.15.0): - KakaoSDKAuth (= 2.15.0) - Kingfisher (7.6.2) - - lottie-ios (4.1.3) + - lottie-ios (4.2.0) - Moya (15.0.0): - Moya/Core (= 15.0.0) - Moya/Core (15.0.0): @@ -122,10 +122,10 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 4e95d97098eacb88856099c4fc79b526a299e48c - Firebase: b49ef44e5ec9a3d0c1f6450f410337e97872279c - FirebaseCore: e78636a990b54be427ce300aa09a0e359f4e0e87 - FirebaseCoreInternal: fa2899eb1f340054858d289e5a0fb935a0a74e52 - FirebaseDynamicLinks: 8c7e16503fd057c44727b6bc8dc8e7ff2a667955 + Firebase: bd152f0f3d278c4060c5c71359db08ebcfd5a3e2 + FirebaseCore: b68d3616526ec02e4d155166bbafb8eca64af557 + FirebaseCoreInternal: d2b4acb827908e72eca47a9fd896767c3053921e + FirebaseDynamicLinks: 8cb66c4f403aa6ddf86ff3bc3c383a652f344ce9 FlexLayout: 8010187077ecf09710cdf0e9c8ffe2c9b92ec5db GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 IQKeyboardManagerSwift: c7955c0bdbf7b2eb29bb7daaa44e3d90f55a9a85 @@ -133,7 +133,7 @@ SPEC CHECKSUMS: KakaoSDKCommon: 89d863b7f34398e6fb93a0acb28a204908551a39 KakaoSDKUser: a997ca5c4c18ece2ab30646ff74841bc29d4399d Kingfisher: 6c5449c6450c5239166510ba04afe374a98afc4f - lottie-ios: d0954d3150061f662ed0adf96ef98d7421864c47 + lottie-ios: 809ecf2d460ed650a6aed7aa88b2ec45fab4779c Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee NVActivityIndicatorView: 1f6c5687f1171810aa27a3296814dc2d7dec3667 PinLayout: f8a677ce0cd1cfe96b58435d029b4ceb4ce9c04c @@ -153,4 +153,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 6aac9570b93049853d9fa383fd5b608dbdbcd63d -COCOAPODS: 1.12.0 +COCOAPODS: 1.12.1 diff --git a/Widgets/Resource/Widgets.intentdefinition b/Widgets/Resource/Widgets.intentdefinition index 969bf8f1..6a4b22df 100644 --- a/Widgets/Resource/Widgets.intentdefinition +++ b/Widgets/Resource/Widgets.intentdefinition @@ -9,7 +9,7 @@ INIntentDefinitionNamespace 88xZPY INIntentDefinitionSystemVersion - 22D68 + 22E261 INIntentDefinitionToolsBuildVersion 14E222b INIntentDefinitionToolsVersion @@ -19,6 +19,8 @@ INIntentCategory information + INIntentDescription + 내 명함 INIntentDescriptionID tVvJ9c INIntentEligibleForWidgets From b69864809aa852c74c8e126fd32cde340a288608 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Thu, 4 May 2023 23:48:54 +0900 Subject: [PATCH 06/18] chore: pod update (#470) --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index 7913bae5..a1f91842 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -153,4 +153,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 6aac9570b93049853d9fa383fd5b608dbdbcd63d -COCOAPODS: 1.12.1 +COCOAPODS: 1.12.0 From ca4640ebbdf3b3059a8ecc91fe78ed47782344de Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 00:28:50 +0900 Subject: [PATCH 07/18] =?UTF-8?q?fix:=20=EC=98=A8=EB=B3=B4=EB=94=A9,=20?= =?UTF-8?q?=EC=95=A1=EC=84=B8=EC=8A=A4=20=ED=86=A0=ED=81=B0=20UserDefaults?= =?UTF-8?q?=20key=20=EB=B3=80=EA=B2=BD=20(#489)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift index ce9e93cb..a5ed3cb4 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift @@ -12,13 +12,12 @@ extension Const { static let darkModeState = "darkModeState" static let userID = "userID" static let isFirstCard = "isFirstCard" - static let isOnboarding = "isOnboarding" + static let isOnboarding = "isOnboardingAvailable" static let firstCardID = "firstCardID" static let isAppleLogin = "isAppleLogin" static let isKakaoLogin = "isKakaoLogin" static let dynamicLinkCardUUID = "dynamicLinkCardUUID" - // TODO: - KeyChain 적용 - static let accessToken = "accessToken" + static let accessToken = "AccessToken" static let refreshToken = "refreshToken" } } From da90192430e0f45702cc6de49b4a99a0fef01bb7 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 01:59:20 +0900 Subject: [PATCH 08/18] =?UTF-8?q?feat:=20=EC=95=B1=20=EB=9F=B0=EC=B9=98=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=84=EC=A0=AF=20=EC=A0=91=EA=B7=BC=20=EA=B0=90?= =?UTF-8?q?=EC=A7=80=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/SceneDelegate.swift | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/SceneDelegate.swift b/NADA-iOS-forRelease/Sources/SceneDelegate.swift index efb35e8d..a3156d1b 100644 --- a/NADA-iOS-forRelease/Sources/SceneDelegate.swift +++ b/NADA-iOS-forRelease/Sources/SceneDelegate.swift @@ -17,7 +17,23 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? let defaults = UserDefaults.standard + private let myCardURL = "openMyCardWidget" + private let qrCodeURL = "openQRCodeWidget" + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + + if let url = connectionOptions.urlContexts.first?.url { + if url.absoluteString == qrCodeURL { + UserDefaults.standard.setValue(true, forKey: Const.UserDefaultsKey.openQRCodeWidget) + } else if url.absoluteString.starts(with: myCardURL) { + guard let queryItems = URLComponents(string: url.absoluteString)?.queryItems, + let cardUUID = queryItems.filter({ $0.name == "cardUUID" }).first?.value else { return } + + UserDefaults.standard.setValue(true, forKey: Const.UserDefaultsKey.openMyCardWidget) + UserDefaults.standard.setValue(cardUUID, forKey: Const.UserDefaultsKey.widgetCardUUID) + } + } + guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(frame: windowScene.coordinateSpace.bounds) @@ -46,9 +62,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { - let myCardURL = "openMyCardWidget" - let qrCodeURL = "openQRCodeWidget" - guard let url = URLContexts.first?.url, let urlComponents = URLComponents(string: url.absoluteString) else { return } From 2fb88f16c0dc6f241242dc88f86987d0566afc28 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 02:00:35 +0900 Subject: [PATCH 09/18] =?UTF-8?q?add:=20=EC=9C=84=EC=A0=AF=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20UserDefaults=20key=20=EC=B6=94=EA=B0=80=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift index a5ed3cb4..44501beb 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/UserDefaults.swift @@ -18,6 +18,9 @@ extension Const { static let isKakaoLogin = "isKakaoLogin" static let dynamicLinkCardUUID = "dynamicLinkCardUUID" static let accessToken = "AccessToken" + static let openQRCodeWidget = "openQRCodeWidget" + static let openMyCardWidget = "openMyCardWidget" + static let widgetCardUUID = "widgetCardUUID" static let refreshToken = "refreshToken" } } From e90f8d1fbf472c161fa73312cc28e63fbb0d6519 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 11:23:30 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat:=20=ED=99=88=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=9D=84=20=ED=86=B5=ED=95=B4=20QR=20?= =?UTF-8?q?=EC=8A=A4=EC=BA=94=20=ED=99=94=EB=A9=B4=EC=A0=84=ED=99=98=20(#4?= =?UTF-8?q?70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/VC/HomeViewController.swift | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift index 42687fc1..c66993c6 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift @@ -232,6 +232,33 @@ extension HomeViewController { cardDetailVC.cardDataModel = cardDataModel self.present(cardDetailVC, animated: true) } + + private func presentQRScanVC() { + switch AVCaptureDevice.authorizationStatus(for: .video) { + case .denied: + makeOKCancelAlert(title: "카메라 권한이 허용되어 있지 않아요.", + message: "QR코드 인식을 위해 카메라 권한이 필요합니다. 앱 설정으로 이동해 허용해 주세요.", + okAction: { _ in UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)}, + cancelAction: nil, + completion: nil) + case .authorized: + guard let nextVC = UIStoryboard.init(name: Const.Storyboard.Name.qrScan, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.qrScanViewController) as? QRScanViewController else { return } + nextVC.modalPresentationStyle = .overFullScreen + self.present(nextVC, animated: true, completion: nil) + case .notDetermined: + AVCaptureDevice.requestAccess(for: .video) { granted in + if granted { + DispatchQueue.main.async { + guard let nextVC = UIStoryboard.init(name: Const.Storyboard.Name.qrScan, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.Identifier.qrScanViewController) as? QRScanViewController else { return } + nextVC.modalPresentationStyle = .overFullScreen + self.present(nextVC, animated: true, completion: nil) + } + } + } + default: + break + } + } } // MARK: - Network From 7756e625d4e8685aad982caf9fbd66f51f392f98 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 11:23:46 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=ED=99=88=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=9D=84=20=ED=86=B5=ED=95=B4=20=EB=AA=85?= =?UTF-8?q?=ED=95=A8=20=EA=B3=B5=EC=9C=A0=20=ED=99=94=EB=A9=B4=EC=A0=84?= =?UTF-8?q?=ED=99=98=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/VC/HomeViewController.swift | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift index c66993c6..f7a2094b 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift @@ -259,6 +259,20 @@ extension HomeViewController { break } } + + private func presentCardShareBottomSheetVC(with cardUUID: String) { + self.cardDetailFetchWithAPI(cardUUID: cardUUID) { [weak self] cardDataModel in + let nextVC = CardShareBottomSheetViewController() + .setTitle("명함공유") + .setHeight(606.0) + + nextVC.isActivate = false + nextVC.modalPresentationStyle = .overFullScreen + nextVC.cardDataModel = cardDataModel + + self?.present(nextVC, animated: true) + } + } } // MARK: - Network From b58adf3e78747a3be04ddbcf66d2e4bfc49ca9c3 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Fri, 5 May 2023 11:24:32 +0900 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20UserDefaults=20=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=B4=EC=84=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=ED=8C=90=EB=8B=A8=20=ED=9B=84=EC=97=90=20?= =?UTF-8?q?=EC=9C=84=EC=A0=AF=ED=86=B5=ED=95=B4=EC=84=9C=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EA=B5=AC=ED=98=84=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/VC/HomeViewController.swift | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift index f7a2094b..b7b9266b 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Home/VC/HomeViewController.swift @@ -5,6 +5,7 @@ // Created by Yi Joon Choi on 2023/02/06. // +import Photos import UIKit import RxSwift @@ -66,7 +67,7 @@ final class HomeViewController: UIViewController { super.viewDidLoad() setLayout() bindActions() - checkUpdateVersion() + checkUpdateVersionAndSetting() } override func viewWillAppear(_ animated: Bool) { @@ -175,7 +176,7 @@ extension HomeViewController { }.disposed(by: self.disposeBag) } - private func checkUpdateVersion() { + private func checkUpdateVersionAndSetting() { updateUserInfoFetchWithAPI { [weak self] checkUpdateNote in if !checkUpdateNote { self?.updateNoteFetchWithAPI { [weak self] updateNote in @@ -186,12 +187,36 @@ extension HomeViewController { if let dynamicLinkCardUUID = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.dynamicLinkCardUUID) { self?.checkDynamicLink(dynamicLinkCardUUID) } + + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.openQRCodeWidget) { + self?.presentQRScanVC() + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.openQRCodeWidget) + } + + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.openMyCardWidget), + let widgetCardUUID = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.widgetCardUUID) { + self?.presentCardShareBottomSheetVC(with: widgetCardUUID) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.openMyCardWidget) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.widgetCardUUID) + } } } } else { if let dynamicLinkCardUUID = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.dynamicLinkCardUUID) { self?.checkDynamicLink(dynamicLinkCardUUID) } + + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.openQRCodeWidget) { + self?.presentQRScanVC() + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.openQRCodeWidget) + } + + if UserDefaults.standard.bool(forKey: Const.UserDefaultsKey.openMyCardWidget), + let widgetCardUUID = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.widgetCardUUID) { + self?.presentCardShareBottomSheetVC(with: widgetCardUUID) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.openMyCardWidget) + UserDefaults.standard.removeObject(forKey: Const.UserDefaultsKey.widgetCardUUID) + } } } } From 277ba6e0995082fc53c2f2b9502af4cb981467a6 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Sat, 6 May 2023 21:17:01 +0900 Subject: [PATCH 13/18] =?UTF-8?q?delete:=20=EA=B8=B0=EB=B3=B8=EB=8F=99?= =?UTF-8?q?=EC=9E=91=EC=97=90=EC=84=9C=20=EC=84=9C=EB=B2=84=ED=86=B5?= =?UTF-8?q?=EC=8B=A0=20=EC=82=AD=EC=A0=9C=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntentsExtension/IntentHandler.swift | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index cac35de2..93b7c001 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -17,18 +17,6 @@ class IntentHandler: INExtension { // This is the default implementation. If you want different objects to handle different intents, // you can override this and return the handler you want for that particular intent. - cardListFetchWithAPI { [weak self] result in - switch result { - case .success(let result): - if let result { - self?.cardItems = result.data - print(self?.cardItems) - } - case .failure(let err): - print(err) - } - } - return self } } From 8ef3792df2d0d935462ce119054feb6f37edeff7 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Sat, 6 May 2023 21:17:48 +0900 Subject: [PATCH 14/18] =?UTF-8?q?refactor:=20=EB=82=B4=20=EB=AA=85?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=EB=A1=9D=20=EC=84=A0=ED=83=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - result.data 를 옵셔널 바인딩하여 바로 사용. --- IntentsExtension/IntentHandler.swift | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index 93b7c001..633529dc 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -24,23 +24,19 @@ class IntentHandler: INExtension { extension IntentHandler: MyCardIntentHandling { // 내 명함 목록 선택할 때 호출. func provideMyCardOptionsCollection(for intent: MyCardIntent, with completion: @escaping (INObjectCollection?, Error?) -> Void) { - cardListFetchWithAPI { [weak self] result in + cardListFetchWithAPI { result in switch result { case .success(let result): - if let result { - self?.cardItems = result.data - - if let cardItems = self?.cardItems { - let myCards = cardItems.map { card in - let myCard = MyCard(identifier: card.cardUUID, display: card.cardName) - myCard.userName = card.userName - myCard.cardImage = card.cardImage - - return myCard - } - let collection = INObjectCollection(items: myCards) - completion(collection, nil) + if let cardItems = result?.data { + let myCards = cardItems.map { card in + let myCard = MyCard(identifier: card.cardUUID, display: card.cardName) + myCard.userName = card.userName + myCard.cardImage = card.cardImage + + return myCard } + let collection = INObjectCollection(items: myCards) + completion(collection, nil) } case .failure(let err): print(err) From ec7cf6559f12d016d86c63ebef5cc04d8bdf7a15 Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Sat, 6 May 2023 21:18:30 +0900 Subject: [PATCH 15/18] =?UTF-8?q?feat:=20=EC=9C=84=EC=A0=AF=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=EA=B0=92=20=EC=84=A4=EC=A0=95=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntentsExtension/IntentHandler.swift | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index 633529dc..9c660f0b 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -44,10 +44,24 @@ extension IntentHandler: MyCardIntentHandling { } } - // 위젯 편집할때 호출. 기본값 설정. + // 위젯 추가할때 호출. 기본값 설정. func defaultMyCard(for intent: MyCardIntent) -> MyCard? { var myCard: MyCard? + cardListFetchWithAPI { [weak self] result in + switch result { + case .success(let result): + if let result { + self?.cardItems = result.data + myCard = MyCard(identifier: self?.cardItems?[0].cardUUID ?? "", display: self?.cardItems?[0].cardName ?? "") + myCard?.userName = self?.cardItems?[0].userName + myCard?.cardImage = self?.cardItems?[0].cardImage + } + case .failure(let err): + print(err) + } + } + if let cardItems { myCard = MyCard(identifier: cardItems[0].cardUUID, display: cardItems[0].cardName) } From fca8a7cb0b477c32b55d9daade29db593e3cf81f Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Mon, 8 May 2023 14:29:30 +0900 Subject: [PATCH 16/18] =?UTF-8?q?feat:=20=EC=9C=84=EC=A0=AF=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=EA=B0=92=20=EC=84=A4=EC=A0=95=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 서버통신의 결과를 동기적으로 사용하기 위해서 DispatchGroup 을 사용. - 비동기 통신이기 때문에 group 의 enter,leave 사용. - 60초까지만 기다리기로 함. --- IntentsExtension/IntentHandler.swift | 31 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index 9c660f0b..a6a8fd3e 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -48,23 +48,28 @@ extension IntentHandler: MyCardIntentHandling { func defaultMyCard(for intent: MyCardIntent) -> MyCard? { var myCard: MyCard? - cardListFetchWithAPI { [weak self] result in - switch result { - case .success(let result): - if let result { - self?.cardItems = result.data - myCard = MyCard(identifier: self?.cardItems?[0].cardUUID ?? "", display: self?.cardItems?[0].cardName ?? "") - myCard?.userName = self?.cardItems?[0].userName - myCard?.cardImage = self?.cardItems?[0].cardImage + let group = DispatchGroup() + + DispatchQueue.global().async(group: group) { [weak self] in + group.enter() + + self?.cardListFetchWithAPI { [weak self] result in + switch result { + case .success(let result): + if let result { + self?.cardItems = result.data + myCard = MyCard(identifier: self?.cardItems?[0].cardUUID ?? "", display: self?.cardItems?[0].cardName ?? "") + myCard?.userName = self?.cardItems?[0].userName + myCard?.cardImage = self?.cardItems?[0].cardImage + } + case .failure(let err): + print(err) } - case .failure(let err): - print(err) + group.leave() } } - if let cardItems { - myCard = MyCard(identifier: cardItems[0].cardUUID, display: cardItems[0].cardName) - } + _ = group.wait(timeout: .now() + 60) return myCard } From eb984d039dcea1541a033c572e07cfcad1bc697b Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Mon, 8 May 2023 14:47:59 +0900 Subject: [PATCH 17/18] =?UTF-8?q?feat:=20=EB=82=B4=20=EB=AA=85=ED=95=A8=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=EC=84=B1=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=EC=8B=9C=EC=97=90=20nil=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntentsExtension/IntentHandler.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index a6a8fd3e..6f087ebb 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -40,6 +40,7 @@ extension IntentHandler: MyCardIntentHandling { } case .failure(let err): print(err) + completion(nil, nil) } } } From d319c7fa92b3e1507d82dd22742de2807683b0ad Mon Sep 17 00:00:00 2001 From: hyun99999 Date: Mon, 8 May 2023 14:49:27 +0900 Subject: [PATCH 18/18] =?UTF-8?q?feat:=20=EC=84=9C=EB=B2=84=ED=86=B5?= =?UTF-8?q?=EC=8B=A0=20=EC=84=B1=EA=B3=B5=20=ED=9B=84=20status=20200=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EC=97=90=EB=9F=AC=20=EC=9E=A1=EA=B8=B0=20?= =?UTF-8?q?(#470)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IntentsExtension/IntentHandler.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/IntentsExtension/IntentHandler.swift b/IntentsExtension/IntentHandler.swift index 6f087ebb..6fe01160 100644 --- a/IntentsExtension/IntentHandler.swift +++ b/IntentsExtension/IntentHandler.swift @@ -107,7 +107,13 @@ extension IntentHandler { message: result?.message ?? "none message"))) } else { if let result { - completion(.success(result)) + if result.status != 200 { + completion(.failure(WidgetError.networkFail(status: status, + code: result.code ?? "none code", + message: result.message ?? "none message"))) + } else { + completion(.success(result)) + } } else { completion(.failure(WidgetError.decodeFail(status: status))) }