<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>흑우마스터의 마법의 공간</title>
    <link>https://blackcowmaster.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 16:36:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>흑우마스터</managingEditor>
    <image>
      <title>흑우마스터의 마법의 공간</title>
      <url>https://tistory1.daumcdn.net/tistory/4727870/attach/cbfab334865d48feb4b3799aa421cafa</url>
      <link>https://blackcowmaster.tistory.com</link>
    </image>
    <item>
      <title>meilisearch 우분투+애저 설치 방법</title>
      <link>https://blackcowmaster.tistory.com/68</link>
      <description>&lt;pre id=&quot;code_1745486151311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -L https://install.meilisearch.com | sh&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;/p&gt;
&lt;pre id=&quot;code_1745486180580&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./meilisearch --http-addr 'azure 내부 ip:포트' --master-key='api키'&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;/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;만약 dump파일이 존재한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745486537100&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm -rf /home/xcrew/data.ms
./meilisearch --http-addr '아이피:포트' --master-key='api키' --import-dump /home/특정폴더/dumps/덤프파일명.dump&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;data.ms를 삭제 후 덤프를 추가할 수 있음&lt;/p&gt;</description>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/68</guid>
      <comments>https://blackcowmaster.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 24 Apr 2025 18:16:35 +0900</pubDate>
    </item>
    <item>
      <title>.NET MAUI 안드로이드 CarouselView 내 Bitmap 재활용 오류의 원인과 해결 방법</title>
      <link>https://blackcowmaster.tistory.com/67</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.NET MAUI로 앱을 개발하면서 안드로이드 환경에서 CarouselView 내 이미지 컨트롤을 넣고 페이지를 전환하다 보면 다음과 같은 오류가 발생할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743080256777&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; Java.Lang.RuntimeException: 'Canvas: trying to use a recycled bitmap android.graphics.Bitmap@f8c1cee'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 오류는 안드로이드의 Bitmap 객체가 이미 recycle() 메서드를 통해 메모리에서 해제된 이후, 다시 재사용을 시도할 때 발생한다. 특히 CarouselView처럼 이미지가 빠르게 전환되는 경우에 자주 나타나는 문제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.NET MAUI 안드로이드에서는 내부적으로 Glide 또는 유사한 이미지 로딩 라이브러리를 사용하는데, 이들은 로드된 Bitmap을 내부에서 관리하고 재활용(BitmapPool)에 반환하는 구조를 가지고 있다. &lt;/span&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;span&gt;이 과정에서 개발자가 Bitmap을 다른 작업에 참조하거나, CarouselView에 반복적으로 그리는 작업을 수행할 경우 충돌이 발생할 가능성이 있다.&lt;/span&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;span&gt;.NET MAUI 커뮤니티에서는 이 문제를 해결하기 위해 별도의 핸들러(Handler)를 하라고 해서 해보긴 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743080341361&quot; class=&quot;cs&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;#if ANDROID
using Microsoft.Maui.Handlers;
#endif

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        // 기존 코드...

#if ANDROID
        ImageHandler.Mapper.PrependToMapping(nameof(Microsoft.Maui.IImage.Source), (handler, view) =&amp;gt;
        {
            handler.PlatformView?.Clear();
        });
#endif

        return builder.Build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 실제 테스트 결과, 이 방법은 별다른 효과가 없었고, FFImageLoadingImage와 같은 라이브러리를 사용하면 문제가 해결되긴 했으나 이는 근본적인 해결책이라고 보기 어려웠다.&lt;/span&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;&lt;span&gt;가장 빠르고 확실한 해결 방법은 이미지 컨트롤에 반드시 WidthRequest와 HeightRequest 값을 명시적으로 설정함으로 해결했다.&lt;/span&gt;&lt;span&gt;&amp;nbsp; 비트맵이 정확한 크기를 미리 계산하고 할당할 수 있도록 하여 재활용 과정에서 발생하는 오류를 효과적으로 방지하는거라 생각되는데 맞는지는 잘 모르겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만, 동적인 화면 구성이나 이미지 비율을 유지해야 하는 경우에는 크기를 고정하는 것이 좀 번거로울 수도 있기 때문에 비율에 따라 재계산하는 추가 작업이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MauiReactor 같은 MVU 방식에서는 Render() 또는 Invalidate()를 호출하면 SkiaSharp처럼 Surface가 다시 그려지기 때문에 문제가 덜하지만, 일반 .NET MAUI 환경에서는 추가적인 고민이 필요할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;추가적으로, 만약 이미지 처리 작업이 더 필요하다면 Bitmap의 복사본을 만들어가면서 교체하는 식도 가능할거 같긴한데 이건 커스텀으로 만들어야 되지만 Glide의 메모리 관리 방식과 독립적으로 안정적인 Bitmap 사용이 가능하니까 꼭 해야 되는 사람이 있다면 커스텀 컨트롤로 만드는 것도 방법이지만 대부분 사이즈를 직접 줄 것 같다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/67</guid>
      <comments>https://blackcowmaster.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 27 Mar 2025 22:00:55 +0900</pubDate>
    </item>
    <item>
      <title>Cloudflare Bot Fight Mode로 인해 Ably 웹훅이 403 오류를 반환할 때 해결 방법</title>
      <link>https://blackcowmaster.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 Ably에서 n8n 웹훅을 호출할 때 403 Forbidden 오류가 발생하는 문제를 겪었다.&lt;br /&gt;오류 메시지는 다음과 같았다&lt;/p&gt;
&lt;pre id=&quot;code_1741150723895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message: POST returned HTTP status 403
code: 70002
statusCode: 403
nonfatal: false
href: https://help.ably.io/error/70002
serverId: frontend.efc7.3.us-east-1-A.i-0b9114803583e8c99.e7dDg9szABmY1m&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;이 오류는 Ably의 공식 문서에서 &lt;b&gt;&quot;웹훅이 허용되지 않았다&quot;&lt;/b&gt; 또는 &lt;b&gt;&quot;잘못된 인증 정보&quot;&lt;/b&gt; 문제일 가능성이 있다고 안내하고 있다. 하지만 내 경우에는 웹훅이 정상적으로 등록되어 있었고, 인증 문제도 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;532&quot; data-start=&quot;497&quot; data-ke-size=&quot;size23&quot;&gt;원인: Cloudflare Bot Fight Mode&lt;/h3&gt;
&lt;p data-end=&quot;685&quot; data-start=&quot;533&quot; data-ke-size=&quot;size16&quot;&gt;문제의 원인은 &lt;b&gt;Cloudflare의 Bot Fight Mode&lt;/b&gt;였다.&lt;br /&gt;Cloudflare는 악의적인 봇 트래픽을 차단하기 위해 Bot Fight Mode를 제공하는데, 이 기능이 활성화된 상태에서는 특정 자동화된 API 요청도 봇으로 오인하여 차단할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;749&quot; data-start=&quot;687&quot; data-ke-size=&quot;size16&quot;&gt;결국, Cloudflare의 &lt;b&gt;Bot Fight Mode를 해제&lt;/b&gt;하자 Ably 웹훅이 정상적으로 호출되었다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;794&quot; data-start=&quot;751&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법: Cloudflare Bot Fight Mode 해제하기&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1123&quot; data-start=&quot;795&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;910&quot; data-start=&quot;795&quot;&gt;&lt;b&gt;Cloudflare 대시보드 접속&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;910&quot; data-start=&quot;826&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;826&quot;&gt;&lt;a data-end=&quot;875&quot; data-start=&quot;828&quot;&gt;Cloudflare 대시보드&lt;/a&gt;에 로그인한다.&lt;/li&gt;
&lt;li data-end=&quot;910&quot; data-start=&quot;887&quot;&gt;해당 도메인의 설정 페이지로 이동한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;912&quot;&gt;&lt;b&gt;Bot Fight Mode 설정 변경&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1028&quot; data-start=&quot;945&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;945&quot;&gt;&lt;b&gt;&quot;Security&quot; &amp;rarr; &quot;Bots&quot;&lt;/b&gt; 메뉴로 이동한다.&lt;/li&gt;
&lt;li data-end=&quot;1028&quot; data-start=&quot;984&quot;&gt;&lt;b&gt;&quot;Bot Fight Mode&quot;&lt;/b&gt; 설정을 &lt;b&gt;비활성화(Off)&lt;/b&gt; 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1123&quot; data-start=&quot;1030&quot;&gt;&lt;b&gt;설정 저장 후 테스트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1123&quot; data-start=&quot;1054&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1054&quot;&gt;Bot Fight Mode를 해제한 후 Ably에서 다시 웹훅을 호출해본다.&lt;/li&gt;
&lt;li data-end=&quot;1123&quot; data-start=&quot;1102&quot;&gt;정상적으로 응답이 오는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;1133&quot; data-start=&quot;1125&quot; data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-end=&quot;1321&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size16&quot;&gt;Cloudflare의 Bot Fight Mode는 자동화된 웹 요청을 차단할 수 있기 때문에, &lt;b&gt;Ably, n8n, Zapier 등의 서비스에서 웹훅을 사용할 때 예기치 않은 403 오류를 유발할 수 있다.&lt;/b&gt; 만약 유사한 오류를 경험했다면, Cloudflare의 Bot Fight Mode를 비활성화하는 것이 해결책이 될 수 있다.&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <category>ABLY</category>
      <category>Cloudflare</category>
      <category>n8n</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/66</guid>
      <comments>https://blackcowmaster.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 5 Mar 2025 13:59:38 +0900</pubDate>
    </item>
    <item>
      <title>[C#] IP 정보 조회 서비스 만들기</title>
      <link>https://blackcowmaster.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소 정보를 조회해야 할 때, 간단한 REST API와 C#의 HttpClient를 활용하면 쉽게 구현할 수 있습니다. 이 포스트에서는 무료로 사용할 수 있는 &lt;a href=&quot;http://ip-api.com&quot;&gt;&lt;span&gt;ip&lt;/span&gt;&lt;span&gt;-api&lt;/span&gt;&lt;/a&gt; 서비스를 활용해 C#으로 IP 정보 조회 서비스를 만드는 방법을 소개합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 현재 IP 정보 또는 특정 IP 주소의 상세 정보를 가져옵니다.&lt;/li&gt;
&lt;li&gt;IP 정보에는 위치(나라, 지역, 도시), 시간대, ISP 정보 등이 포함됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;사전 준비&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, JSON 데이터를 파싱하기 위해 &lt;a&gt;&lt;span&gt;Newtonsoft&lt;/span&gt;&lt;span&gt;.Json&lt;/span&gt;&lt;/a&gt; 라이브러리를 설치합니다. NuGet 패키지 매니저에서 아래 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1736932457100&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Install-Package Newtonsoft.Json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;IpInfo 클래스 정의&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP API의 응답 데이터를 매핑할 클래스를 정의합니다. ip-api에서 반환하는 JSON 데이터를 기반으로 각 속성을 매핑할 수 있습니다. 아래는 IpInfo 클래스의 예입니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736932484425&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;public class IpInfo
{
    public string Status { get; set; }
    public string Country { get; set; }
    public string CountryCode { get; set; }
    public string Region { get; set; }
    public string RegionName { get; set; }
    public string City { get; set; }
    public string Zip { get; set; }
    public double Lat { get; set; }
    public double Lon { get; set; }
    public string Timezone { get; set; }
    public string Isp { get; set; }
    public string Org { get; set; }
    public string As { get; set; }
    public string Query { get; set; }
}&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;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;IpService 클래스 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 정보를 가져오는 주요 로직을 작성합니다. 아래 코드는 HttpClient를 사용하여 IP 정보를 가져오는 서비스 클래스입니다:&lt;/p&gt;
&lt;pre id=&quot;code_1736932377351&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class IpService
{
    private static readonly HttpClient _httpClient;

    static IpService()
    {
        // HttpClient 기본 설정 (Timeout, BaseAddress 등)
        _httpClient = new HttpClient
        {
            Timeout = TimeSpan.FromSeconds(10) // 10초 타임아웃 설정
        };
    }

    /// &amp;lt;summary&amp;gt;
    /// IP 주소 정보를 가져옵니다.
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&quot;ipAddress&quot;&amp;gt;IP 주소 (기본값: 공백, 현재 사용자 IP 사용)&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;IP 정보 객체 또는 null&amp;lt;/returns&amp;gt;
    public async Task&amp;lt;IpInfo&amp;gt; GetIpInfoAsync(string ipAddress = &quot;&quot;)
    {
        try
        {
            string baseUrl = &quot;http://ip-api.com/json&quot;;
            string requestUrl = string.IsNullOrWhiteSpace(ipAddress) ? baseUrl : $&quot;{baseUrl}/{ipAddress}&quot;;

            // 비동기 요청 및 응답 처리
            string response = await _httpClient.GetStringAsync(requestUrl);
            return Newtonsoft.Json.JsonConvert.DeserializeObject&amp;lt;IpInfo&amp;gt;(response);
        }
        catch (HttpRequestException httpEx)
        {
            // HTTP 요청 관련 예외 처리
            Console.Error.WriteLine($&quot;HTTP 요청 실패: {httpEx.Message}&quot;);
        }
        catch (Exception ex)
        {
            // 일반 예외 처리
            Console.Error.WriteLine($&quot;오류 발생: {ex.Message}&quot;);
        }

        return null; // 실패 시 null 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;사용 예제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 작성한 서비스를 활용하여 IP 정보를 가져오는 간단한 예제를 작성해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1736932501140&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Program
{
    static async Task Main(string[] args)
    {
        IpService ipService = new IpService();

        // 현재 IP 정보 조회
        IpInfo myIpInfo = await ipService.GetIpInfoAsync();
        Console.WriteLine($&quot;Country: {myIpInfo.Country}, City: {myIpInfo.City}&quot;);

        // 특정 IP 주소 정보 조회
        IpInfo specificIpInfo = await ipService.GetIpInfoAsync(&quot;8.8.8.8&quot;);
        Console.WriteLine($&quot;Country: {specificIpInfo.Country}, City: {specificIpInfo.City}&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;결과&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 실행하면 아래와 같은 결과를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1736932519711&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Country: United States, City: Mountain View
Country: United States, City: Mountain View&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://blackcowmaster.tistory.com/65</guid>
      <comments>https://blackcowmaster.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 15 Jan 2025 18:15:44 +0900</pubDate>
    </item>
    <item>
      <title>.NET MAUI에서 Google Map 설정 및 OnMapReady 활용 방법</title>
      <link>https://blackcowmaster.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;.NET MAUI에서 Google Map을 사용하면서 지도 로딩이 완료된 후 특정 설정을 적용하려면 OnMapReady 메서드를 활용합니다. 이 메서드는 맵이 로드되고 상호작용 준비가 되었을 때 호출됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Google Map 설정 코드 예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 OnMapReady 메서드를 활용하여 Google Map의 UI 설정을 조정하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736838388396&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Controls.Compatibility.Maps.Android;

class MapCallbackHandler : Java.Lang.Object, IOnMapReadyCallback
{
    private readonly IMapHandler mapHandler;

    public MapCallbackHandler(IMapHandler mapHandler)
    {
        this.mapHandler = mapHandler;
    }

    public void OnMapReady(GoogleMap googleMap)
    {
        // 맵 핸들러를 통해 핀이나 맵 상태를 업데이트
        mapHandler.UpdateValue(nameof(IMap.Pins));
         
        // 줌 컨트롤 버튼 비활성화
        googleMap.UiSettings.ZoomControlsEnabled = false;
         
        // &quot;내 위치&quot; 버튼 비활성화
        googleMap.UiSettings.MyLocationButtonEnabled = false;
         
        // 나침반 비활성화
        googleMap.UiSettings.CompassEnabled = false;
 
        // 추가적으로 틸트(기울기) 제스처나 줌 제스처도 비활성화 가능
        googleMap.UiSettings.TiltGesturesEnabled = false;
        googleMap.UiSettings.ZoomGesturesEnabled = false;
    }
}&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;OnMapReady 메서드는 Google Map이 완전히 로드된 후 호출됩니다. 이 시점에서 지도 객체(GoogleMap)의 UI 설정이나 상태를 조정할 수 있습니다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ZoomControlsEnabled&lt;/b&gt;&lt;br /&gt;googleMap.UiSettings.ZoomControlsEnabled = false;&lt;br /&gt;줌 버튼을 비활성화합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MyLocationButtonEnabled&lt;/b&gt;&lt;br /&gt;googleMap.UiSettings.MyLocationButtonEnabled = false;&lt;br /&gt;&quot;내 위치&quot; 버튼을 비활성화합니다. 이 버튼은 위치 서비스가 활성화되었을 때 표시됩니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CompassEnabled&lt;/b&gt;&lt;br /&gt;googleMap.UiSettings.CompassEnabled = false;&lt;br /&gt;사용자가 지도를 회전할 때 나타나는 나침반을 비활성화합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TiltGesturesEnabled&lt;/b&gt;&lt;br /&gt;googleMap.UiSettings.TiltGesturesEnabled = false;&lt;br /&gt;맵의 기울기 제스처를 비활성화합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ZoomGesturesEnabled&lt;/b&gt;&lt;br /&gt;googleMap.UiSettings.ZoomGesturesEnabled = false;&lt;br /&gt;줌 인/줌 아웃 제스처를 비활성화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Xamarin</category>
      <category>.net maui</category>
      <category>MAUI</category>
      <category>구글맵</category>
      <category>지도</category>
      <category>흑우마스터</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/64</guid>
      <comments>https://blackcowmaster.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 14 Jan 2025 16:07:52 +0900</pubDate>
    </item>
    <item>
      <title>iOS 배포 시 문제 해결 : You do not have required contracts to perform an operation You do not have required contracts to perform an operation. (ID:  {errorcode}) (403)</title>
      <link>https://blackcowmaster.tistory.com/63</link>
      <description>&lt;pre id=&quot;code_1735012469215&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2024-12-23 11:21:03.893 *** Error: You do not have required contracts to perform an operation You do not have required contracts to perform an operation. (ID: ) (403)
 {
    NSLocalizedDescription = &quot;You do not have required contracts to perform an operation&quot;;
    NSLocalizedFailureReason = &quot;You do not have required contracts to perform an operation. (ID: 637d228e-7df6-4652-b156-a9de976e1c43)&quot;;
    NSUnderlyingError = &quot;Error Domain=IrisAPI Code=-19241 \&quot;You do not have required contracts to perform an operation\&quot; UserInfo={status=403, detail=You do not have required contracts to perform an operation., id=637d228e-7df6-4652-b156-a9de976e1c43, code=FORBIDDEN_ERROR.CONTRACT_NOT_VALID, title=You do not have required contracts to perform an operation, NSLocalizedFailureReason=You do not have required contracts to perform an operation., NSLocalizedDescription=You do not have required contracts to perform an operation}&quot;;
    &quot;iris-code&quot; = &quot;FORBIDDEN_ERROR.CONTRACT_NOT_VALID&quot;;
}&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;/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;FORBIDDEN_ERROR.CONTRACT_NOT_VALID&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6vdJs/btsLuJZnFKK/KnFxMkfzTXqBdHfjseMbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6vdJs/btsLuJZnFKK/KnFxMkfzTXqBdHfjseMbY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6vdJs/btsLuJZnFKK/KnFxMkfzTXqBdHfjseMbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6vdJs%2FbtsLuJZnFKK%2FKnFxMkfzTXqBdHfjseMbY0%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;1600&quot; height=&quot;874&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;874&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;</description>
      <category>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/63</guid>
      <comments>https://blackcowmaster.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 24 Dec 2024 12:56:47 +0900</pubDate>
    </item>
    <item>
      <title>[Supabase + C#] 특정 계정 기간 내 일시 정지 (Ban)</title>
      <link>https://blackcowmaster.tistory.com/62</link>
      <description>&lt;pre id=&quot;code_1733993437816&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;await supabaseClient.AdminAuth(&quot;어드민 API 키&quot;).UpdateUserById(&quot;유저 아이디&quot;, new Supabase.Gotrue.AdminUserAttributes
{
    BanDuration = &quot;720h&quot; //예시이며 nm ms s m 다 가능하다
});&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;BanDuration에 &quot;None&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;이게 왜 안되나 했는데 당연하게도 Admin 으로 로그인 해야지만 가능한 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/62</guid>
      <comments>https://blackcowmaster.tistory.com/62#entry62comment</comments>
      <pubDate>Thu, 12 Dec 2024 17:51:43 +0900</pubDate>
    </item>
    <item>
      <title>[MAUI] MauiReactor에서 AppLinkRequestReceived 구현</title>
      <link>https://blackcowmaster.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729485293256&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiReactorApp&amp;lt;AppShell&amp;gt;(app =&amp;gt; {
            ConfigureAppLink(app);
        });
  }
  
private static void ConfigureAppLink(ReactorApplication app)
{
    app.AppLinkRequestReceived = uri =&amp;gt;
    {
        //이 곳에서 처리 (아래는 예시)
        
        // 전달된 URI에서 파라미터 읽기
    	var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);

    	// 원하는 페이지로 네비게이션하거나 파라미터 처리
    	string param = queryParams.Get(&quot;paramKey&quot;);
    
    	if (!string.IsNullOrEmpty(param))
    	{
        	// 파라미터 기반으로 특정 페이지로 이동
        	Shell.Current.GoToAsync($&quot;//SpecificPage?param={param}&quot;);
    	}

    	base.OnAppLinkRequestReceived(uri);
    };
}&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;앱 링크가 들어오면 이 곳에서 WeakReferenceMessenger나 StrongReferenceMessenger를 Community Toolkit 등을 이용하여서 파라미터를 전달해주고 처리하는 식으로 해결 해야 될 듯함&lt;/p&gt;</description>
      <category>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/61</guid>
      <comments>https://blackcowmaster.tistory.com/61#entry61comment</comments>
      <pubDate>Mon, 21 Oct 2024 13:34:41 +0900</pubDate>
    </item>
    <item>
      <title>[MAUI] 구글 맵 지도 확대 시 도로가 검은색으로 표기 되는 문제</title>
      <link>https://blackcowmaster.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 에뮬레이터가 구버전이거나 SDK가 너무 낮게 되면 구글 맵 확대 시 도로가 검은색으로 표기 되는 문제가 있다.&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-origin-width=&quot;454&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4FrYW/btsJKfZk7jb/mOtJgNpXtMDZd2yhgS0Zp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4FrYW/btsJKfZk7jb/mOtJgNpXtMDZd2yhgS0Zp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4FrYW/btsJKfZk7jb/mOtJgNpXtMDZd2yhgS0Zp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4FrYW%2FbtsJKfZk7jb%2FmOtJgNpXtMDZd2yhgS0Zp0%2Fimg.jpg&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;454&quot; height=&quot;500&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;500&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;&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-origin-width=&quot;1020&quot; data-origin-height=&quot;2074&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcMvj/btsJIR6wjMx/9MRpm52uhsTA5lkSmZsSK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcMvj/btsJIR6wjMx/9MRpm52uhsTA5lkSmZsSK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcMvj/btsJIR6wjMx/9MRpm52uhsTA5lkSmZsSK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrcMvj%2FbtsJIR6wjMx%2F9MRpm52uhsTA5lkSmZsSK1%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;640&quot; height=&quot;1301&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;2074&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;1135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttO3p/btsJJI14G82/gzzuVFkK5czz0K6IW8bDfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttO3p/btsJJI14G82/gzzuVFkK5czz0K6IW8bDfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttO3p/btsJJI14G82/gzzuVFkK5czz0K6IW8bDfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttO3p%2FbtsJJI14G82%2FgzzuVFkK5czz0K6IW8bDfK%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;640&quot; height=&quot;1358&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;1135&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>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/60</guid>
      <comments>https://blackcowmaster.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 24 Sep 2024 08:02:37 +0900</pubDate>
    </item>
    <item>
      <title>[MAUI] 오류 ADB0020: Mono.AndroidTools.IncompatibleCpuAbiExceptioniopn: 패키지가 이 장치의 CPU 아키텍처를 지원하지 않습니다.</title>
      <link>https://blackcowmaster.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;에뮬레이터의 프로세서가 안드로이드 APK와 아키텍처가 같지 않다면 나는 오류로서 디버그나 릴리즈 시에&amp;nbsp;나는 오류인데 프로젝트 편집에서 아래 코드를 추가하면 정상적으로 돌아간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727131362265&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;RuntimeIdentifiers Condition=&quot;$(TargetFramework.Contains('-android'))&quot;&amp;gt;android-arm;android-arm64;android-x86;android-x64&amp;lt;/RuntimeIdentifiers&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;아래는 ADB에 대한 내용&lt;/p&gt;
&lt;pre id=&quot;code_1727131972208&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;AndroidSupportedAbis&amp;gt;armeabi-v7a;x86;x86_64;arm64-v8a&amp;lt;/AndroidSupportedAbis&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/android/messages/adb0020&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://learn.microsoft.com/en-us/dotnet/android/messages/adb0020&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/Xamarin</category>
      <author>흑우마스터</author>
      <guid isPermaLink="true">https://blackcowmaster.tistory.com/59</guid>
      <comments>https://blackcowmaster.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 24 Sep 2024 07:47:26 +0900</pubDate>
    </item>
  </channel>
</rss>