<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SwiftUI 마스터하기</title>
    <link>https://dev-apple.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 5 Mar 2026 20:01:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_히처리_</managingEditor>
    <item>
      <title>[앱 출시] Developer Removed from Sale 대처 방법</title>
      <link>https://dev-apple.tistory.com/35</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.30.44.png&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMk76/btsv7m67Ils/Va2bKhITEPwBWLasNZchz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMk76/btsv7m67Ils/Va2bKhITEPwBWLasNZchz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMk76/btsv7m67Ils/Va2bKhITEPwBWLasNZchz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMk76%2Fbtsv7m67Ils%2FVa2bKhITEPwBWLasNZchz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2434&quot; height=&quot;228&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.30.44.png&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 첫 앱 심사가 드디어 승인되었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Ready for Sale이 되었는데... Developer Removed from Sale이라면서 메일이 하나 더 와 있었다.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;016&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어? 나는 판매를 중단한 적이 없는데??? 저 시간에 자고 있었는데???&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 구글링을 해보니 App Connect에서 가격 및 사용 가능 여부를 확인해보라고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.33.08.png&quot; data-origin-width=&quot;2798&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTGIvT/btswaqUVxR7/TU7Mbq1f0ovkGzyL9cbM91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTGIvT/btswaqUVxR7/TU7Mbq1f0ovkGzyL9cbM91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTGIvT/btswaqUVxR7/TU7Mbq1f0ovkGzyL9cbM91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTGIvT%2FbtswaqUVxR7%2FTU7Mbq1f0ovkGzyL9cbM91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2798&quot; height=&quot;1324&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.33.08.png&quot; data-origin-width=&quot;2798&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 사용 가능 여부에서 아직 사용 가능 여부 설정이 되어 있지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출시할 앱이 영어를 기본으로 지원하기 때문에 175개국 모든 국가에서 사용 가능하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그랬더니 짜잔!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.35.44.png&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOa5F2/btsv8Ua6bOh/ccnKEaWbKCcwlqrx0Ok5Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOa5F2/btsv8Ua6bOh/ccnKEaWbKCcwlqrx0Ok5Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOa5F2/btsv8Ua6bOh/ccnKEaWbKCcwlqrx0Ok5Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOa5F2%2Fbtsv8Ua6bOh%2FccnKEaWbKCcwlqrx0Ok5Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;150&quot; data-filename=&quot;스크린샷 2023-10-03 오전 8.35.44.png&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;017&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어! 앱이 판매 준비가 되었다!!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만.... 앱 스토어에 노출이 되려면 최대 24시간이 걸린다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨리 내 눈으로 앱 스토어에서 나의 첫 번째 앱을 볼 수 있길 바란다.&lt;/p&gt;</description>
      <category>삽질 이야기</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/35</guid>
      <comments>https://dev-apple.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 3 Oct 2023 08:41:32 +0900</pubDate>
    </item>
    <item>
      <title>[앱 출시 거절] 5.1.2 Legal: Privacy - Data Use and Sharing</title>
      <link>https://dev-apple.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기도 노트 앱 출시를 위해 심사를 요청하였는데, 다음과 같은 사유로 거절이 되었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;5.1.2 Legal: Privacy - Data Use and Sharing&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기도 노트에는 광고 수익화를 위해 admob을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admob은 사용자에게 맞춤 광고를 보여주기 위해서 사용자 데이터를 수집하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 14.5부터는 사용자의 프라이버시를 보호하기 위해서 앱 트래킹 투명성(AppTrackingTransparency) 프레임워크를 통해서 사용자의 허락을 받은 후에 데이터를 수집해야 한다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 문구 다국어화하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기도 노트는 다국어를 지원하기 때문에&amp;nbsp;InfoPlist.strings에 다국어 문구로 작성했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@sun02/iOS-Info.plist-%EB%AC%B8%EA%B5%AC-localization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@sun02/iOS-Info.plist-%EB%AC%B8%EA%B5%AC-localization&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1696256838799&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[iOS] - Info.plist의 문구 localization&quot; data-og-description=&quot;앱 내의 문구를 Localization 할 때와 방법은 거의 동일합니다.New file &amp;gt; Strings File 이때 파일 명을 'InfoPlist' 로 지정해주어야합니다.InfoPlist.strings 파일이 생성되면 Localize를 눌러 현지화할 언어를 선택&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@sun02/iOS-Info.plist-%EB%AC%B8%EA%B5%AC-localization&quot; data-og-url=&quot;https://velog.io/@sun02/iOS-Info.plist-문구-localization&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JbwF3/hyT2BTl43v/NbHzfscxz6IJ8x4LnG9PD0/img.png?width=1366&amp;amp;height=849&amp;amp;face=0_0_1366_849,https://scrap.kakaocdn.net/dn/ONKvb/hyT2Dp7dF3/T7Kp9Bo5rknk21YuBGcdIk/img.png?width=1366&amp;amp;height=849&amp;amp;face=0_0_1366_849,https://scrap.kakaocdn.net/dn/cpdoe6/hyT54zz3Gy/ycOVMObFpkQ07Dd3kyXmqk/img.png?width=828&amp;amp;height=1792&amp;amp;face=0_0_828_1792&quot;&gt;&lt;a href=&quot;https://velog.io/@sun02/iOS-Info.plist-%EB%AC%B8%EA%B5%AC-localization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@sun02/iOS-Info.plist-%EB%AC%B8%EA%B5%AC-localization&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JbwF3/hyT2BTl43v/NbHzfscxz6IJ8x4LnG9PD0/img.png?width=1366&amp;amp;height=849&amp;amp;face=0_0_1366_849,https://scrap.kakaocdn.net/dn/ONKvb/hyT2Dp7dF3/T7Kp9Bo5rknk21YuBGcdIk/img.png?width=1366&amp;amp;height=849&amp;amp;face=0_0_1366_849,https://scrap.kakaocdn.net/dn/cpdoe6/hyT54zz3Gy/ycOVMObFpkQ07Dd3kyXmqk/img.png?width=828&amp;amp;height=1792&amp;amp;face=0_0_828_1792');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[iOS] - Info.plist의 문구 localization&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앱 내의 문구를 Localization 할 때와 방법은 거의 동일합니다.New file &amp;gt; Strings File 이때 파일 명을 'InfoPlist' 로 지정해주어야합니다.InfoPlist.strings 파일이 생성되면 Localize를 눌러 현지화할 언어를 선택&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만... 위의 사이트대로 하니 App Connect에 빌드를 업로드할 때, 권한 요청 시 상세 문구를 입력하라면서 실패가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음같이 다국어 문구를 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Info.plist에 기본 언어로 상세 문구를 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.25.03.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYU8z0/btsv7ftkime/4U2IgDRP0IL7JdZj4EIiMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYU8z0/btsv7ftkime/4U2IgDRP0IL7JdZj4EIiMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYU8z0/btsv7ftkime/4U2IgDRP0IL7JdZj4EIiMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYU8z0%2Fbtsv7ftkime%2F4U2IgDRP0IL7JdZj4EIiMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1992&quot; height=&quot;134&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.25.03.png&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. InfoPlist.strings에 기본 언어를 제외한 언어에 NSUserTrackingUsageDescription 에 대한 문구를 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.25.16.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbXGv7/btsv7pbBkbd/BZN4FWc1VEVT4U27O2yj21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbXGv7/btsv7pbBkbd/BZN4FWc1VEVT4U27O2yj21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbXGv7/btsv7pbBkbd/BZN4FWc1VEVT4U27O2yj21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbXGv7%2Fbtsv7pbBkbd%2FBZN4FWc1VEVT4U27O2yj21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;130&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.25.16.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NSUserTrackingUsageDescription 와 같은 이름은 Info.plist 파일을 오른쪽 마우스 클릭 시 나타나는 메뉴에서 SourceCode로 보면 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.26.29.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stgCV/btsv7iXWeKH/XFWqVJniVimTfrlWsNT6k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stgCV/btsv7iXWeKH/XFWqVJniVimTfrlWsNT6k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stgCV/btsv7iXWeKH/XFWqVJniVimTfrlWsNT6k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstgCV%2Fbtsv7iXWeKH%2FXFWqVJniVimTfrlWsNT6k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;288&quot; data-filename=&quot;스크린샷 2023-10-03 오전 12.26.29.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# ATT 대화상자 열기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS15이상의 SwiftUI는 아래와 같이 작성하면 된다고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1696256887787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import AppTrackingTransparency
import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack {
      Text(&quot;Hello, world!&quot;)
        .padding()
    }
    .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
      ATTrackingManager.requestTrackingAuthorization(completionHandler: { _ in
      })
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>앱 출시/기도 노트</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/34</guid>
      <comments>https://dev-apple.tistory.com/34#entry34comment</comments>
      <pubDate>Mon, 2 Oct 2023 23:29:34 +0900</pubDate>
    </item>
    <item>
      <title>기도 노트] 개인정보 처리 방침</title>
      <link>https://dev-apple.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인정보&amp;nbsp;처리&amp;nbsp;방침&lt;/b&gt;&lt;br /&gt;1986hz는 광고 지원 앱으로서 '내 기도 노트 앱(My Prayer Note)'를 개발하였습니다. 이 서비스는 1986hz에서 무료로 제공되며 그대로 사용하기 위한 목적으로 제공됩니다.&lt;br /&gt;본 페이지는 이 서비스를 사용하려는 경우 개인 정보 수집, 이용 및 공개에 대한 정책을 방문자에게 알리기 위해 사용됩니다.&lt;br /&gt;만약 본 서비스를 사용하려고 선택한다면, 본 정책과 관련하여 정보 수집과 이용에 동의하는 것으로 간주됩니다. 저는 본 개인 정보를 서비스를 제공하고 개선하기 위한 용도로 사용합니다. 본 개인 정보를 본 개인 정보 처리 방침에 기술된 대로 외부와 공유하지 않을 것입니다.&lt;br /&gt;본 개인 정보 처리 방침에서 사용되는 용어는 My Prayer Note에서 특별히 정의되지 않는 한 우리의 이용 약관에서 사용되는 것과 동일한 의미를 가집니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;정보&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;이용&lt;/b&gt;&lt;br /&gt;서비스를 더 나은 경험을 위해 사용하는 동안, 저는 특정 개인 식별 정보를 제공하도록 요구할 수 있습니다. 요청된 정보는 당신의 기기에 보관되며, 어떠한 방식으로도 나에게 수집되지 않습니다.&lt;br /&gt;본 앱은 당신을 식별할 수 있는 정보를 수집할 수 있는 제3자 서비스를 사용할 수 있습니다.&lt;br /&gt;앱에서 사용되는 제3자 서비스 제공업체의 개인 정보 처리 방침 링크&lt;br /&gt;- AdMob&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;로그&amp;nbsp;데이터&lt;/b&gt;&lt;br /&gt;서비스를 사용할 때, 앱에서 오류가 발생한 경우, 제3자 제품을 통해 당신의 휴대폰에 대한 로그 데이터를 수집합니다. 이 로그 데이터에는 당신의 기기 IP 주소, 기기 이름, 운영 체제 버전, 내 서비스를 사용할 때 앱의 설정, 서비스 이용 시간 및 날짜, 그 외 통계 정보 등이 포함될 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;쿠키&lt;/b&gt;&lt;br /&gt;쿠키는 익명의 고유 식별자로서 자주 사용되는 데이터 작은 양의 파일입니다. 이들은 당신이 방문한 웹사이트에서 브라우저로 보내져 당신의 기기 내부 메모리에 저장됩니다.&lt;br /&gt;본 서비스는 이러한 &quot;쿠키&quot;를 명시적으로 사용하지 않습니다. 그러나 앱은 정보 수집 및 서비스 개선을 위해 &quot;쿠키&quot;를 사용하는 제3자 코드와 라이브러리를 사용할 수 있습니다. 당신은 이러한 쿠키를 수락하거나 거부할 수 있으며 쿠키가 당신의 기기로 전송되는 경우를 알 수 있습니다. 만약 우리의 쿠키를 거부하기로 선택한다면, 이 서비스의 일부를 사용할 수 없을 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;서비스&amp;nbsp;제공자&lt;/b&gt;&lt;br /&gt;다음과 같은 이유로 제3자 회사와 개인을 고용할 수 있습니다:&lt;br /&gt;우리의 서비스를 용이하게 하기 위해;&lt;br /&gt;우리를&amp;nbsp;대신하여&amp;nbsp;서비스를&amp;nbsp;제공하기&amp;nbsp;위해;&lt;br /&gt;서비스&amp;nbsp;관련&amp;nbsp;서비스를&amp;nbsp;수행하기&amp;nbsp;위해;&amp;nbsp;또는&lt;br /&gt;우리의&amp;nbsp;서비스&amp;nbsp;사용&amp;nbsp;방법을&amp;nbsp;분석하는&amp;nbsp;데&amp;nbsp;도움을&amp;nbsp;주기&amp;nbsp;위해.&lt;br /&gt;본&amp;nbsp;서비스를&amp;nbsp;사용하는&amp;nbsp;사용자들에게&amp;nbsp;알립니다.&amp;nbsp;이러한&amp;nbsp;제3자는&amp;nbsp;개인&amp;nbsp;정보에&amp;nbsp;액세스할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그&amp;nbsp;이유는&amp;nbsp;그들에게&amp;nbsp;할당된&amp;nbsp;작업을&amp;nbsp;대신&amp;nbsp;수행하기&amp;nbsp;위함입니다.&amp;nbsp;그러나&amp;nbsp;그들은&amp;nbsp;정보를&amp;nbsp;다른&amp;nbsp;목적으로&amp;nbsp;공개하거나&amp;nbsp;사용하지&amp;nbsp;않도록&amp;nbsp;약속하였습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;보안&lt;/b&gt;&lt;br /&gt;당신의 개인 정보를 제공해 주신 믿음을 소중히 여깁니다. 따라서 상업적으로 합리적인 수단을 사용하여 보호하려고 노력하고 있습니다. 그러나 인터넷을 통한 전송이나 전자 저장 방법은 100% 안전하고 신뢰할 수 있는 것이 아니며, 절대적인 보안을 보장할 수 없습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;다른&amp;nbsp;사이트로의&amp;nbsp;링크&lt;/b&gt;&lt;br /&gt;본 서비스에는 다른 사이트로의 링크가 포함될 수 있습니다. 제3자 링크를 클릭하면 해당 사이트로 이동하게 됩니다. 이러한 외부 사이트는 저에 의해 운영되지 않습니다. 따라서 이러한 웹사이트의 콘텐츠, 개인 정보 처리 방침 또는 관행에 대한 제어를 가지지 않으므로 이러한 웹사이트의 개인 정보 처리 방침을 신중하게 검토하는 것이 좋습니다. 저는 어떠한 제3자 사이트나 서비스의 콘텐츠, 개인 정보 처리 방침 또는 관행에 대한 책임을 지지 않습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;어린이의&amp;nbsp;개인&amp;nbsp;정보&lt;/b&gt;&lt;br /&gt;저는 13세 미만 어린이로부터 개인 식별 정보를 의도적으로 수집하지 않습니다. 13세 미만 어린이가 개인 정보를 제공한 사실을 발견하면 즉시 이 정보를 삭제합니다. 만약 당신이 부모님이거나 보호자이고, 당신의 어린이가 개인 정보를 제공한 사실을 알고 있다면, 저에게 연락하여 필요한 조치를 취할 수 있도록 도와주세요.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;개인&amp;nbsp;정보&amp;nbsp;처리&amp;nbsp;방침&amp;nbsp;변경&lt;/b&gt;&lt;br /&gt;저는 개인 정보 처리 방침을 시간마다 업데이트할 수 있습니다. 따라서 당신은 이 페이지를 정기적으로 검토할 것을 권장합니다. 저는 새로운 개인 정보 처리 방침을 이 페이지에 게시함으로써 당신에게 변경 사항을 알릴 것입니다.&lt;br /&gt;본&amp;nbsp;정책은&amp;nbsp;2023-09-25일부터&amp;nbsp;효력을&amp;nbsp;가집니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;문의하기&lt;/b&gt;&lt;br /&gt;만약 개인 정보 처리 방침에 관한 질문이나 제안사항이 있다면, 언제든지 1986hz@naver.com으로 연락 주십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이&amp;nbsp;개인&amp;nbsp;정보&amp;nbsp;처리&amp;nbsp;방침&amp;nbsp;페이지는&amp;nbsp;privacypolicytemplate.net에서&amp;nbsp;생성되었으며&amp;nbsp;App&amp;nbsp;Privacy&amp;nbsp;Policy&amp;nbsp;Generator에&amp;nbsp;의해&amp;nbsp;수정/생성되었습니다.&lt;/p&gt;</description>
      <category>앱 출시/기도 노트</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/33</guid>
      <comments>https://dev-apple.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 25 Sep 2023 23:58:07 +0900</pubDate>
    </item>
    <item>
      <title>My Prayer Note] Privacy Policy</title>
      <link>https://dev-apple.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Privacy Policy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1986hz built the My Prayer Note app as an Ad Supported app. This SERVICE is provided by 1986hz at no cost and is intended for use as is.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at My Prayer Note unless otherwise defined in this Privacy Policy.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Information Collection and Use&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The app does use third-party services that may collect information used to identify you.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Link to the privacy policy of third-party service providers used by the app&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #3273dc;&quot; href=&quot;https://support.google.com/admob/answer/6128543?hl=en&quot;&gt;AdMob&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Log Data&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third-party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (&amp;ldquo;IP&amp;rdquo;) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cookies&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This Service does not use these &amp;ldquo;cookies&amp;rdquo; explicitly. However, the app may use third-party code and libraries that use &amp;ldquo;cookies&amp;rdquo; to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Service Providers&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;I may employ third-party companies and individuals due to the following reasons:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;To facilitate our Service;&lt;/li&gt;
&lt;li&gt;To provide the Service on our behalf;&lt;/li&gt;
&lt;li&gt;To perform Service-related services; or&lt;/li&gt;
&lt;li&gt;To assist us in analyzing how our Service is used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;I want to inform users of this Service that these third parties have access to their Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Links to Other Sites&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Children&amp;rsquo;s Privacy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;I do not knowingly collect personally identifiable information from children under 13 years of age. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do the necessary actions.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Changes to This Privacy Policy&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This policy is effective as of 2023-09-25&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Contact Us&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at 1986hz@naver.com.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a4a4a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;This privacy policy page was created at&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #3273dc;&quot; href=&quot;https://privacypolicytemplate.net/&quot;&gt;privacypolicytemplate.net&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;and modified/generated by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #3273dc;&quot; href=&quot;https://app-privacy-policy-generator.nisrulz.com/&quot;&gt;App Privacy Policy Generator&lt;/a&gt;&lt;/p&gt;</description>
      <category>앱 출시/기도 노트</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/32</guid>
      <comments>https://dev-apple.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 25 Sep 2023 23:44:41 +0900</pubDate>
    </item>
    <item>
      <title>[Foundation] Localiztion (다국어 / 지역화)</title>
      <link>https://dev-apple.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 앱 개발 중에 다국어를 지원하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 앱 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문자열 파일 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;New File로 String File을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명은 Localizable으로 하자. 그래야 나중에 NSLocalizedString() 함수를 디폴트로 테이블 이름을 사용할 수 있어서 편하다. 다름 이름을 하게 되면 매번 테이블 이름을 전달해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 생성한 문자열 파일을 인스펙터에서 Localize...로 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Project &amp;gt; Info &amp;gt; Localization 에서 언어를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 다국어 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어별로 문자열 파일이 생성되어 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 문자열 파일에 키-값 쌍으로 다국어를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 끝에 콜롬을 추가해야 한다. (안하면 에러 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// en&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;groups&quot; = &quot;groups&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// ko&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;groups&quot; = &quot;그룹&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# SwiftUI 미리보기에 다국어 적용하기&lt;/h2&gt;
&lt;pre id=&quot;code_1695440820329&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
                .previewDisplayName(&quot;en&quot;)
                .environment(\.locale, .init(identifier: &quot;en&quot;))
            ContentView()
                .previewDisplayName(&quot;ko&quot;)
                .environment(\.locale, .init(identifier: &quot;ko&quot;))
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 잘되어야 하는 코드인데 &lt;b&gt;현재 XCode14.2의 미리보기에서는 작동하지 않는다. (시뮬과 기기에서는 잘됨)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리보기에서 다국어를 볼려면, Scheme에서 App Language에서 수정하면, 해당 언어의 다국어를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-24 오전 12.05.04.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;1370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZhuL0/btsvb2ocpEq/Umtd5Qmf76bLfO94BWboV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZhuL0/btsvb2ocpEq/Umtd5Qmf76bLfO94BWboV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZhuL0/btsvb2ocpEq/Umtd5Qmf76bLfO94BWboV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZhuL0%2Fbtsvb2ocpEq%2FUmtd5Qmf76bLfO94BWboV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;1370&quot; data-filename=&quot;스크린샷 2023-09-24 오전 12.05.04.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;1370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-24 오전 12.05.30.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R9h0z/btsvx20cGVr/eIt2bYUq97zjtNV9wcTSe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R9h0z/btsvx20cGVr/eIt2bYUq97zjtNV9wcTSe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R9h0z/btsvx20cGVr/eIt2bYUq97zjtNV9wcTSe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR9h0z%2Fbtsvx20cGVr%2FeIt2bYUq97zjtNV9wcTSe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1590&quot; height=&quot;772&quot; data-filename=&quot;스크린샷 2023-09-24 오전 12.05.30.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# Swift Foundation에서 지역화 관련 API&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;struct Locale&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터&amp;nbsp;형식을&amp;nbsp;포맷팅하는&amp;nbsp;데&amp;nbsp;사용되는&amp;nbsp;언어,&amp;nbsp;문화&amp;nbsp;및&amp;nbsp;기술&amp;nbsp;관습&amp;nbsp;정보에&amp;nbsp;대한&amp;nbsp;정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;class NSOrthography&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로&amp;nbsp;맞춤법&amp;nbsp;및&amp;nbsp;문법&amp;nbsp;검사에&amp;nbsp;사용되는&amp;nbsp;자연&amp;nbsp;언어&amp;nbsp;텍스트의&amp;nbsp;언어&amp;nbsp;내용에&amp;nbsp;대한&amp;nbsp;설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;func&amp;nbsp;NSLocalizedString&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;func NSLocalizedString(String, tableName: String?, bundle: Bundle, value: String, comment: String) -&amp;gt; String&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬라이제이션&amp;nbsp;내보내기&amp;nbsp;시&amp;nbsp;Xcode가&amp;nbsp;생성하는&amp;nbsp;테이블에서&amp;nbsp;로컬라이즈된&amp;nbsp;문자열을&amp;nbsp;반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;struct LocalizedStringResource&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른&amp;nbsp;프로세스에서&amp;nbsp;접근&amp;nbsp;가능한&amp;nbsp;로컬라이즈&amp;nbsp;가능한&amp;nbsp;문자열에&amp;nbsp;대한&amp;nbsp;참조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;protocol CustomLocalizedStringResourceConvertible&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부&amp;nbsp;프로세스에서&amp;nbsp;로컬라이즈&amp;nbsp;가능한&amp;nbsp;설명을&amp;nbsp;제공하는&amp;nbsp;유형입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;func&amp;nbsp;NSLocalizedString&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번들&amp;nbsp;내의&amp;nbsp;특정&amp;nbsp;파일&amp;nbsp;URL에&amp;nbsp;위치한&amp;nbsp;리소스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# func NSLocalizedString(String, tableName: String?, bundle: Bundle, value: String, comment: String) -&amp;gt; String&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 지역화에 맞는 문자열을 리턴한다. 첫 번째 인자는 key가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key와 comment는 기본값이 없기 때문에 무조건 값을 전달해야 하고, 나머지는 옵션 사항이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1695441606198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func NSLocalizedString(
    _ key: String,
    tableName: String? = nil,
    bundle: Bundle = Bundle.main,
    value: String = &quot;&quot;,
    comment: String
) -&amp;gt; String&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;key&lt;/b&gt;&lt;br /&gt;지정된 테이블에 있는 문자열의 키이다.&lt;br /&gt;키가 문자열 변수 또는 빈 문자열인 문자열에 대해서는 Xcode에서 현지화를 내보낼 수 없다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;tableName&lt;/b&gt;&lt;br /&gt;키-값 쌍을 포함하는 테이블의 이름이다. 또한 현지화된 문자열을 저장할 문자열 파일(확장자가 .strings인 파일)의 접미사이다. tableName이 nil이거나 빈 문자열인 경우 기본값은 Localizable.strings의 테이블이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;bundle&lt;/b&gt;&lt;br /&gt;테이블의 문자열 파일이 포함된 번들이다. 기본 번들이 지정되지 않은 경우 기본 번들이 사용된다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;value&lt;/b&gt;&lt;br /&gt;개발 로캘에 대한 지역화된 문자열이다. 테이블에서 키를 찾을 수 없는 경우 이 값을 반환한다. 만일 value가 &quot;&quot;인 경우, key 값이 된다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;comment&lt;/b&gt;&lt;br /&gt;문자열 파일에서 키-값 쌍 위에 배치할 주석이다. 이 매개 변수는 번역가에게 현지화된 문자열이 사용자에게 표시되는 컨텍스트를 제공한다. 예를 들어 &quot;Book&quot;은 사용되는 문맥에 따라 &quot;책&quot;과 &quot;예약&quot;으로 번역될 수 있다. 이런 다중어를 사용자에게 설명하기 위해 comment를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1695442207054&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NSLocalizedString(&quot;book-tag-title&quot;,
                  value: &quot;Book&quot;,
                  comment: &quot;noun: A label attached to literary items in the library.&quot;)


NSLocalizedString(&quot;book-button-title&quot;,
                  value: &quot;Book&quot;,
                  comment: &quot;verb: Title of the button that makes a reservation.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 개발자라면 다중어가 크게 문제가 되지 않기 때문에 보통 comment는 문자열로 &quot;&quot;로 사용하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bundle을 제외한 나머지 인자들은 전부 리터럴 문자열이여야 한다. 만약 문자열 변수를 사용해야 한다면 localizaedString(forKey:value:table:)를 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 다국어 사용하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;## LocalizedStringKey로 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다국어 파일에서 키-값으로 만든 다국어의 키는 LocalizedStringKey가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 LocalizedStringKey를 바로 사용할 수 있는 다양한 API를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 SwiftUI의 Text에는 init(LocalizedStringKey, tableName: String?, bundle: Bundle?, comment: StaticString?) 생성자가 존재한다. 그러므로 Text(&quot;groups&quot;)처럼 LocalizedStringKey를 전달하면 다국어로 표시된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;## NSLocalizedString() 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 LocalizedStringKey를 지원하지 않는다면 NSLocalizedString()을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1695444963866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NSLocalizedString(&quot;groups&quot;, comment: &quot;&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 더 쉽게 사용하기 위해 Extension을 사용하면 좋다.&lt;/p&gt;
&lt;pre id=&quot;code_1695463766588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extension String {
    func localized(tableName: String? = nil, bundle: Bundle = .main, comment: String = &quot;&quot;) -&amp;gt; String {
        NSLocalizedString(self, tableName: tableName, bundle: bundle, value: self, comment: comment)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1695463785036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;groups&quot;.localized()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;## 보간으로 다국어 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zeddios.tistory.com/744&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zeddios.tistory.com/744&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;## Info.plist 로컬라이징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zeddios.tistory.com/369&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zeddios.tistory.com/369&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 다국어가 안된다면?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말한대로 XCode14.2 미리보기에서는 다국어가 적용되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 시스템 언어로도 다국어가 적용되지 않는 경우도 있었다. 이런 경우에는 Product &amp;gt; Clean bild folder를 하고, 빌드를 해보자.&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/31</guid>
      <comments>https://dev-apple.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 24 Sep 2023 23:18:25 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] Admob, Info.plist 업데이트하는 방법</title>
      <link>https://dev-apple.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고사이트: https://developers.google.com/admob/ios/test-ads?hl=ko&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식문서와 구글링한 정보에서 Info.plist에 정보를 업데이트해라고 하는데... 도저히 Info.plist를 찾을 수가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 진행해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-17 오후 11.15.57.png&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKniJo/btsubLtE638/DF6vd9TI4d7UCKtoR2w1C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKniJo/btsubLtE638/DF6vd9TI4d7UCKtoR2w1C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKniJo/btsubLtE638/DF6vd9TI4d7UCKtoR2w1C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKniJo%2FbtsubLtE638%2FDF6vd9TI4d7UCKtoR2w1C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2388&quot; height=&quot;1754&quot; data-filename=&quot;스크린샷 2023-09-17 오후 11.15.57.png&quot; data-origin-width=&quot;2388&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-17 오후 11.18.08.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9RJpP/btsuArUacl7/6DcgP6PQkIKR5KpVzCYGb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9RJpP/btsuArUacl7/6DcgP6PQkIKR5KpVzCYGb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9RJpP/btsuArUacl7/6DcgP6PQkIKR5KpVzCYGb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9RJpP%2FbtsuArUacl7%2F6DcgP6PQkIKR5KpVzCYGb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;718&quot; data-filename=&quot;스크린샷 2023-09-17 오후 11.18.08.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;info.plist의 기본 소스 코드에서 &amp;lt;dict&amp;gt; &amp;lt;/dict&amp;gt; 사이에&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694960368085&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    
    여기에!!!!
    
	&amp;lt;key&amp;gt;CFBundleURLTypes&amp;lt;/key&amp;gt;
	&amp;lt;array&amp;gt;
		&amp;lt;dict/&amp;gt;
	&amp;lt;/array&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 스피넷 코드를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694960601483&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;key&amp;gt;GADApplicationIdentifier&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt; 여기에! 본인 앱id 입력하기 &amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;SKAdNetworkItems&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;cstr6suwn9.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;4fzdc2evr5.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;4pfyvq9l8r.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;2fnua5tdw4.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;ydx93a7ass.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;5a6flpkh64.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;p78axxw29g.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;v72qych5uu.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;ludvb6z3bs.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;cp8zw746q7.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;3sh42y64q3.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;c6k4g5qg8m.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;s39g8k73mm.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;3qy4746246.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;f38h382jlk.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;hs6bdukanm.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;v4nxqhlyqp.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;wzmmz9fp6w.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;yclnxrl5pm.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;t38b2kh725.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;7ug5zh24hu.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;gta9lk7p23.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;vutu7akeur.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;y5ghdn5j9k.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;n6fk4nfna4.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;v9wttpbfk9.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;n38lu8286q.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;47vhws6wlr.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;kbd757ywx3.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;9t245vhmpl.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;eh6m2bh4zr.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;a2p9lx4jpn.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;22mmun2rn5.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;4468km3ulz.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;2u9pt9hc89.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;8s468mfl3y.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;klf5c3l5u5.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;ppxm28t8ap.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;ecpz2srf59.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;uw77j35x4d.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;pwa73g5rt2.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;mlmmfzh3r3.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;578prtvx9j.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;4dzt52r2t5.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;e5fvkxwrpn.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;8c4e2ghe7u.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;zq492l623r.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;3rd42ekr43.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
  &amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;SKAdNetworkIdentifier&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;3qcr597p9d.skadnetwork&amp;lt;/string&amp;gt;
  &amp;lt;/dict&amp;gt;
&amp;lt;/array&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 swift 파일을 만들어 배너 뷰를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1694962709085&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import SwiftUI
import GoogleMobileAds

struct AdBannerView: UIViewRepresentable {
    private let viewController = UIViewController()
    
    let adUnitID: String
    
    init(adUnitID: String? = nil) {
        if adUnitID == nil {
            self.adUnitID = &quot;ca-app-pub-3940256099942544/2934735716&quot;
        } else {
            self.adUnitID = adUnitID!
        }
    }
    
    func makeUIView(context: Context) -&amp;gt; GADBannerView {
        let bannerView = GADBannerView(adSize: GADAdSizeFromCGSize(CGSize(width: 320, height: 50))) // Set your desired banner ad size
        bannerView.adUnitID = adUnitID
        bannerView.rootViewController = viewController
        bannerView.load(GADRequest())
        return bannerView
    }
    
    func updateUIView(_ uiView: GADBannerView, context: Context) {}
}

struct AdBannerView_Previews: PreviewProvider {
    static var previews: some View {
        AdBannerView()
            .frame(height: 50)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-23 오전 9.29.00.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;1508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oGSfO/btsvne08nYy/m9hd5TI07mhF0XEPIx7Ukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oGSfO/btsvne08nYy/m9hd5TI07mhF0XEPIx7Ukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oGSfO/btsvne08nYy/m9hd5TI07mhF0XEPIx7Ukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoGSfO%2Fbtsvne08nYy%2Fm9hd5TI07mhF0XEPIx7Ukk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;748&quot; data-filename=&quot;스크린샷 2023-09-23 오전 9.29.00.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;1508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 에러가 발생하면, Info.plist를 Property List로 열고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.10.18.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIiQcG/btst83H3NKy/rv1VtD4zzRmtPYJlGDJE3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIiQcG/btst83H3NKy/rv1VtD4zzRmtPYJlGDJE3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIiQcG/btst83H3NKy/rv1VtD4zzRmtPYJlGDJE3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIiQcG%2Fbtst83H3NKy%2Frv1VtD4zzRmtPYJlGDJE3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;546&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.10.18.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GADIsAdManagerApp을 추가하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.11.09.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8za9f/btsuf0jazSV/zQ8VlshkubicbVQTRjL7L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8za9f/btsuf0jazSV/zQ8VlshkubicbVQTRjL7L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8za9f/btsuf0jazSV/zQ8VlshkubicbVQTRjL7L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8za9f%2Fbtsuf0jazSV%2FzQ8VlshkubicbVQTRjL7L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1558&quot; height=&quot;390&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.11.09.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 광고는 테스트용 ID를 이용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.google.com/admob/ios/test-ads?hl=ko&quot;&gt;https://developers.google.com/admob/ios/test-ads?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1694963573197&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;테스트 광고 사용 설정
  
 &amp;nbsp;|&amp;nbsp; iOS &amp;nbsp;|&amp;nbsp; Google for Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 테스트 광고 사용 설정 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. This guide explains how&quot; data-og-host=&quot;developers.google.com&quot; data-og-source-url=&quot;https://developers.google.com/admob/ios/test-ads?hl=ko&quot; data-og-url=&quot;https://developers.google.com/admob/ios/test-ads?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4qudq/hyTVV437qe/jJ1qB9ubY6QQ3dOTt8ZLjK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/dYCInM/hyTVSHgxot/KzJCHk5s9jyty6UepldKe0/img.png?width=1204&amp;amp;height=974&amp;amp;face=0_0_1204_974,https://scrap.kakaocdn.net/dn/c46UNb/hyTVSAvibx/kYn4h311AT26HMohTBseo0/img.png?width=602&amp;amp;height=502&amp;amp;face=0_0_602_502&quot;&gt;&lt;a href=&quot;https://developers.google.com/admob/ios/test-ads?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.google.com/admob/ios/test-ads?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4qudq/hyTVV437qe/jJ1qB9ubY6QQ3dOTt8ZLjK/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/dYCInM/hyTVSHgxot/KzJCHk5s9jyty6UepldKe0/img.png?width=1204&amp;amp;height=974&amp;amp;face=0_0_1204_974,https://scrap.kakaocdn.net/dn/c46UNb/hyTVSAvibx/kYn4h311AT26HMohTBseo0/img.png?width=602&amp;amp;height=502&amp;amp;face=0_0_602_502');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;테스트 광고 사용 설정 &amp;nbsp;|&amp;nbsp; iOS &amp;nbsp;|&amp;nbsp; Google for Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 테스트 광고 사용 설정 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. This guide explains how&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.12.28.png&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beWztm/btsudYzqUre/ynWAGvCGzjUh82ssnbNnck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beWztm/btsudYzqUre/ynWAGvCGzjUh82ssnbNnck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beWztm/btsudYzqUre/ynWAGvCGzjUh82ssnbNnck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeWztm%2FbtsudYzqUre%2FynWAGvCGzjUh82ssnbNnck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1472&quot; height=&quot;786&quot; data-filename=&quot;스크린샷 2023-09-18 오전 12.12.28.png&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/30</guid>
      <comments>https://dev-apple.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 18 Sep 2023 00:13:06 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] TabView / PageTabViewStyle / ForEach</title>
      <link>https://dev-apple.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SwiftUI의 TabView는 PageTabViewStyle을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드는 CoreData의 모델을 PageTabViewStyle로 만든 코드가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;indexViewStyle도 추가해서 하단에 인덱스뷰도 보이게 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1694943733692&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)],
        animation: .default)
    private var items: FetchedResults&amp;lt;Item&amp;gt;

    var body: some View {
        TabView {
            ForEach(items) { item in
                Text(item.name!)
            }
        }
        .tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-17 오후 6.42.46.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;2018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beqHTZ/btst7SzIy0W/YAHsrMsOiWJuVFQpHAOGyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beqHTZ/btst7SzIy0W/YAHsrMsOiWJuVFQpHAOGyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beqHTZ/btst7SzIy0W/YAHsrMsOiWJuVFQpHAOGyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeqHTZ%2Fbtst7SzIy0W%2FYAHsrMsOiWJuVFQpHAOGyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;757&quot; data-filename=&quot;스크린샷 2023-09-17 오후 6.42.46.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;2018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>SwiftUI/Views</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/29</guid>
      <comments>https://dev-apple.tistory.com/29#entry29comment</comments>
      <pubDate>Sun, 17 Sep 2023 18:43:26 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] List의 ForEach에서 FetchedResult 데이터 삭제 시 딜레이 현상</title>
      <link>https://dev-apple.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;List에서 행의 인덱스가 필요해서 다음과 같이 코드를 작성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1694755993916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct PrayersView: View {
    ...
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Prayer.name, ascending: true)],
        animation: .default)
    private var items: FetchedResults&amp;lt;Prayer&amp;gt;
    
    var body: some View {
        List {
            ForEach(items.indices, id: \.self) { index in
                NavigationLink(destination: {
                    PrayerDetailView(items: items, startIndex: index)
                }, label: {
                    Text(items[index].getName())
                        .padding(.vertical)
                })&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 기록 2023-09-15 오후 2.29.23.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C7ify/btsudjvSa3m/yODRXEm4vVAnXXKQenshhK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C7ify/btsudjvSa3m/yODRXEm4vVAnXXKQenshhK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C7ify/btsudjvSa3m/yODRXEm4vVAnXXKQenshhK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/C7ify/btsudjvSa3m/yODRXEm4vVAnXXKQenshhK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;786&quot; data-filename=&quot;화면 기록 2023-09-15 오후 2.29.23.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드만으로는 딜레이가 발생하는 원인을 알 수 없어서 코드를 하나씩 변경해가면서 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 ForEach에서 id를 사용해서 발생하는 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 인덱스를 구하는 메서드를 만들어서 아래와 같이 코드를 수정하니 잘 작동했다.&lt;/p&gt;
&lt;pre id=&quot;code_1694756603384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    var body: some View {
        List {
            ForEach(items) { item in
                NavigationLink(destination: {
                    PrayerDetailView(items: items, startIndex: getIndex(prayer: item))
                }, label: {
                    Text(item.getName())
                        .padding(.vertical)
                })&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 기록 2023-09-15 오후 2.43.33.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgrJWp/btsuemTjyfq/fVdRyfOLjckPa0cgsAws0K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgrJWp/btsuemTjyfq/fVdRyfOLjckPa0cgsAws0K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgrJWp/btsuemTjyfq/fVdRyfOLjckPa0cgsAws0K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bgrJWp/btsuemTjyfq/fVdRyfOLjckPa0cgsAws0K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;768&quot; data-filename=&quot;화면 기록 2023-09-15 오후 2.43.33.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>삽질 이야기</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/28</guid>
      <comments>https://dev-apple.tistory.com/28#entry28comment</comments>
      <pubDate>Fri, 15 Sep 2023 14:45:28 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] Form에서 스크롤 시 키보드 숨기기</title>
      <link>https://dev-apple.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Form에서 TextField가 있을 때, 스크롤 시 키보드는 감추는 예제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 키보드를 감추는 메서드를 View에 확장해서 쉽게 키보드를 감출 수 있게 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694698777778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Foundation
import SwiftUI

extension View {
  func hideKeyboard() {
    UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Form에&amp;nbsp;simultaneousGesture 수정자를 추가하고, 드래그 제스처가 발생 시 키보드를 감추는 메서드를 호출한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694698827134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    var body: some View {
        Form {
            ...
        }
        .simultaneousGesture(DragGesture().onChanged({ _ in
            hideKeyboard()
        }))
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>SwiftUI/Views</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/27</guid>
      <comments>https://dev-apple.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 14 Sep 2023 22:41:17 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] TextEditor 크기를 구하는 방법</title>
      <link>https://dev-apple.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크롤 뷰에 포함된 TextEditor에서 줄바꿈이 발생하면 뷰는 커지지만 스크롤이 되지 않아서 자동 스크롤이 되도록 만들어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# TextEditor의 최소 높이 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 알아야 할 것은 List 또는 ScrollView 안에 TextEditor를 넣으면 TextEditor의 높이는 최소가 된다. 그래서 frame으로 minHeight를 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# TextEditor 크기를 구하는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직은 TextEditor의 크기를 얻는 메서드가 제공되지 않는다. 그래서 bacoground에 HStack같이 확장되는 뷰를 넣고 GeometryReader로 HStack의 사이즈를 측정하면 TextEditor의 크기를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 TextEditor의 크기를 구하는 간단한 SwiftUI 예제코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1694518159006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct ContentView: View {
    @State var text = &quot;&quot;
    @State var size = CGSize(width: 0.0, height: 0.0)
    
    var body: some View {
        ScrollView {
            VStack {
                Text(&quot;Height * Width = \(size.height) * \(size.width)&quot;)
                Text(&quot;-----&quot;)
                ZStack {
                    TextEditor(text: $text)
                        .frame(minHeight: 50)
                        .fixedSize(horizontal: false, vertical: true)
                        .background(GeometryReader { proxy in
                            HStack {}
                                .onAppear { size = proxy.size }
                                .onChange(of: proxy.size) { _ in size = proxy.size }
                        })
                }
                Text(&quot;-----&quot;)
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 기록 2023-09-12 오후 8.37.14.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IaJUQ/btstOhFNsrQ/lKFJVdc2gziTkcs4Uk37L1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IaJUQ/btstOhFNsrQ/lKFJVdc2gziTkcs4Uk37L1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IaJUQ/btstOhFNsrQ/lKFJVdc2gziTkcs4Uk37L1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/IaJUQ/btstOhFNsrQ/lKFJVdc2gziTkcs4Uk37L1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;796&quot; data-filename=&quot;화면 기록 2023-09-12 오후 8.37.14.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI/Views</category>
      <author>_히처리_</author>
      <guid isPermaLink="true">https://dev-apple.tistory.com/26</guid>
      <comments>https://dev-apple.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 13 Sep 2023 00:08:47 +0900</pubDate>
    </item>
  </channel>
</rss>