<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ravine_dev.log</title>
        <link>https://velog.io/</link>
        <description>iOS Developer</description>
        <lastBuildDate>Fri, 11 Nov 2022 18:02:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ravine_dev.log</title>
            <url>https://velog.velcdn.com/images/ravine_dev/profile/8a2d575f-8bb0-45dc-9bad-d879dcb6fd9e/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ravine_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ravine_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[M1 맥북 클렘쉘 모드 끄기]]></title>
            <link>https://velog.io/@ravine_dev/M1-%EB%A7%A5%EB%B6%81-%ED%81%B4%EB%A0%98%EC%89%98-%EB%AA%A8%EB%93%9C-%EB%81%84%EA%B8%B0</link>
            <guid>https://velog.io/@ravine_dev/M1-%EB%A7%A5%EB%B6%81-%ED%81%B4%EB%A0%98%EC%89%98-%EB%AA%A8%EB%93%9C-%EB%81%84%EA%B8%B0</guid>
            <pubDate>Fri, 11 Nov 2022 18:02:42 GMT</pubDate>
            <description><![CDATA[<h2 id="m1-맥에서-클렘쉘-모드-끄는-방법">M1 맥에서 클렘쉘 모드 끄는 방법</h2>
<h3 id="1-homebrew-설치">1. homebrew 설치</h3>
<p>터미널을 열고 아래 내용 입력</p>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre><h3 id="2-noclamshell-설치-및-실행">2. noclamshell 설치 및 실행</h3>
<p>noclamshell 설치</p>
<pre><code>brew install pirj/homebrew-noclamshell/noclamshell</code></pre><p>noclamshell 실행</p>
<pre><code>brew services start noclamshell</code></pre><h2 id="클램쉘-모드-다시-켜는방법">클램쉘 모드 다시 켜는방법</h2>
<h3 id="1-nocalmshell-중지-및-제거">1. nocalmshell 중지 및 제거</h3>
<p>noclamshell 중지</p>
<pre><code>brew services stop noclamshell</code></pre><p>noclamshell 제거</p>
<pre><code>brew uninstall pirj/homebrew-noclamshell/noclamshell</code></pre><h2 id="추후버전에서의-trouble-shooting을-위한-git-저장소-url">추후버전에서의 Trouble Shooting을 위한 Git 저장소 URL</h2>
<h3 id="httpsgithubcompirjnoclamshell"><a href="https://github.com/pirj/noclamshell">https://github.com/pirj/noclamshell</a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[iOS 어플리케이션에서 사용되는 "시간" 값]]></title>
            <link>https://velog.io/@ravine_dev/iOS-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EC%8B%9C%EA%B0%84-%EA%B0%92</link>
            <guid>https://velog.io/@ravine_dev/iOS-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EC%8B%9C%EA%B0%84-%EA%B0%92</guid>
            <pubDate>Wed, 09 Nov 2022 05:43:34 GMT</pubDate>
            <description><![CDATA[<h2 id="ios-어플리케이션을-운영하다보면-원인을-알-수-없는-비정상동작-리포트는-필연적이다">iOS 어플리케이션을 운영하다보면 원인을 알 수 없는 비정상동작 리포트는 필연적이다.</h2>
<p>수많은 비정상동작 문의를 경험하다보면, iOS 기기의 설정값에 의한 비정상동작이 생기는 경우가 굉장히 많다.
오늘은 그 중 하나인 기기의 &quot;시간 설정&quot; 에 따른 비정상동작에 대해서 이야기 해 보려고 한다.
구글에 관련 내용을 검색해 보면, 실제로 수많은 개발자들이 이 &quot;시간&quot; 값의 정확도와 오차를 최소화 하기 위해 많은 고민들을 하고 있다.</p>
<p>어플리케이션의 동작중 &quot;시간&quot; 이라는 값은 굉장히 자주 쓰이게 된다.
사용자가 직접 캘린더나 타임피커를 통해서 값을 설정하도록 하는 서비스도 있지만 그렇지 않은 경우도 많다.
후자의 경우 두가지 값을 사용하게 된다.</p>
<ol>
<li>기기의 로컬 시간</li>
<li>서버 시간</li>
</ol>
<h3 id="기기의-로컬-시간이-자동으로-설정-되어-있을-경우">기기의 로컬 시간이 자동으로 설정 되어 있을 경우</h3>
<p>오차가 매우 적고 신뢰도가 높지만, 서비스의 기준지역이 서울인 반면 고객의 위치가 서비스 기준지역이 아닌 외국인 경우 시간대가 다르게 잡히게 되어 비정상동작을 하게 될 수 있다.
그리고 기기의 로컬 시간을 임의로 세팅 한 경우도 마찬가지다.</p>
<h3 id="그렇다면-반대로-서버-시간을-사용하게-되면-어떨까">그렇다면 반대로 서버 시간을 사용하게 되면 어떨까?</h3>
<p>오차가 매우 적고 신뢰도가 높다. 그러나, 시간 값이 필요할때 마다 서버로 부터 시간 값을 요청하게 될 경우 수많은 요청 트랜잭션으로 서버를 점유하게 되고 그에따른 비용이 발생 하게 될 것이다.</p>
<h3 id="내가-생각한-해결방안은-다음과-같았다">내가 생각한 해결방안은 다음과 같았다.</h3>
<ol>
<li>로그인, 세션 재접속 등 트랜잭션을 통해 서버로부터 HostTime을 받아온다.</li>
<li>HostTime을 받아오는 시점에 기기의 LocalTime(1)을 전역변수에 저장한다.</li>
<li>서비스 중 시간값을 요청 받는 시점에 기기의 LocalTime(2)을 확인하고 LocalTime(1)과의 Interval을 구하여 HostTime에 더해준다.</li>
</ol>
<p>이 방법을 사용할 경우 서버로부터 시간값을 요청하는 횟수도 줄이면서 실제 시간과의 오차가 Millisecond 단위인 비교적 정밀한 시간값을 가지게 된다.</p>
<p>다만 앱이 실행중인 동안에 기기의 시간을 임의로 변경하는 경우에는 오차가 커지는 약점이 있는데 그런 케이스는 굉장히 적고 일정 시간 Term이나 트랜잭션 발생시에 보정 해 준다면 더욱 적어질 것이다.</p>
<h3 id="더-나은-방법이-있다면-댓글로-알려주세요-">더 나은 방법이 있다면 댓글로 알려주세요 !</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Firebase Crashlytics - NSPlaceholderString initWithString(nil argument)]]></title>
            <link>https://velog.io/@ravine_dev/Firebase-Crashlytics-%EB%B9%84%EC%A0%95%EC%83%81-%EC%A2%85%EB%A3%8C-%EC%BC%80%EC%9D%B4%EC%8A%A4-Fatal-Exception-NSInvalidArgumentException</link>
            <guid>https://velog.io/@ravine_dev/Firebase-Crashlytics-%EB%B9%84%EC%A0%95%EC%83%81-%EC%A2%85%EB%A3%8C-%EC%BC%80%EC%9D%B4%EC%8A%A4-Fatal-Exception-NSInvalidArgumentException</guid>
            <pubDate>Tue, 08 Nov 2022 14:16:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ravine_dev/post/7bebaf4a-57e9-4aed-a56b-711651b3222e/image.png" alt=""></p>
<h3 id="nsstring을-초기화-할때-일반적으로-아래의-3가지-방법을-사용한다">NSString을 초기화 할때 일반적으로 아래의 3가지 방법을 사용한다.</h3>
<pre><code>1. NSString *str = @&quot;&quot;;
2. NSString *str = [[NSString alloc] initWithFormat: @&quot;%@&quot;, var];
3. NSString *str = [[NSString alloc] initWithString: var];</code></pre><p>나의 경우에는 3번을 사용하여 초기화 하였다.</p>
<p>구글링을 하다 보면 3번 방법보다 2번 방법이 비교적 안전하다는 이야기가 있는데 사실 2를 사용하든 3을 사용하든 (var == nil) 일 경우 동일하게 crash가 발생 하는것을 확인 하였기 때문에 NSString 초기화 방식은 문제가 아니었다.</p>
<h3 id="그렇다면-왜-var의-값이-nil이-되었을까">그렇다면 왜 var의 값이 nil이 되었을까?</h3>
<p>Flow는 다음과 같았다.</p>
<ol>
<li>사용자로부터 민감정보를 입력 받는다.</li>
<li>입력 받은 민감정보를 AES256 암호화 하여 NSString으로 저장</li>
<li>특정 시점에 필요에 의하여 암호화된 민감정보를 복호화</li>
<li>복호화 한 데이터를 사용하기 위해 다른 NSString 변수에 초기화 값으로 사용</li>
</ol>
<p>내가 사용중인 AES256 암복호화 코드는 신뢰도가 아주 높은 오픈소스였기에 해당 로직에서 nil을 반환할 가능성을 전혀 예상치 못했다.
복호화 코드를 확인하다가 다음 내용을 보는순간 문득 예전 생각이 떠올랐다.</p>
<pre><code>NSString *result = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];</code></pre><p>서버 또는 웹으로부터 전달받은 문자열에 UTF-8 인코딩이 불가한 문자가 포함되어 있을 경우 nil을 반환하여서 서비스 장애가 발생한 적이 있었는데, encoding 이라는 코드가 보이자 마자 그 생각이 떠오른 것이다.</p>
<p>고객이 입력하는 문자열은 ASCII 범주 안의 문자를 사용하였지만 AES256 암호화와 복호화를 하는 과정에서 특수한 문자로 변환되는 케이스가 있지 않을까?</p>
<p>그래서 다음과 같이 방어코드를 넣어주기로 했다.</p>
<ol>
<li>UTF-8 인코딩</li>
<li>UTF-8 인코딩 결과가 nil 일 경우, Latin-1 인코딩</li>
<li>Latin-1 인코딩 결과가 nil 일 경우, WindowsCP1252 인코딩</li>
</ol>
<pre><code>NSString *result = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

    if (result == nil) {
        result = [[NSString alloc] initWithData:theData encoding:NSISOLatin1StringEncoding];

        if (result == nil) {
            result = [[NSString alloc] initWithData:theData encoding:NSWindowsCP1252StringEncoding];
        }
    }</code></pre><h3 id="결과는-대성공-">결과는 대성공 !</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mac 디스플레이를 가장 쉽고 효율적으로 사용하는 방법]]></title>
            <link>https://velog.io/@ravine_dev/%EB%8B%B9%EC%8B%A0%EC%9D%98-Mac-%ED%99%94%EB%A9%B4%EC%9D%84-%EA%B0%80%EC%9E%A5-%EC%89%BD%EA%B3%A0-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@ravine_dev/%EB%8B%B9%EC%8B%A0%EC%9D%98-Mac-%ED%99%94%EB%A9%B4%EC%9D%84-%EA%B0%80%EC%9E%A5-%EC%89%BD%EA%B3%A0-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Fri, 12 Aug 2022 15:22:47 GMT</pubDate>
            <description><![CDATA[<p>맥을 사용하다보면 여러개의 브라우저 화면이나 어플리케이션 화면들을 동시에 띄워놓아야 하는 순간들이 생깁니다.
Mac OS Monterey 부터는 전체화면 Split View 기능을 제공하고 있지만 전체화면 사용을 선호하지 않는 저에겐 쓸모없는 기능이나 다름없죠.
단돈 9,900원에 당신의 맥 화면을 쉽고 효율적으로 그리고 아름답게 사용 할 수 있다면 어떨까요?</p>
<h2 id="1-magnet-for-mac">1. Magnet for Mac</h2>
<p>마치 마법처럼 Magnet 은 당신의 앱 화면들을 너무나도 쉽게 디스플레이의 적재적소에 위치 시킵니다.
그리고 당신이 어떻게 위치시키고 싶은지 미리 알고 있었던것 처럼 다양한 기능들을 준비해 두고 있습니다.
<img src="https://velog.velcdn.com/images/ravine_dev/post/433ce1d2-18ae-48a2-9945-3b391fee1232/image.png" alt=""></p>
<h2 id="2-설치">2. 설치</h2>
<p>App Store 에서 Magnet 을 구매하고 설치 버튼을 누르세요.</p>
<h3 id="설치를-완료했다면-이제-magnet-을-승인하실-차례입니다">설치를 완료했다면 이제 Magnet 을 승인하실 차례입니다.</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/8cb35ddf-199c-4315-a9a6-55c1037b59db/image.png" alt=""></p>
<h3 id="시스템-환경설정을-실행하고-보안-및-개인-정보-보호-를-선택하세요">시스템 환경설정을 실행하고 &quot;보안 및 개인 정보 보호&quot; 를 선택하세요.</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/748f9c34-7e5f-41e2-a930-b5483e10d7e9/image.png" alt=""></p>
<h3 id="손쉬운-사용-항목에-들어갑니다">&quot;손쉬운 사용&quot; 항목에 들어갑니다.</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/86d88f06-1c8c-4332-8e80-07b291d2dff9/image.png" alt=""></p>
<h3 id="설치를-완료하셨다면-로그인-시-마그넷-론칭하기-를-체크하는것도-잊지-마세요">설치를 완료하셨다면 &quot;로그인 시 마그넷 론칭하기&quot; 를 체크하는것도 잊지 마세요.</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/47257956-948e-4313-ba17-659867f794af/image.png" alt=""></p>
<h2 id="3-설정">3. 설정</h2>
<p>이제 설정을 해볼 차례입니다.
저는 주로 2분할, 왼쪽과 오른쪽 배치 기능을 사용합니다. 최대화 기능과 디스플레이 전환 기능도 정말 유용하죠.</p>
<p>나머지 기능들은 필요할 때 까지 단축키를 모조리 지워버립니다.</p>
<h3 id="2분할-왼쪽과-오른쪽-단축키-설정">2분할 왼쪽과 오른쪽 단축키 설정</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/431155d3-452d-430a-bf72-d872f2f91faf/image.png" alt=""></p>
<h3 id="최대화-기능과-디스플레이-전환-단축키-설정">최대화 기능과 디스플레이 전환 단축키 설정</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/fb4e587e-ec66-4816-94d4-981a8bd03097/image.png" alt=""></p>
<h2 id="4-모든-준비를-마쳤습니다">4. 모든 준비를 마쳤습니다.</h2>
<p>기능들을 한번 사용 해 봅시다.</p>
<h3 id="safari-브라우저를-왼쪽으로-배치">Safari 브라우저를 왼쪽으로 배치</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/f5b50ac1-0622-44f4-8de7-59899b129fc0/image.png" alt=""></p>
<h3 id="잘-하셨습니다">잘 하셨습니다.</h3>
<h3 id="이번엔-오른쪽으로-배치-해-봅니다">이번엔 오른쪽으로 배치 해 봅니다.</h3>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/53275a1f-4217-472e-b7ee-2b6915cbad3c/image.png" alt=""></p>
<h2 id="다른-기능들이-궁금하시다구요">다른 기능들이 궁금하시다구요?</h2>
<h3 id="직접-사용해-보세요">직접 사용해 보세요.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Source Tree 외부 비교 도구를 Beyond Compare로 설정 해 보자]]></title>
            <link>https://velog.io/@ravine_dev/Source-Tree-%EC%99%B8%EB%B6%80-%EB%B9%84%EA%B5%90-%EB%8F%84%EA%B5%AC%EB%A1%9C-Beyond-Compare%EB%A5%BC-%EC%84%A4%EC%A0%95-%ED%95%B4-%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@ravine_dev/Source-Tree-%EC%99%B8%EB%B6%80-%EB%B9%84%EA%B5%90-%EB%8F%84%EA%B5%AC%EB%A1%9C-Beyond-Compare%EB%A5%BC-%EC%84%A4%EC%A0%95-%ED%95%B4-%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Thu, 11 Aug 2022 11:05:54 GMT</pubDate>
            <description><![CDATA[<p>저는 Source Tree를 통해 프로젝트 파일의 변경사항을 확인할때 내용이 너무 복잡하거나 파일의 용량이 클 경우 외부 비교 도구를 사용하여 변경사항을 점검합니다.</p>
<p>이전 회사에서 SVN로 형상관리를 했는데 Diff 성능이 그다지 만족스럽지 못하고 가시성도 좋지 않아서 Beyond Compare를 사비로 구매하여 사용했습니다.</p>
<p>Beyond Compare는 Text 비교에서 부터 디렉터리내의 파일 비교, 3-Way Merge 등 강력한 기능을 제공하면서 비교적 가벼운 프로그램으로 실행속도 또한 빠른편 입니다.</p>
<p>다행히 지금 회사에서는 Git과 Source Tree를 사용하여 형상관리를 하고 있으며,
Source Tree의 여러 기능들을 둘러보던 중 외부 비교 도구로 Beyond Compare를 지원하고 있어서 설정하였고 그 방법을 기록하려고 합니다.</p>
<h2 id="1-beyond-compare-설치">1. Beyond Compare 설치</h2>
<p>Beyond Compare는 여기서 설치 하실수 있습니다 -&gt; &quot;<a href="https://www.scootersoftware.com&quot;">https://www.scootersoftware.com&quot;</a></p>
<p>Beyond Compare는 Pro Edition($60)과 Standard Edition($30) 두가지가 있습니다.
두 Edition 의 가장 큰 차이점은 Merge 기능 입니다.</p>
<p>간단한 내용을 Diff 하거나 Merge 할때는 Standard Edition 으로도 충분하지만, 3-Way Merge 등의 기능이 필요하거나 이런 Pro Edition만의 기능들이 작업시간을 크게 단축 시켜주는 경우도 있으며, Merge를 수행하는 과정에서 발생하는 실수도 줄여줍니다.</p>
<p>잘 이해가 되지 않으신다고요?
<strong>본인이 학생이라면 고민하지말고 Standard Edition 을 선택하세요.</strong></p>
<p>Pro Edition을 구매하기 망설여진다면 아래의 방법이 도움이 될 것 입니다.</p>
<h3 id="다음중-하나에-해당하면-pro-edition-을-선택하세요">다음중 하나에 해당하면 Pro Edition 을 선택하세요</h3>
<ul>
<li>나는 현직에서 일하는 프로그래머다</li>
<li>하나의 프로젝트를 3인 이상 동시에 개발한다</li>
<li>Merge 과정에서 종종 실수를 하곤 한다</li>
<li>개발중인 프로젝트 하나에 여러 소규모 프로젝트들이 동시다발적으로 발생한다</li>
</ul>
<p>그래도 선택이 쉽지 않으시다구요?</p>
<p>과감하게 Standard Edition을 구매하세요.
Beyond Compare는 언제든지 Pro로 업그레이드가 가능합니다 !</p>
<h2 id="2-beyond-compare---command-line-tools-설치">2. Beyond Compare - Command Line Tools 설치</h2>
<p>Beyond Compare 를 Source Tree 의 외부 비교 도구로 설정하기 위해서는 Command Line Tools 를 설치 해야 합니다.</p>
<p>방법은 간단합니다. 그냥 &quot;Install Command Line Tools&quot; 버튼을 눌러주세요.
<img src="https://velog.velcdn.com/images/ravine_dev/post/6709a15a-df97-470d-bc1a-e230ee8972cd/image.png" alt=""></p>
<h2 id="3-source-tree-의-외부-비교-도구를-beyond-compare-로-설정하기">3. Source Tree 의 외부 비교 도구를 Beyond Compare 로 설정하기</h2>
<p>모든 준비를 마쳤습니다.
너무 쉽죠? 이제 설정만 남았습니다.</p>
<h4 id="-souretree의-설정-들어가기">* SoureTree의 설정 들어가기</h4>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/421c2d8e-06aa-4eed-ba31-f69167478c47/image.png" alt=""></p>
<h4 id="-비교-탭-들어가기">* 비교 탭 들어가기</h4>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/6c5d6c52-7e1e-4f7a-adaf-902e183bdf73/image.png" alt=""></p>
<h4 id="-시각적-비교-도구-병합-도구-beyond-compare-선택하기">* 시각적 비교 도구, 병합 도구 &quot;Beyond Compare&quot; 선택하기</h4>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/c81bf2ee-460b-4589-8f27-1492fcc6b0a1/image.png" alt=""></p>
<h4 id="-sourcetree로-변경사항을-외부-비교도구로-open-하기">* SourceTree로 변경사항을 외부 비교도구로 Open 하기</h4>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/857189cf-b1f4-4a37-a462-3384c9e84def/image.png" alt=""></p>
<h4 id="-beyond-compare로-실행-된-화면">* Beyond Compare로 실행 된 화면</h4>
<p><img src="https://velog.velcdn.com/images/ravine_dev/post/850aa498-7fd4-4755-abbb-3509b590d66b/image.png" alt=""></p>
<h2 id="축하합니다-">축하합니다 !</h2>
<h3 id="주위-사람들에게-당신이-얼마나-대단한-사람인지-알려주세요-">주위 사람들에게 당신이 얼마나 대단한 사람인지 알려주세요 !</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG - Designing for iOS]]></title>
            <link>https://velog.io/@ravine_dev/%EC%95%A0%ED%94%8C-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%B2%A0%ED%95%99-iOS</link>
            <guid>https://velog.io/@ravine_dev/%EC%95%A0%ED%94%8C-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%B2%A0%ED%95%99-iOS</guid>
            <pubDate>Tue, 09 Aug 2022 13:45:53 GMT</pubDate>
            <description><![CDATA[<p>iOS Native 개발자가 된지 만 4년만에 &quot;애플 디자인 철학&quot; 도큐먼트를 읽어보기로 했습니다.
내용중 핵심만 간략히 메모하는식으로 기록하려고 합니다.</p>
<h2 id="ios용-디자인">iOS용 디자인</h2>
<h3 id="ios용-앱-디자인은-ios-경험을-구별하는-기본적인-장치-특성과-패턴을-이해하는-것부터-시작">.iOS용 앱 디자인은 iOS 경험을 구별하는 기본적인 장치 특성과 패턴을 이해하는 것부터 시작</h3>
<h4 id="1-표시">1. 표시</h4>
<pre><code>- iPhone의 중간 크기의 고해상도 디스플레이</code></pre><h4 id="2-인체공학">2. 인체공학</h4>
<pre><code>- iPhone을 사용할때 한손 또는 두손
- 가로방향, 세로방향 전환
- iPhone과의 거리는 1~2피트를 넘지 않는 경향</code></pre><h4 id="3-입력">3. 입력</h4>
<pre><code>- Multi-Touch 제스처, 화면 키보드, 음성 제어
- 위치, 기기의 가속도계, 자이로스코프 입력으로 공간적 상호작용</code></pre><h4 id="4-앱-상호-작용">4. 앱 상호 작용</h4>
<pre><code>- 이벤트, 소셜 미디어 업데이트, 메시지 전송에 1~2분
- 웹 검색, 게임, 미디어 한시간 이상
- 동시에 여러개의 앱을 열어놓고 전환</code></pre><h4 id="5-시스템-기능">5. 시스템 기능</h4>
<pre><code>- 위젯
- 홈 화면 빠른 작업
- 스포트라이트
- 바로가기
- 활동 보기</code></pre><h2 id="모범-사례">모범 사례</h2>
<h3 id="훌륭한-iphone-경험은-사람들이-가장-중요하게-생각하는-플랫폼과-장치-기능을-통합">.훌륭한 iPhone 경험은 사람들이 가장 중요하게 생각하는 플랫폼과 장치 기능을 통합</h3>
<h3 id="ios에서-디자인이-집처럼-느껴지도록-하려면-이러한-기능을-통합하는-우선-순위를-지정">.iOS에서 디자인이 집처럼 느껴지도록 하려면 이러한 기능을 통합하는 우선 순위를 지정</h3>
<h4 id="1-최소한의-상호작용">1. 최소한의 상호작용</h4>
<pre><code>- 화면 컨트롤 수를 제한하여 기본 작업과 콘텐츠에 집중할 수 있도록 함</code></pre><h4 id="2-장치-방향-다크모드-및-동적-유형">2. 장치 방향, 다크모드 및 동적 유형</h4>
<pre><code>- 사용자에게 가장 적합한 구성을 선택 할 수 있도록 함</code></pre><h4 id="3-일반적으로-장치를-잡는-방식을-지원하는-상호-작용을-활성화">3. 일반적으로 장치를 잡는 방식을 지원하는 상호 작용을 활성화</h4>
<pre><code>- 컨트롤을 디스플레이의 중간 또는 하단 영역에 배치
- 스와이프로 뒤로 탐색, 목록 행에서 작업을 시작</code></pre><h4 id="4-사용자의-허가를-통해-데이터-입력을-요구하지-않고-경험을-향상시키는-방식으로-플랫폼-기능을-통해-사용-가능한-정보를-통합">4. 사용자의 허가를 통해 데이터 입력을 요구하지 않고 경험을 향상시키는 방식으로 플랫폼 기능을 통해 사용 가능한 정보를 통합</h4>
<pre><code>- 결제 수락
- 생체 인증을 통해 보안 제공
- 장치의 위치를 사용하는 기능 제공</code></pre>]]></description>
        </item>
    </channel>
</rss>