diff --git a/Runnect-iOS/Podfile b/Runnect-iOS/Podfile index 3544d927..c9ac53f9 100644 --- a/Runnect-iOS/Podfile +++ b/Runnect-iOS/Podfile @@ -13,6 +13,9 @@ target 'Runnect-iOS' do pod 'KakaoSDKCommon' pod 'KakaoSDKAuth' pod 'KakaoSDKUser' + pod 'KakaoSDKShare' + pod 'KakaoSDKTemplate' + pod 'FirebaseDynamicLinks' # Pods for Runnect-iOS diff --git a/Runnect-iOS/Podfile.lock b/Runnect-iOS/Podfile.lock index 90f88404..5b4d89c1 100644 --- a/Runnect-iOS/Podfile.lock +++ b/Runnect-iOS/Podfile.lock @@ -1,30 +1,52 @@ PODS: - - Alamofire (5.6.4) - - KakaoSDKAuth (2.14.0): - - KakaoSDKCommon (= 2.14.0) - - KakaoSDKCommon (2.14.0): - - KakaoSDKCommon/Common (= 2.14.0) - - KakaoSDKCommon/Network (= 2.14.0) - - KakaoSDKCommon/Common (2.14.0) - - KakaoSDKCommon/Network (2.14.0): + - Alamofire (5.7.1) + - FirebaseCore (10.14.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.14.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseDynamicLinks (10.14.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (7.11.5): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.11.5): + - GoogleUtilities/Environment + - "GoogleUtilities/NSData+zlib (7.11.5)" + - KakaoSDKAuth (2.16.0): + - KakaoSDKCommon (= 2.16.0) + - KakaoSDKCommon (2.16.0): + - KakaoSDKCommon/Common (= 2.16.0) + - KakaoSDKCommon/Network (= 2.16.0) + - KakaoSDKCommon/Common (2.16.0) + - KakaoSDKCommon/Network (2.16.0): - Alamofire (~> 5.1) - - KakaoSDKCommon/Common (= 2.14.0) - - KakaoSDKUser (2.14.0): - - KakaoSDKAuth (= 2.14.0) - - Kingfisher (7.4.1) + - KakaoSDKCommon/Common (= 2.16.0) + - KakaoSDKShare (2.16.0): + - KakaoSDKCommon (= 2.16.0) + - KakaoSDKTemplate (= 2.16.0) + - KakaoSDKTemplate (2.16.0): + - KakaoSDKCommon/Common (= 2.16.0) + - KakaoSDKUser (2.16.0): + - KakaoSDKAuth (= 2.16.0) + - Kingfisher (7.9.0) - Moya (15.0.0): - Moya/Core (= 15.0.0) - Moya/Core (15.0.0): - Alamofire (~> 5.0) - NMapsGeometry (1.0.1) - - NMapsMap (3.16.1): + - NMapsMap (3.17.0): - NMapsGeometry + - PromisesObjC (2.3.1) - SnapKit (5.6.0) - Then (3.0.0) DEPENDENCIES: + - FirebaseDynamicLinks - KakaoSDKAuth - KakaoSDKCommon + - KakaoSDKShare + - KakaoSDKTemplate - KakaoSDKUser - Kingfisher (~> 7.0) - Moya (~> 15.0) @@ -35,28 +57,42 @@ DEPENDENCIES: SPEC REPOS: trunk: - Alamofire + - FirebaseCore + - FirebaseCoreInternal + - FirebaseDynamicLinks + - GoogleUtilities - KakaoSDKAuth - KakaoSDKCommon + - KakaoSDKShare + - KakaoSDKTemplate - KakaoSDKUser - Kingfisher - Moya - NMapsGeometry - NMapsMap + - PromisesObjC - SnapKit - Then SPEC CHECKSUMS: - Alamofire: 4e95d97098eacb88856099c4fc79b526a299e48c - KakaoSDKAuth: 8fca87815de22062a23297983f327613b087b8bb - KakaoSDKCommon: 0ce638f7a2e49704943c0b74a087a9f8067bba1c - KakaoSDKUser: 2ca18314ce72e6690f76cb1f6f9fbc771d31a803 - Kingfisher: cd762a593a61b2fbecf7645c00f9a801a3ebfc9c + Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88 + FirebaseCore: 6fc17ac9f03509d51c131298aacb3ee5698b4f02 + FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3 + FirebaseDynamicLinks: 0eaabff2d0e5d0e576c0227227b00771aa2f3aaf + GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 + KakaoSDKAuth: 1b85ed7c41b0517bfd1fc9dc46c292c75b8cb610 + KakaoSDKCommon: d6579aa2e9d963d74e13d741cbf1cce48b8b0c17 + KakaoSDKShare: efc0415c4f33274232604eeaf96fb03641facdca + KakaoSDKTemplate: 7e478a3cda6f5879b475546bfcd667b464fbb6d0 + KakaoSDKUser: 427e5b3884abd19ee6d9a7bd6e3f3029eb2968b8 + Kingfisher: 59f908b6d2f403b0a3e539debb0eec05cb27002c Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee NMapsGeometry: 53c573ead66466681cf123f99f698dc8071a4b83 - NMapsMap: 926c3a303d381a24bec8da3cd6e198f50af93ae9 + NMapsMap: a5b909a31b6f3d27a670f6eb2ddc913c38975474 + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25 Then: 844265ae87834bbe1147d91d5d41a404da2ec27d -PODFILE CHECKSUM: fd71a741af1234cbd39c9117a0768b376c78640a +PODFILE CHECKSUM: 43e89e9e217761b44c0c7e93fb4abfab29a82ece COCOAPODS: 1.12.1 diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index 8be6e36b..52db7cbc 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 0AEBD608F3973389E8E1C6D6 /* Pods_Runnect_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 015778D02D5CDE0838284CD7 /* Pods_Runnect_iOS.framework */; }; + 7110A6022AA33624009A7E99 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7110A6012AA33624009A7E99 /* GoogleService-Info.plist */; }; 712F661D2A7B7BAB00D9539B /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 712F661C2A7B7BAB00D9539B /* Config.swift */; }; A3305A97296EF58C000B1A10 /* GoalRewardInfoDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3305A96296EF58C000B1A10 /* GoalRewardInfoDto.swift */; }; A3BC2F2B2962C3D500198261 /* GoalRewardInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3BC2F2A2962C3D500198261 /* GoalRewardInfoVC.swift */; }; @@ -163,6 +164,8 @@ /* Begin PBXFileReference section */ 015778D02D5CDE0838284CD7 /* Pods_Runnect_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runnect_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3C3033C911343B5C57EB68E7 /* Pods-Runnect-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runnect-iOS.debug.xcconfig"; path = "Target Support Files/Pods-Runnect-iOS/Pods-Runnect-iOS.debug.xcconfig"; sourceTree = ""; }; + 7110A6012AA33624009A7E99 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 7110A6032AA337DD009A7E99 /* Runnect-iOSDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Runnect-iOSDebug.entitlements"; sourceTree = ""; }; 712F661C2A7B7BAB00D9539B /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; A3305A96296EF58C000B1A10 /* GoalRewardInfoDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalRewardInfoDto.swift; sourceTree = ""; }; A3BC2F2A2962C3D500198261 /* GoalRewardInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalRewardInfoVC.swift; sourceTree = ""; }; @@ -792,11 +795,13 @@ CE4545C7295D7AF4003201E1 /* Runnect-iOS */ = { isa = PBXGroup; children = ( + 7110A6032AA337DD009A7E99 /* Runnect-iOSDebug.entitlements */, A3E55BA529C8AB0A0000D85D /* Runnect-iOS.entitlements */, CE6655AA295D7FAE00C64E12 /* Global */, CE6655A9295D7FAA00C64E12 /* Network */, CE6655A8295D7F7D00C64E12 /* Presentation */, CE4545D6295D7AF5003201E1 /* Info.plist */, + 7110A6012AA33624009A7E99 /* GoogleService-Info.plist */, ); path = "Runnect-iOS"; sourceTree = ""; @@ -941,8 +946,8 @@ CE6655AF295D7FF600C64E12 /* Foundation */ = { isa = PBXGroup; children = ( - CE5875A1296015A2005D967E /* NetworkLoggerPlugin.swift */, CE40BB1D2968054F0030ABCA /* BaseResponse.swift */, + CE5875A1296015A2005D967E /* NetworkLoggerPlugin.swift */, CE40BB1F296805F70030ABCA /* NetworkResult.swift */, CE40BB21296806140030ABCA /* NetworkHelper.swift */, 712F661C2A7B7BAB00D9539B /* Config.swift */, @@ -1043,8 +1048,8 @@ CE9291262965D0ED0010959C /* StatsInfoView.swift */, CE6B63D729673450003F900F /* ListEmptyView.swift */, CEB0BCBB29D123350048CCD5 /* GuideView.swift */, - A3C2CAD629E53B2900EC525B /* RNAlertVC.swift */, CED791B22A2626AF001BFCFB /* ShadowView.swift */, + A3C2CAD629E53B2900EC525B /* RNAlertVC.swift */, ); path = UIComponents; sourceTree = ""; @@ -1246,6 +1251,7 @@ files = ( CE665615295D989A00C64E12 /* .swiftlint.yml in Resources */, CE17F0342961BEF800E1DED0 /* Pretendard-Bold.otf in Resources */, + 7110A6022AA33624009A7E99 /* GoogleService-Info.plist in Resources */, CE17F0352961BEF800E1DED0 /* Pretendard-SemiBold.otf in Resources */, CE17F0332961BEF800E1DED0 /* Pretendard-Medium.otf in Resources */, CE6655BF295D82E200C64E12 /* .gitkeep in Resources */, @@ -1601,7 +1607,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "Runnect-iOS/Runnect-iOS.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Runnect-iOS/Runnect-iOSDebug.entitlements"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; @@ -1643,7 +1649,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "Runnect-iOS/Runnect-iOS.entitlements"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9K86FQHDLU; @@ -1658,6 +1664,7 @@ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1666,7 +1673,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.runnect.Runnect-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.runnect.Runnect-iOS"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.runnect.Runnect-iOS"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift index 0b1b7551..48a90d33 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift @@ -46,6 +46,11 @@ enum ImageLiterals { static var icPlus: UIImage { .load(named: "ic_plus") } static var icCheck: UIImage { .load(named: "ic_check") } static var icCheckFill: UIImage { .load(named: "ic_check_fill") } + static var icFollowButton: UIImage {.load(named: "ic_follow_button")} + static var icFollowedButton: UIImage {.load(named: "ic_followed_button")} + static var icShareButton: UIImage {.load(named: "ic_share")} + static var icSelectMapButton: UIImage {.load(named: "ic_select_map")} + static var icSelectNowButton: UIImage {.load(named: "ic_select_now")} // img static var imgBackground: UIImage { .load(named: "img_background") } diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Contents.json new file mode 100644 index 00000000..42f4bfe2 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Property 1=follow 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=follow 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=follow 2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2.png new file mode 100644 index 00000000..9617123e Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@2x.png new file mode 100644 index 00000000..c26de0ec Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@3x.png new file mode 100644 index 00000000..431649f2 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_follow_button.imageset/Property 1=follow 2@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/Contents.json new file mode 100644 index 00000000..d36887c9 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "follow 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "follow 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "follow 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1.png new file mode 100644 index 00000000..052f7e5b Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@2x.png new file mode 100644 index 00000000..77099314 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@3x.png new file mode 100644 index 00000000..7e3eef35 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_followed_button.imageset/follow 1@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/Contents.json new file mode 100644 index 00000000..a15a5dbc --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "btn_start map.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btn_start map@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btn_start map@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map.png new file mode 100644 index 00000000..843b9cfe Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@2x.png new file mode 100644 index 00000000..bb567b62 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@3x.png new file mode 100644 index 00000000..0e97cad8 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_map.imageset/btn_start map@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/Contents.json new file mode 100644 index 00000000..e01fdee5 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "btn_start now.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btn_start now@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btn_start now@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now.png new file mode 100644 index 00000000..0c07bd43 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@2x.png new file mode 100644 index 00000000..35a89882 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@3x.png new file mode 100644 index 00000000..4ae540ab Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_select_now.imageset/btn_start now@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/Contents.json new file mode 100644 index 00000000..3853199f --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "btn_share.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btn_share@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btn_share@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share.png new file mode 100644 index 00000000..fb931a39 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@2x.png new file mode 100644 index 00000000..571e2e43 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@3x.png new file mode 100644 index 00000000..2ebf8f19 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_share.imageset/btn_share@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Supports/AppDelegate.swift b/Runnect-iOS/Runnect-iOS/Global/Supports/AppDelegate.swift index 902b8147..acef8872 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Supports/AppDelegate.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Supports/AppDelegate.swift @@ -10,15 +10,24 @@ import UIKit import NMapsMap import KakaoSDKAuth import KakaoSDKCommon +import FirebaseCore @main class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + + print("🔥AppDelegate 의 openURLContexts 입니다 \n🔥") if let url = URLContexts.first?.url { + + if (AuthApi.isKakaoTalkLoginUrl(url)) { _ = AuthController.handleOpenUrl(url: url) } + + } } @@ -29,6 +38,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + FirebaseApp.configure() NMFAuthManager.shared().clientId = Config.naverMapClientId KakaoSDK.initSDK(appKey: Config.kakaoNativeAppKey) @@ -49,4 +59,3 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } } - diff --git a/Runnect-iOS/Runnect-iOS/Global/Supports/SceneDelegate.swift b/Runnect-iOS/Runnect-iOS/Global/Supports/SceneDelegate.swift index 5f92b293..87d9e543 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Supports/SceneDelegate.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Supports/SceneDelegate.swift @@ -8,13 +8,26 @@ import UIKit import KakaoSDKAuth import KakaoSDKCommon +import FirebaseDynamicLinks +import FirebaseCore +import FirebaseCoreInternal class SceneDelegate: UIResponder, UIWindowSceneDelegate { - + var window: UIWindow? - - + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + + print("🔥 scene에서 willConnectTo 동작 🔥") + guard let _ = (scene as? UIWindowScene) else { return } + + if let userActivity = connectionOptions.userActivities.first { + print("🔥 scene에서 userActivity 동작 🔥") + self.scene(scene, continue: userActivity) + } + + print("🔥 scene에서 SplashVC() 동작 🔥") guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) @@ -22,44 +35,149 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window.rootViewController = nav self.window = window window.makeKeyAndVisible() + + } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + if let incomingURL = userActivity.webpageURL { + let linkHandled = DynamicLinks.dynamicLinks() + .handleUniversalLink(incomingURL) { dynamicLink, error in + + + if let courseId = self.handleDynamicLink(dynamicLink) { + guard let _ = (scene as? UIWindowScene) else { return } + + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + + let rootVC = CourseDetailVC() + rootVC.setPublicCourseId(publicCourseId: Int(courseId)) + rootVC.getUploadedCourseDetail(courseId: Int(courseId)) + + // CourseDetailVC를 NavigationController로 감싸고, rootViewController로 설정합니다. + let navigationController = UINavigationController(rootViewController: rootVC) + window.rootViewController = navigationController + window.makeKeyAndVisible() + self.window = window + } + } + } + } } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + print("🔥 SceneDelegate의 openURLContexts입니다~ 🔥") + + print(URLContexts) + print(URLContexts.first!) + if let url = URLContexts.first?.url { - if (AuthApi.isKakaoTalkLoginUrl(url)) { + // Firebase Dynamic Links를 사용하여 딥 링크를 처리합니다. + print("🔥 SceneDelegate의 url은 : \(url) 🔥") + let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in + if let courseId = self.handleDynamicLink(dynamicLink) { + guard let _ = (scene as? UIWindowScene) else { return } + + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.overrideUserInterfaceStyle = .light + + // CourseDetailVC 인스턴스를 생성합니다. + let rootVC = CourseDetailVC() + rootVC.setPublicCourseId(publicCourseId: Int(courseId)) + + // CourseDetailVC를 NavigationController로 감싸고, rootViewController로 설정합니다. + let navigationController = UINavigationController(rootViewController: rootVC) + window.rootViewController = navigationController + window.makeKeyAndVisible() + self.window = window + } + } + } + print("🔥 바인딩 유무 ", linkHandled, "🔥") + + // Kakao SDK가 처리해야 하는지 확인합니다. + if AuthApi.isKakaoTalkLoginUrl(url) { _ = AuthController.handleOpenUrl(url: url) } } } - + + func sceneDidDisconnect(_ scene: UIScene) { // Called as the scene is being released by the system. // This occurs shortly after the scene enters the background, or when its session is discarded. // Release any resources associated with this scene that can be re-created the next time the scene connects. // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). } - + func sceneDidBecomeActive(_ scene: UIScene) { // Called when the scene has moved from an inactive state to an active state. // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. } - + func sceneWillResignActive(_ scene: UIScene) { // Called when the scene will move from an active state to an inactive state. // This may occur due to temporary interruptions (ex. an incoming phone call). } - + func sceneWillEnterForeground(_ scene: UIScene) { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. } - + func sceneDidEnterBackground(_ scene: UIScene) { // Called as the scene transitions from the foreground to the background. // Use this method to save data, release shared resources, and store enough scene-specific state information // to restore the scene back to its current state. } - + func handleDynamicLink(_ dynamicLink: DynamicLink?) -> String? { + if let dynamicLink = dynamicLink, let url = dynamicLink.url, + let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let queryItems = components.queryItems { + for item in queryItems { + if item.name == "courseId", let courseId = item.value { + // courseId를 사용하여 특정 뷰로 이동 + // 예: courseId를 기반으로 상세 화면을 열거나 특정 기능 수행 + print("🔥코스아이디가 제대로 여기까지 오는가!", courseId, "🔥") + return courseId + } + } + } + return nil + } + } +extension CourseDetailVC { + + func getUploadedCourseDetail(courseId: Int?) { + guard let publicCourseId = courseId else { return } + LoadingIndicator.showLoading() + Providers.publicCourseProvider.request(.getUploadedCourseDetail(publicCourseId: publicCourseId)) { [weak self] response in + guard let self = self else { return } + LoadingIndicator.hideLoading() + switch response { + case .success(let result): + let status = result.statusCode + if 200..<300 ~= status { + do { + let responseDto = try result.map(BaseResponse.self) + guard let data = responseDto.data else { return } + self.setData(model: data) + } catch { + print(error.localizedDescription) + } + } + if status >= 400 { + print("400 error") + self.showNetworkFailureToast() + } + case .failure(let error): + print(error.localizedDescription) + self.showNetworkFailureToast() + } + } + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift index 2608b3b9..d6ad2fac 100644 --- a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift +++ b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift @@ -56,6 +56,7 @@ final class CustomNavigationBar: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + } // MARK: - Methods @@ -316,3 +317,4 @@ extension CustomNavigationBar: UITextFieldDelegate { return true } } + diff --git a/Runnect-iOS/Runnect-iOS/GoogleService-Info.plist b/Runnect-iOS/Runnect-iOS/GoogleService-Info.plist new file mode 100644 index 00000000..239c397a --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + 772504823881-bp4sinq6869e5jaqv57r3pk2l5mmnefe.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.772504823881-bp4sinq6869e5jaqv57r3pk2l5mmnefe + API_KEY + AIzaSyAWjFUbR5CKoP8_V5a56aXON--0DkM1faw + GCM_SENDER_ID + 772504823881 + PLIST_VERSION + 1 + BUNDLE_ID + com.runnect.Runnect-iOS + PROJECT_ID + runnect-6c5e8 + STORAGE_BUCKET + runnect-6c5e8.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:772504823881:ios:e955e328c32c8a864b3798 + + \ No newline at end of file diff --git a/Runnect-iOS/Runnect-iOS/Info.plist b/Runnect-iOS/Runnect-iOS/Info.plist index 26acf7a7..636de799 100644 --- a/Runnect-iOS/Runnect-iOS/Info.plist +++ b/Runnect-iOS/Runnect-iOS/Info.plist @@ -23,9 +23,22 @@ CFBundleTypeRole Editor + CFBundleURLName + CFBundleURLSchemes kakao27d01e20b51e5925bf386a6c5465849f + runnect + + + + CFBundleTypeRole + Editor + CFBundleURLName + DynamicLink + CFBundleURLSchemes + + com.runnect.Runnect-iOS diff --git a/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDiscoveryDto/ResponseDto/PickedMapListResponseDto.swift b/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDiscoveryDto/ResponseDto/PickedMapListResponseDto.swift index 481ed5af..37097778 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDiscoveryDto/ResponseDto/PickedMapListResponseDto.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDiscoveryDto/ResponseDto/PickedMapListResponseDto.swift @@ -1,5 +1,5 @@ // -// CourseDiscoveryResponsDto.swift +// CourseDiscoveryResponseDto.swift // Runnect-iOS // // Created by YEONOO on 2023/01/10. diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift index 6d106f2b..aa2e7f68 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift @@ -12,7 +12,12 @@ import Then import NMapsMap import Moya import SafariServices - +import KakaoSDKCommon +import KakaoSDKShare +import KakaoSDKTemplate +import FirebaseCore +import FirebaseDynamicLinks + final class CourseDetailVC: UIViewController { // MARK: - Properties @@ -31,6 +36,8 @@ final class CourseDetailVC: UIViewController { private var publicCourseId: Int? private var isMyCourse: Bool? + private var safariViewController: SFSafariViewController? + // MARK: - UI Components private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton) @@ -38,6 +45,10 @@ final class CourseDetailVC: UIViewController { $0.setImage(ImageLiterals.icMore, for: .normal) $0.tintColor = .g1 } + private let shareButton = UIButton(type: .system).then { + $0.setImage(ImageLiterals.icShareButton, for: .normal) + $0.tintColor = .g1 + } private lazy var middleScorollView = UIScrollView().then { $0.isScrollEnabled = true $0.showsVerticalScrollIndicator = false @@ -58,6 +69,11 @@ final class CourseDetailVC: UIViewController { $0.addTarget(self, action: #selector(startButtonDidTap), for: .touchUpInside) } + private lazy var followButton = UIButton(type: .custom).then { + $0.setImage(ImageLiterals.icFollowButton, for: .normal) + $0.setImage(ImageLiterals.icFollowedButton, for: .selected) + } + private let mapImageView = UIImageView() private let profileImageView = UIImageView().then { $0.image = ImageLiterals.imgStampC3 @@ -135,12 +151,52 @@ extension CourseDetailVC { scrapCourse(scrapTF: !sender.isSelected) } + @objc func followButtonTapped() { + followButton.isSelected.toggle() + } + + @objc func shareButtonTapped() { + guard let model = self.uploadedCourseDetailModel else { + return + } + + let title = model.publicCourse.title + let courseId = model.publicCourse.id // primaryKey + let description = model.publicCourse.description + let courseImage = model.publicCourse.image + + let dynamicLinksDomainURIPrefix = "https://runnect.page.link" + guard let link = URL(string: "\(dynamicLinksDomainURIPrefix)/?courseId=\(courseId)") else { return } + let linkBuilder = DynamicLinkComponents(link: link, domainURIPrefix: dynamicLinksDomainURIPrefix) + linkBuilder!.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.runnect.Runnect-iOS") + linkBuilder!.iOSParameters?.appStoreID = "1663884202" + linkBuilder!.iOSParameters?.minimumAppVersion = "1.0.4" + + linkBuilder!.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters() + linkBuilder!.socialMetaTagParameters?.imageURL = URL(string: courseImage) + linkBuilder!.socialMetaTagParameters?.title = title + linkBuilder!.socialMetaTagParameters?.descriptionText = description + + guard let longDynamicLink = linkBuilder!.url else { return } + print("The long URL is: \(longDynamicLink)") + + /// 짧은 Dynamic Link로 변환 + linkBuilder?.shorten(completion: { url, _, _ in + guard let url = url else { return } + print("The short URL is: \(url)") + }) + + let activityVC = UIActivityViewController(activityItems: [longDynamicLink.absoluteString], applicationActivities: nil) + activityVC.popoverPresentationController?.sourceView = self.view + self.present(activityVC, animated: true, completion: nil) + + } + @objc func startButtonDidTap() { guard handleVisitor() else { return } guard let courseId = self.courseId else { return } getCourseDetailWithPath(courseId: courseId) } - @objc func moreButtonDidTap() { guard let isMyCourse = self.isMyCourse, let uploadedCourseDetailModel = self.uploadedCourseDetailModel else { return } @@ -209,6 +265,10 @@ extension CourseDetailVC { self.publicCourseId = publicCourseId } + func setPublicCourseId(publicCourseId: Int?) { + self.publicCourseId = publicCourseId + } + func setData(model: UploadedCourseDetailResponseDto) { self.uploadedCourseDetailModel = model self.mapImageView.setImage(with: model.publicCourse.image) @@ -231,6 +291,8 @@ extension CourseDetailVC { private func setAddTarget() { likeButton.addTarget(self, action: #selector(likeButtonDidTap), for: .touchUpInside) moreButton.addTarget(self, action: #selector(moreButtonDidTap), for: .touchUpInside) + followButton.addTarget(self, action: #selector(followButtonTapped), for: .touchUpInside) + shareButton.addTarget(self, action: #selector(shareButtonTapped), for: .touchUpInside) } private func setNullUser() { @@ -239,6 +301,7 @@ extension CourseDetailVC { self.profileNameLabel.text = "(알 수 없음)" self.runningLevelLabel.isHidden = true } + } // MARK: - Layout Helpers @@ -248,6 +311,7 @@ extension CourseDetailVC { private func setNavigationBar() { view.addSubview(navibar) view.addSubview(moreButton) + view.addSubview(shareButton) navibar.snp.makeConstraints { make in make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) make.height.equalTo(48) @@ -256,7 +320,10 @@ extension CourseDetailVC { make.trailing.equalTo(self.view.safeAreaLayoutGuide) make.centerY.equalTo(navibar) } - + shareButton.snp.makeConstraints { make in + make.trailing.trailing.equalTo(moreButton).offset(-50) + make.centerY.equalTo(navibar) + } } private func setUI() { @@ -309,7 +376,7 @@ extension CourseDetailVC { make.bottom.equalTo(thirdHorizontalDivideLine.snp.top) } - middleScorollView.addSubviews(mapImageView, profileImageView, profileNameLabel, runningLevelLabel, firstHorizontalDivideLine, courseTitleLabel, courseDetailStackView, secondHorizontalDivideLine, courseExplanationTextView) + middleScorollView.addSubviews(mapImageView, profileImageView, profileNameLabel, runningLevelLabel, followButton, firstHorizontalDivideLine, courseTitleLabel, courseDetailStackView, secondHorizontalDivideLine, courseExplanationTextView) mapImageView.snp.makeConstraints { make in make.top.equalToSuperview() @@ -330,7 +397,12 @@ extension CourseDetailVC { runningLevelLabel.snp.makeConstraints { make in make.bottom.equalTo(profileNameLabel.snp.bottom) - make.trailing.equalTo(view.safeAreaLayoutGuide).inset(31) + make.leading.equalTo(profileNameLabel.snp.trailing).offset(10) + } + + followButton.snp.makeConstraints { make in + make.centerY.equalTo(profileNameLabel.snp.centerY) + make.trailing.equalTo(view.safeAreaLayoutGuide.snp.trailing).offset(-16) } firstHorizontalDivideLine.snp.makeConstraints { make in diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/AdImageCollectionViewCell.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/AdImageCollectionViewCell.swift index 60140518..3d28022b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/AdImageCollectionViewCell.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDiscovery/Views/AdImageCollectionViewCell.swift @@ -31,8 +31,7 @@ class AdImageCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate { final let collectionViewInset = UIEdgeInsets(top: 28, left: 16, bottom: 28, right: 16) // MARK: - UI Components - var eventImg: UIImage = ImageLiterals.imgBanner4 - var imgBanners: [UIImage] = [ImageLiterals.imgBanner4, ImageLiterals.imgBanner1, ImageLiterals.imgBanner2] + var imgBanners: [UIImage] = [ImageLiterals.imgBanner1, ImageLiterals.imgBanner2] var currentPage: Int = 0 private var timer: Timer? diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift index d135000a..456156ff 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/DepartureSearchVC.swift @@ -27,6 +27,16 @@ final class DepartureSearchVC: UIViewController { $0.backgroundColor = .g5 } + private let selectNowButton = UIButton(type: .custom).then { + $0.setImage(ImageLiterals.icSelectNowButton, for: .normal) + $0.tintColor = .g1 + } + + private let selectMapButton = UIButton(type: .custom).then { + $0.setImage(ImageLiterals.icSelectMapButton, for: .normal) + $0.tintColor = .g3 + } + private let locationTableView = UITableView(frame: .zero, style: .plain).then { $0.backgroundColor = .white $0.separatorStyle = .none @@ -92,7 +102,7 @@ extension DepartureSearchVC { } private func setLayout() { - view.addSubviews(naviBar, dividerView, locationTableView) + view.addSubviews(naviBar, dividerView, locationTableView, selectNowButton, selectMapButton) naviBar.snp.makeConstraints { make in make.leading.top.trailing.equalTo(view.safeAreaLayoutGuide) @@ -105,6 +115,17 @@ extension DepartureSearchVC { make.height.equalTo(6) } + selectNowButton.snp.makeConstraints { make in + make.top.equalTo(dividerView.snp.bottom) + make.height.equalTo(40) + } + + selectMapButton.snp.makeConstraints { make in + make.top.equalTo(dividerView.snp.bottom) + make.leading.equalTo(selectNowButton.snp.trailing) + make.height.equalTo(40) + } + locationTableView.snp.makeConstraints { make in make.top.equalTo(dividerView.snp.bottom) make.leading.bottom.trailing.equalTo(view.safeAreaLayoutGuide) @@ -157,6 +178,9 @@ extension DepartureSearchVC: UITableViewDelegate, UITableViewDataSource { extension DepartureSearchVC: CustomNavigationBarDelegate { func searchButtonDidTap(text: String) { searchAddressWithKeyword(keyword: text) + // 검색 바 입력 시 버튼 숨김 처리 + selectNowButton.isHidden = true + selectMapButton.isHidden = true } } diff --git a/Runnect-iOS/Runnect-iOS/Runnect-iOS.entitlements b/Runnect-iOS/Runnect-iOS/Runnect-iOS.entitlements index a812db50..043f0eb4 100644 --- a/Runnect-iOS/Runnect-iOS/Runnect-iOS.entitlements +++ b/Runnect-iOS/Runnect-iOS/Runnect-iOS.entitlements @@ -6,5 +6,9 @@ Default + com.apple.developer.associated-domains + + applinks:runnect.page.link + diff --git a/Runnect-iOS/Runnect-iOS/Runnect-iOSDebug.entitlements b/Runnect-iOS/Runnect-iOS/Runnect-iOSDebug.entitlements new file mode 100644 index 00000000..043f0eb4 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Runnect-iOSDebug.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.developer.applesignin + + Default + + com.apple.developer.associated-domains + + applinks:runnect.page.link + + +