{"id":462,"date":"2021-05-15T16:21:50","date_gmt":"2021-05-15T07:21:50","guid":{"rendered":"http:\/\/practical.kr\/?p=462"},"modified":"2021-05-15T16:21:50","modified_gmt":"2021-05-15T07:21:50","slug":"swiftui-%ec%97%90%ec%84%9c-url-schemes-%ea%b3%bc-deeplink","status":"publish","type":"post","link":"http:\/\/practical.kr\/?p=462","title":{"rendered":"SwiftUI \uc5d0\uc11c URL Schemes \uacfc Deeplink"},"content":{"rendered":"\n<p>\ucd5c\uadfc SwiftUI\ub97c \uacf5\ubd80\ud558\uba70 \uac1c\uc778\uc801\uc73c\ub85c \ubb38\uc81c\uac00 \ub418\uace0 \uc788\ub358\uac83 \uc911\uc5d0 \ud558\ub098\uac00 \uacfc\uac70\uc5d0 \ud558\ub358 \ubc29\uc2dd\uc73c\ub85c \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\ub294 \ubc84\ub987\uc778\ub370 URLSchames \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\ub2e4 \ub610 \uadf8\ub7f0\uc77c\uc774 \uc788\uc5c8\ub2e4. \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ubcc0\ud558\uba74 \uc0dd\uac01\uc744 \ubc14\uafd4\uc57c \ud558\ub294\ub370 \uadf8\uac8c \uc27d\uc9c0 \uc54a\ub2e4. <\/p>\n\n\n\n<p class=\"has-large-font-size\">URL Schemes<\/p>\n\n\n\n<p>URL Schemes\uc640 \uadf8\uc5d0\ub530\ub978 \ucc98\ub9ac\ubc29\ubc95\uc740 \uc544\uc774\ud3f0\uc571\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \uc218 \uc788\ub294 \uaddc\uaca9\uc744 \ub4f1\ub85d\ud558\uace0 \ub4f1\ub85d\ub41c \uaddc\uaca9\uc758 \ub370\uc774\ud130\ub97c \uc218\uc2e0 \ud588\uc744\ub54c\uc758 \ucc98\ub9ac\ub97c \uc704\ud55c \uc77c\ub828\uc758 \ucc98\ub9ac\ub97c \ub9d0\ud558\ub294\ub370 \uac70\uc758 \ucd08\uae30\ubc84\uc804\uc758 iOS\ubd80\ud130 \uc9c0\uc6d0\ud55c \ubc29\ubc95\uc774\ub2e4.  <\/p>\n\n\n\n<p>\ub0b4\uac00 \uc54c\uace0 \uc788\ub358 \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \ubc29\ubc95\uc740 AppDelegate\uc640 SceneDelegate \uc5d0 \uc544\ub798\uc640 \uac19\uc740 \ud568\uc218\ub97c \uc815\uc758\ud558\uace0 URLContext\uc758 URL\uc744 \ud30c\uc2f1\ud574\uc11c \ub370\uc774\ud130\uc758 \ub0b4\uc6a9\uc5d0 \ub530\ub77c \ubd84\uae30\ub97c \ud558\uace0 \ub370\uc774\ud130\uc5d0 \ub9de\ub294 ViewController\ub97c \uc624\ud508\ud558\ub294 \ub2e8\uacc4\uae4c\uc9c0 \uac00\ub294 \uac83\uc774 \ubb38\uc81c\uc758 \ud574\uacb0\uc774\uc5c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> func scene(_ scene: UIScene, openURLContexts URLContexts: Set&lt;UIOpenURLContext>) {\n        if let url = URLContexts.first?.url {            \n            print(\"url: \\(url.absoluteURL)\")\n            print(\"scheme: \\(url.scheme)\")\n            print(\"host: \\(url.host)\")\n        }\n    }<\/pre>\n\n\n\n<p>\ud558\uc9c0\ub9cc \ud604\uc7ac XCode(V 12.5) \uc5d0\uc11c \uae30\ubcf8\uc801\uc778 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131\uc5d0\uc11c Life Cycle\uc744 SwiftUI App\uc73c\ub85c \ub9cc\ub4e4\uba74 AppDelegate, SceneDelegate\ub97c \ub9cc\ub4e4\uc5b4 \uc8fc\uc9c0 \uc54a\ub294\ub2e4. \uc774\uac8c \uc874\uc7ac \ud558\uc9c0 \uc54a\uc73c\ub2c8 \uc5b4\ub514\uc5d0\uc11c url\uc744 \ubc1b\uc544\ub4e4\uc774\uace0 \ubd84\uae30\ud574\uc57c \ud560\uc9c0 \uc54c \uc218\uac00 \uc5c6\uc5c8\ub2e4.<\/p>\n\n\n\n<p>\ucc38\uace0\ub85c \uc571\uc744 \uc0dd\uc131\ud560\ub54c \uc544\ub798\uc758 Life Cycle\uc744 UIKit App Delegate\ub97c \uc120\ud0dd\ud558\uba74 \uc774\uc804\uc5d0 \uc4f0\ub358 AppDelegate\uacfc SceneDelegate \ud30c\uc77c\uc774 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/practical.kr\/wp-content\/uploads\/2021\/05\/Monosnap-2021-05-15-14-56-20.png\" alt=\"\" class=\"wp-image-469\" width=\"575\" height=\"431\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-large-font-size\">\uc0bd\uc9c8<\/p>\n\n\n\n<p>\uacfc\uac70\uc758 \ubc29\ubc95\uc73c\ub85c \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\ub294 \uc2dc\ub3c4\ub294 \uacb0\uad6d \uba70\uce60\uac04\uc758 \uc0bd\uc9c8\ub85c \ub05d\ub0ac\ub2e4. AppDelegate\uc640 SceneDelegate\ub97c \uc0c8\ub85c \ub9cc\ub4e4\uc5c8\uace0 \uc774\ub7f0 \ud574\uacb0\ubc29\ubc95\ub3c4 \uac00\ub2a5\ud558\ub2e4\ub294 \uacb0\ub860\uc5d0 \ub3c4\ub2ec\ud588\uc9c0\ub9cc \uac80\uc0c9\uc911\uc5d0 \ubcf4\uac8c\ub41c \ucf54\ub4dc \ub54c\ubb38\uc5d0 \uadf8 \ucf54\ub4dc\ub4e4\uc744 \ubaa8\ub450 \ubc84\ub9ac\uace0 \ub9d0\uc558\ub2e4.<\/p>\n\n\n\n<p class=\"has-large-font-size\">.onOpenURL()<\/p>\n\n\n\n<p>\ubb38\uc81c\uc758 \ud574\uacb0 \ubc29\ubc95\uc774 \ub108\ubb34 \uac04\ub2e8\ud574\uc11c \uc57d\uac04 \ud5c8\ud0c8\ud558\uae34 \ud588\uc9c0\ub9cc \uc544\ub798\uc758 \ucf54\ub4dc\uc640 \uac19\uc774 View\uc758 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\ub294 \ubc29\ubc95\uc73c\ub85c URL Schemes\uc5d0 \ub4f1\ub85d\ub41c url\uc758 \uc811\uadfc\uc744 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4.    <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@main\nstruct MyApplication: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n        .onOpenURL { url in\n          print(url)\n        }\n    }\n  }\n}<\/pre>\n\n\n\n<p class=\"has-large-font-size\">DeepLink<\/p>\n\n\n\n<p>\uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c \ubcf4\ub294\uac83\uacfc \uac19\uc774 \ubaa8\ub4e0 View \ucee8\ud2b8\ub864\uc740 .onOpenURL() \uba54\uc18c\ub4dc\ub97c \uac00\uc9c0\uace0 \uc788\ub2e4. \uc774\uac83\uc740 \uc704\uc5d0 \ubcf4\uc774\ub294 \uba54\uc778\ubdf0\uc5d0\uc11c\ub3c4 url \uc774\ubca4\ud2b8\ub97c \ud655\uc778\ud574\uc11c \uc2e4\uc81c\ub85c \ubcf4\uc5ec\uc8fc\uace0\uc790 \ud558\ub294 \uc0c1\uc138 \ud398\uc774\uc9c0\uae4c\uc9c0 \uc774\ub3d9 \ud588\uc744 \uacbd\uc6b0 \uadf8 \ubdf0\uc5d0\ub3c4 \ub3d9\uc77c\ud55c \ud568\uc218(.onOpenURL())\ub97c \ud638\ucd9c\ud558\uba74 url\uac12\uc744 \uc5bb\uc744 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.onOpenURL { url in\n            if (url.scheme! == \"where-board\" &amp;&amp; url.host! == \"invite\") {\n                if let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true) {\n                    for query in components.queryItems! {\n                        print(query.name)\n                        print(query.value!)                        \n                    }\n                }\n            }            \n        }<\/pre>\n\n\n\n<p class=\"has-large-font-size\">Sample \ud504\ub85c\uc81d\ud2b8<\/p>\n\n\n\n<p>\uc544\ub798\uc640 \uac19\uc774 \uc2e0\uaddc \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud574\uc11c \uc0c1\uc138 \ud398\uc774\uc9c0\uc5d0\uc11c URL Schames\ub97c \ud1b5\ud574 \uc804\ub2ec\ub41c \ub370\uc774\ud130\ub97c \ucd9c\ub825\ud574 \ubcfc\uc218 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/practical.kr\/wp-content\/uploads\/2021\/05\/Monosnap-2021-05-15-15-52-21.png\" alt=\"\" class=\"wp-image-482\" width=\"574\" height=\"430\"\/><\/figure><\/div>\n\n\n\n<p>\ud504\ub85c\uc81d\ud2b8\uc758 Life Cycle\uc740  SwiftUI App\uc73c\ub85c \uc120\ud0dd\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/practical.kr\/wp-content\/uploads\/2021\/05\/DeepLink-Test.xcodeproj-2021-05-15-15-53-24.png\" alt=\"\" class=\"wp-image-483\" width=\"638\" height=\"446\"\/><\/figure><\/div>\n\n\n\n<p>URL Schemes\uc744 \uc0dd\uc131\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud504\ub85c\uc81d\ud2b8 &#8211; info &#8211; URL Types \ub97c \uc120\ud0dd\ud558\uace0 + \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc11c URL Schemes \ud56d\ubaa9\uc5d0 \uc720\ub2c8\ud06c\ud55c \uc774\ub984\uc744 \uc785\ub825\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uba54\uc778 \ud504\ub85c\uc81d\ud2b8 App &#8211; Scene &#8211; View \uc758 \uad6c\uc870\uc5d0\uc11c ContentView()\uc5d0 \uc544\ub798\uc758 \ucf54\ub4dc\uc640 \uac19\uc774 url\uc744 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import SwiftUI\n\n@main\nstruct DeepLink_TestApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .onOpenURL(perform: { url in\n                    print(url)\n                })\n        }\n    }\n}<\/pre>\n\n\n\n<p>\uc2e4\uc81c \ucf58\ud150\uce20\ubdf0\uc758 \ub0b4\ubd80\uc5d0\uc11c\ub3c4 url \uc744 \uc804\ub2ec \ubc1b\uc744 \uc218 \uc788\ub2e4<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import SwiftUI\n\nstruct ContentView: View {\n    var body: some View {\n        Text(\"Hello, world!\")\n            .padding()\n            .onOpenURL(perform: { url in\n                print(url)\n            })\n\n    }\n}<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/practical.kr\/wp-content\/uploads\/2021\/05\/IMG_2275.jpg\" alt=\"\" class=\"wp-image-485\" width=\"415\" height=\"228\"\/><\/figure><\/div>\n\n\n\n<p>\uc544\uc774\ud3f0\uc5d0 \ube4c\ub4dc\ud558\uace0 \uc571\uc774 \uc2e4\ud57c\ub41c \uc0c1\ud0dc\uc5d0\uc11c \uc0ac\ud30c\ub9ac \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uc704\uc640 \uac19\uc774 \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uace0 \uc571\uc73c\ub85c \uc804\ud658\ub418\uc5b4 \uc544\ub798\uc640 \uac19\uc774 url\uc774 \uc804\ub2ec\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\ub2e4. \ub450\ubc88 \ud504\ub9b0\ud2b8 \ub418\uc5c8\ub294\ub370 \uccab\ubc88\uc9f8\ub294 \uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c \ub450\ubc88\uc9f8\ub294 \uc544\ub798\uc758 \ucf54\ub4dc\uc5d0\uc11c \uc804\ub2ec\ub41c \ub370\uc774\ud130\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">my-deeplink-test:\/\/share?id=1234\nmy-deeplink-test:\/\/share?id=1234<\/pre>\n\n\n\n<p>\ub300\ub7b5 \uc544\ub798\uc640 \uac19\uc740 \ucf54\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c url\uc744 \ud30c\uc2f1\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        .onOpenURL { url in\n            if (url.scheme! == \"my-deeplink-test\" &amp;&amp; url.host! == \"share\") {\n                if let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true) {\n                    for query in components.queryItems! {\n                        print(query.name)\n                        print(query.value!)                        \n                    }\n                }\n            }            \n        }<\/pre>\n\n\n\n<p>20210515 \ubc15\ubcd1\uc77c <\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ucd5c\uadfc SwiftUI\ub97c \uacf5\ubd80\ud558\uba70 \uac1c\uc778\uc801\uc73c\ub85c \ubb38\uc81c\uac00 \ub418\uace0 \uc788\ub358\uac83 \uc911\uc5d0 \ud558\ub098\uac00 \uacfc\uac70\uc5d0 \ud558\ub358 \ubc29\uc2dd\uc73c\ub85c \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\ub294 \ubc84\ub987\uc778\ub370 URLSchames \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub824\ub2e4 \ub610 \uadf8\ub7f0\uc77c\uc774 \uc788\uc5c8\ub2e4. \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ubcc0\ud558\uba74 \uc0dd\uac01\uc744 \ubc14\uafd4\uc57c \ud558\ub294\ub370 \uadf8\uac8c \uc27d\uc9c0 \uc54a\ub2e4. URL Schemes URL Schemes\uc640 \uadf8\uc5d0\ub530\ub978 \ucc98\ub9ac\ubc29\ubc95\uc740 \uc544\uc774\ud3f0\uc571\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \uc218 \uc788\ub294 \uaddc\uaca9\uc744 \ub4f1\ub85d\ud558\uace0 \ub4f1\ub85d\ub41c \uaddc\uaca9\uc758 \ub370\uc774\ud130\ub97c \uc218\uc2e0 \ud588\uc744\ub54c\uc758 \ucc98\ub9ac\ub97c \uc704\ud55c \uc77c\ub828\uc758 \ucc98\ub9ac\ub97c \ub9d0\ud558\ub294\ub370 \uac70\uc758 \ucd08\uae30\ubc84\uc804\uc758 iOS\ubd80\ud130<\/p>\n<div class=\"more-link\">\n\t\t\t\t <a href=\"http:\/\/practical.kr\/?p=462\" class=\"link-btn theme-btn\"><span>Read More <\/span> <i class=\"fa fa-caret-right\"><\/i><\/a>\n\t\t\t<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[13,26,27,40],"tags":[],"class_list":["post-462","post","type-post","status-publish","format-standard","hentry","category-ios","category-iphone","category-swift","category-swiftui"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=462"}],"version-history":[{"count":26,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/462\/revisions"}],"predecessor-version":[{"id":492,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/462\/revisions\/492"}],"wp:attachment":[{"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}