목록프로그래밍 (95)
개발자 블로그
최근에 아이폰 앱을 업데이트 하는 과정에서 겪은 문제다. 제목이 너무 길어질까봐 CFBundleVersion Mismatch 하나만 썼는데, 아마 CFBundleShortVersionString Mismatch 경고도 함께 떴을꺼다. 일단 에러는 아니다. 그렇기 때문에 그냥 냅둬도 문제는 없지만 괜히 찝찝하니깐 해결하는 방법을 알아보자.그 전에 아래는 애플에서 받은 메일. 내용을 요약하면, "메인 앱과 쉐어 익스텐션 버전이 불일치한다. 앱 업로드는 성공했다." 정도 되겠다. 이번에 Share Extension을 추가했는데, 원래 메인 앱(이걸 정확히 뭐라고 지칭해야 되는지 모르겠네..)과 버전이 다르기 때문에 발생한 경고였다. 업로드 하기 전에 Validate 할 때는 아무 말이 없더니.. 진작 알려주든..
혹시 시뮬레이터에서 테스트 하고 있지는 않나요??시뮬레이터에서는 표시가 안되네요.실단말에 연결해서 테스트 해보세요.잘 됩니다.예전에도 이것 때문에 한참을 삽질했는데.. 그 기억을 또 까먹고 같은 삽질을 반복했네요.나이를 먹어서 그런건가..기억력이 예전같지 않을 것 같기도 하고. 그렇게 삽질 해놓고 어떻게 그걸 까먹을 수 있는지..
Google Play에서 앱 업데이트 버전을 출시하려고 했더니 갑자기 "새로운 권한"이 추가되었다고 경고를 보여준다. '음.. 뭐지??' 신규 Activity는 추가 했어도 권한(permission)을 추가한적은 없는것 같은데..??특히나 READ_PHONE_STATE 권한은 "위험한 권한"으로 분류되기 때문에 사용자의 명시적인 권한 부여가 필요하다. 안드로이드 권한 그룹 ☞ https://developer.android.com/guide/topics/security/permissions.html?hl=ko#normal-dangerous 혹시나 싶어서 AndroidManifest.xml 파일을 확인해 봤지만, "android.permission.READ_PHONE_STATE" 권한은 아래 코드에서 확인할..
아이폰 또는 아이패드에서 기기를 회전시켰을 때 화면이 자동으로 돌아가는 것을 방지하는 코드.AppDelegate 대신 override를 이용해서 처리하는 코드다. 참고로 여기서 얘기하는 특정 화면의 단위는 NavigationController로 연결된 모든 ViewController를 말한다.방법은 UINavigationController에서 shouldAutorotate: Bool 변수와 supportedInterfaceOrientations: UIInterfaceOrientationMask 변수를 override 해주면 된다.만약 모든 화면에서 화면 회전을 못하도록 막고 싶다면 간단하게 extension을 사용해서 처리할 수 있다. extension UINavigationController { ove..
다른 OS와 마찬가지로 안드로이드에도 파일명으로 사용할 수 없는 특수 문자들이 있다. 이러한 특수 문자들의 종류는 아래와 같다.| \ ? * /이런 특수문자들을 제거하기 위한 소스 코드는 아래와 같다.public String convertFilename(String orgnStr) { String restrictChars = "|\\\\?*
2.x 버전 쓰다가 3.x 버전으로 업그레이드 한지는 좀 됐는데 늦게나마 써본다. 혹시 아직도 2.x대 버전을 사용중인 사람이 있을 것 같아서.베타가 아닌 정식 버전이지만 그동안 당한게 있어서 그런지 최신버전으로 선뜻 업데이트 하기가 참 망설여졌다. 왜냐하면 안드로이드 스튜디오 버전 업데이트를 할 때마다 프로그램이 아무 문제없이 매끄럽게 돌아간적이 없었기 때문에.꼭 한글 관련해서 문제가 생겼다. 나 말고도 수 없이 많은 사람들이 겪은 문제이지 않나 싶다. '한글 깨짐' 문제. 나도 전에 이 문제와 관련해서 해결 방법을 포스팅 하기도 했다.2016/10/02 - [프로그래밍/안드로이드] - 안드로이드 스튜디오 2.2 레이아웃 한글 깨짐 해결방법2016/09/17 - [프로그래밍/안드로이드] - 안드로이드 ..
일반적으로 윈도우에서는 TTF, 맥(Mac)에서는 OTF 폰트를 쓴다는건 익히 알려져있지만 안드로이드 기기에서는 무슨 폰트를 써야 되는지 명확한 설명을 찾아보기 어려웠다. 각 포맷 자체에 대한 설명, 곡선을 그리는 방식의 차이에 대한 글은 봤지만,, 일반 사용자 입장에서는 별로 와닿지 않는 내용일테고. 정작 중요한건 "기기에서 어떻게 보이느냐?"가 아닐까 싶다.시간이 없는 바쁜 분들을 위해서 결론부터 말하면, 안드로이드에서는 OTF 폰트를 사용하기를 추천한다. 안드로이드 테스트를 하기 전에 먼저 윈도우에서 TTF, OTF 두 폰트를 비교해보자. 아래 사진 중 위에가 TTF, 아래가 OTF 폰트다.글자 크기가 큰 텍스트는 차이가 거의 없어보이지만, 크기가 작은 텍스트는 확실히 TTF 폰트가 더 보기 좋아보..
Android Studio에서 사용되지 않는 리소스를 찾아서 제거하는 방법.Android Studio 메뉴에서 [Analyze] > [Inspect Code...]를 선택. 그럼 Android Studio 하단 [Inspection Results] 패널에 Inspection 결과가 나타난다. 여러가지 항목들 중 미사용 리소스는 [Android Lint: Performance] > [Unused resources] 항목으로 이동하면 발견할 수 있다. 리소스 항목을 선택하면, 우측에 사용 가능한 명령들이 표시되는데, 바로 삭제하거나 Inspection에 더이상 표시되지 않도록 경고를 끌거나 할 수 있다.
I have summarized the information related to the screenshots of the smartphone that I have checked by my phone and friends. For reference, the source code for Android screenshots can be found at the link below. https://github.com/aosp-mirror/platform_frameworks_base/blob/master/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java#L97 Device OS Version Directory File name 1..
안드로이드 폰의 경우, 기기에 따라 스크린샷 이미지가 저장되는 디렉토리나 파일명이 서로 다르다. 가지고 있는 폰과 주변 지인들에게 부탁해서 확인 가능한 폰의 스크린샷 정보를 정리해봤다. 참고로 안드로이드 스크린샷 관련 소스 코드는 아래 링크에서 볼 수 있다. https://github.com/aosp-mirror/platform_frameworks_base/blob/master/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java#L97 기기명 OS버전 디렉토리 파일명 형식 1 넥서스 5x 8.0 Pictures/Screenshots Screenshot_yyyyMMdd-HHmmss.png 2 갤럭시 S88.0 DCIM/Sc..
오늘 이거 때문에 짜증나 죽는 줄 알았네.. 쉽게 찾을 수 있는 문제였는데 안될려면 이렇게도 안된다.일단 상황 설명을 좀 해야될 것 같은데,설정화면에서 색상을 선택할 수 있는 UI를 구현하고 있었다.색상을 표시하기 위해서 ImageView를 사용했고, xml 파일에서 ImageView의 src 속성 적용해줬다. 사용자가 Color Picker를 통해서 색상을 선택하면, 아래 코드를 통해서 ImageView에 적용한 Drawable의 색상을 변경해준다. selColorView = view.findViewById(R.id.img_sel_color); if (selColorView != null) { selColorView.setColorFilter(selColor); }안드로이드 N(누가)에서는 잘 동작하는..
업데이트 한지는 한참 지났는데.. 이제서야 쓴다. 처음 아이폰 앱 개발을 시작했을 때의 개발환경은 Xcode8, swift3였다. iOS11 출시와 함께 xcode9, swift4가 정식으로 출시 되었고, 최근에 앱을 업데이트 하면서 Xcode와 swift 언어도 업데이트 해보았다.사실 뭐 인터넷으로 자료를 찾아볼 때 이미 swift 버전이 올라갈 때 마다 문법도 굉장히 달라진다는건 알고 있던터라 여기저기서 에러를 뿜어댈거라는건 미리 예상하고 있었다. 그리고 xcode 버전업은 이번이 처음이긴하지만, Android studio에서 당했던(?)걸 생각해보면 이거 역시 깔끔하게 돌아갈거라고는 생각하지 않았고, 불행히도 예상은 적중했다.일단 xode9과 swift4의 일반적인 변경 사항은 아래 링크와 영상을 ..
기획자, 디자이너의 도움없이 개발자 혼자서 앱을 만든다는건 참 어려운일 같다. 아니 정확하게는 앱을 만드는건 어렵지 않은데, 이쁘게 만든게 어려운 것 같다. 근데 이 "이쁘게"가 절대적으로 중요하다. 기능이 아무리 뛰어나다고 해도 일단 디자인이 구리면, 사용자들은 아예 설치 조차 안한다. 나 역시 나홀로 개발자라서 디자인 관련된 작업들도 모두 혼자서 다 하고 있는데, 지금까지 몇 개의 프로그램을 만들면서 도움받았던 디자인 관련 사이트들을 정리해봤다. 나 처럼 디자이너 없이 혼자 고군분투하면서 앱을 개발하고 있을 나홀로 개발자들에게 도움이 되었으면 좋겠다.총 21개의 사이트를 소개하려고 한다. 단순 나열하기에는 좀 많은 것 같아서 아래처럼 카테고리를 나눠봤다.색 관련아이콘 관련이미지 관련디자인 가이드기타 ..
앱을 사용하다가 백그라운드로 전환 된 후에 시간이 한참 지나면 시스템이 메모리 확보를 위해서 앱을 종료 시킨다. 다시 앱이 Active 상태로 전환 될 때 정상적인 동작을 위해서는 onSaveInstanceState 함수를 오버라이딩해서 필요한 멤버변수의 값을 저장하는 등의 필요한 조치를 해야 된다. onCreate에서는 인자로 넘어온 Bundle값을 체크해서 다시 멤버변수의 값을 복원해주는 등의 작업을 해야 되고. 사실 코딩하는건 간단한데, 테스트 하는게 쉽지가 않다. 시스템이 앱을 kill 시키는 경우를 만들어야 되는데 사용자가 제어할 수 있는게 아니니깐.내가 가지고 있는 안드로이드 책에는 DDMS에서 프로세스를 종료시키면 된다고 써있는데.. 막상 해보면 앱이 완전히 종료되어 버린다. 사실 [개발자 ..
Visual Studio 2015에서 발생한 문제고, C# winform을 사용해서 프로그래밍을 하는 과정에서 발생한 문제다.대충 검색해보니깐, Visual Studio가 아닌 다른 응용프로그램에서도 발생하는 문제인 것 같다. 화면을 캡쳐해두지 않아서 비슷한 이미지를 찾아서 첨부했다.다만 내 경우에는 "매개 변수 이름"이 "key"가 아니고, "context"였다. 전체 메시지는값은 null일 수 없습니다. 매개 변수 이름: context 내가 만든 프로그램에서 다국어 버전을 위해서 Language는 한국어와 영어 이렇게 두 개를 지원하는데, Language 항목을 "영어"로 변경한 다음에 실행하려고 하면, 위에 첨부한 에러 메시지가 떴다. 재미있는건 Localizable 항목을 False로 변경한다음에..
안드로이드 오레오(8.0, API26)에서 ProgressDialog가 Deprecated 되었다. iOS에는 원래 이게 없어서 만들어 썼었는데.. 안드로이드에서는 있던 걸 Deprecate 시켰다. 아니 왜?? 이유를 찾아보니..ProgressDialog가 모달(Modal) 대화상자기 대문에 사용자와의 상호작용성을 떨어트리기 때문이란다. 아예 ProgressBar를 화면에 추가하던지, Notification을 통해서 구현하라고 한다. 아래는 그 내용. (출처)This class was deprecated in API level 26. ProgressDialog is a modal dialog, which prevents the user from interacting with the app. Instea..
안드로이드 새 버전이 출시 되었다. 이번에는 알파벳 O로 시작할 차례. 이미 공개된지 오래지만, 이름은 오레오(Oreo)다.그동안 앱 업데이트를 조금 소홀히 했더니 검색 순위에서도 엄청 밀리고.. 유입보다 삭제가 더 많은 지경에 까지 이르렀다,, 개발한다고 끝나는게 아니구나. 블로그도 새로운 포스팅 작성 안하면 유입이 점점 줄어들던데 앱 개발도 별로 다르지 않은 것 같다.targetSdkVersion을 올리는건 조심해야 된다. 예전에 안드로이드 마시멜로 버전이 출시 되었을 때 한 번 달라진 권한 모델 때문에 피를 본 경험이 있다. 이 때의 기억이 트라우마로 남은건지.. 버전을 올릴 때 마다 늘 걱정이 된다..-_-;;안드로이드 오레오(Android 8.0)에서 달라진 동작들은 여기서 확인 할 수 있다. ..
안드로이드 마시멜로 버전이 출시되었을 때, 변경된 권한 모델로 인해서 꽤 많은 피(?)를 본 경험이 있다. 그래서 그런지 새로운 안드로이드 버전이 출시 될 때마다 '권한'과 관련된 변경사항은 특별히 더 신경을 써서 챙겨본다.과거 마시멜로 권한 관련 에피소드는 아래 링크를 참조2016/10/20 - [전업개발자 이야기] - 첫 번째 앱을 출시했다가 다시 내리기까지.. 이번에 새롭게 출시 된 안드로이드 오레오(Oreo, 8.0) 버전에서도 '권한'에 대한 변경이 있다. (원문 보기 : https://developer.android.com/about/versions/oreo/android-8.0-changes.html?hl=ko#rmp)간단하게 설명하면, 안드로이드 마시멜로(6.0)부터 누가(7.1) 까지는 ..
이런 모양의 패턴을 정확하게 뭐라고 부르는지 모르겠다,,-_-;; 아니 정확한 명칭이 있기는한가? 모르겠네,,그래도 그냥 "투명 배경 패턴" 이라고 하면 다들 뭔지 알긴할꺼다. 아래 이미지 처럼 하얀색과 회색의 사각형이 반복적으로 나타나는 패턴. 이걸 이미지 리소스를 사용하지 않고, swift 코드로 생성하는 방법을 소개하려고 한다. 아래 코드는 그냥 투명 배경 패턴 이미지를 생성해서 UIImageView에 배경 패턴으로 설정하는 코드다. func setMosaicPattern() { // 투명 배경 패턴 이미지 생성 let image = createPatternImage(blockWidth: 10) // 배경색으로 설정 imgView.backgroundColor = UIColor(patternImage..
사용자에게 앱 기능 사용방법을 안내하기 위해서 만든 아이콘(이라기 보다는 이미지라고 하는게 적당하겠다.)동작을 설명하기 위해서는 정적인 이미지보다는 애니메이션으로 실제 움직임을 표현하는게 더 효과적이긴 하겠지만, 스와이프 동작이 이제는 어느정도 널리 알려진 표준 동작이지 않나 싶어서 - 특히 아이폰에서는 더욱 - 그냥 간단하게 PNG이미지로 만들었다. (이미지를 클릭하면 확대 됩니다.)원본 이미지 사이즈는 1343 x 911px.pixabay에서 다운로드 받은 손가락 이미지를 적절히 수정해서 만들었다. 아래는 아이폰에서 실제로 사용한 모습.tint를 적용하면 원래의 컬러는 무시되고 tint color로 적용됨.
MS의 Windows와는 다르게, iOS나 안드로이드는 하위 버전에 대한 호환성을 별로 지원하지 않는 듯 하다. 특히 iOS쪽이 좀 더 심한 것 같은데, 이 부분은 그래도 애플에서 OS업데이트를 오랫동안 지원해줘서 크게 문제는 안되는 것 같다.반면 안드로이드는 삼성나 LG같은 대기업에서 제조한 플래그쉽 모델조차 OS 업데이트는 두 번이 최대인 것 같다. 일단 지금 내가 사용중인 G2도 킷캣이랑 롤리팝 이렇게 두 번의 업데이트가 전부였다. 그리고 얼마 전에는 G4의 누가 업데이트를 하지 않겠다고 밝혔다가 여론이 악화되자 다시 번복하는 일도 있었다. (안되는데는 이유가 있다.)관련기사 - LG전자, 'G4'·'V10' 최신 업데이트 지원한다(종합) 개발하는 앱의 성격에 따라서 조금씩 다르기는한데, 내 경우에..
새로운 버전이나 소식들을 표현할 때 쓸 수 있는 아이콘. 투명배경에 가운데 글자는 흰색입니다. 자유롭게 사용하세요. 128 x 128px 48 x 48px 32 x 32px 16 x 16px
아이폰 시뮬레이터(에뮬레이터인 줄 알았는데 시뮬레이터였네.. 근데 둘 사이에 차이가 뭐지..?? -_-a)에 저장되어있는 사진 파일을 가져오는 방법이다.사진을 시뮬레이터에 넣는건 매우 간단하다. 그냥 사진 파일을 시뮬레이터로 드래그 앤 드롭하면 알아서 사진이 복사 된다. 가져오는건 Mac의 Finder를 통해서 가져올 수 있다. 시뮬레이터 장치의 경로는 아래와 같다. 참고로 Xcode 버전은 8버전이다. 과거버전을 사용하고 있다면 경로가 다를수도 있다.(사용자 디렉토리) / 라이브러리 / Developer / CoreSimulator / Devices 위 경로에 들어가면 아래 이미지처럼 많은 폴더들이 보이는데, 폴더명이 시뮬레이터 장치의 UUID이다.원하는 장치의 UUID 확인은 Xcode에서 확인 할 ..
안드로이드만 하다가 iOS 앱을 개발하려니 파일 시스템에 대한 개념 부터 참 새로웠다. 안드로이드는 이미 익숙히 알고 있던 개념이라서 배우는데 어려움이 없었는데, iOS는 iCloud도 있고.. 디렉토리에 따라 용도가 이미 정해져있기 때문에 아무 디렉토리나 마음대로 쓰면 안된다. 아이폰 앱 개발 초보자라면 일단 아래 가이드 문서를 본 다음에 시작하도록 하자.File System Basics - https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html타이틀에 이미 적었듯이, Documents..
아이폰 앱 개발을 위해서 사용하는 개발툴인 XCODE의 테마를 변경하는 방법에 대한 내용이다. 안타깝게도 Android Studio 처럼 프로그램의 전체 테마를 변경할 수 있는건 아니고, 에디터와 콘솔의 색상만 변경할 수 있다. XCODE의 기본(Default) 테마는 아래 첨부한 이미지처럼 하얀색을 기본으로 한다. 테마는 [Preference]의 [Fonts & Colors] 항목에서 변경이 가능하다.위 사진 좌측에 보이는 것들이 선택가능한 테마의 목록이다. (참고로 'Darcula'는 내가 따로 설치한 테마라서 기본 상태에서는 존재하지 않는다.)이 목록 중 어두운 계열의 테마는 Civic, Dusk, Midnight이다. 각각의 적용 모습은 아래와 같다. 1. Civic이건 나머지 테마와 비교해서 폰..
static uitableview라고 한건 정확하게는 content로 "Static Cells"를 사용하는 테이블 뷰, 그러니깐 테이블 뷰의 항목(Cell)들이 디자인 타임에 정의되는걸 말한다. 보통 "설정" 화면 같은 경우에 여기에 해당된다고 하겠다.기본적으로는 섹션이 하나 생기고 그 섹션에 Table View Cell들이 추가되는 형태가 된다. 섹션을 추가하려면 아래 첨부한 이미지에 보이는 것 처럼 Table View의 속성 중 "Sections" 항목의 값을 변경시켜주면 된다.사실 이렇게 포스팅을 작성할 필요도 없을 정도로 너무 간단한건데.. 나는 테이블 뷰의 Section도 Cell처럼 하나의 오브젝트라고 생각해서 Object Library에서 찾느라고 한참 헤맸다. 당연히 Object Libra..
디자인 타임에 폰트를 설정하는 방법은 너무나도 간단하다. 그냥 레이블 선택 한 다음에 폰트를 설정해주면 그걸로 끝.런 타임에 폰트를 적용하는 방법 역시 어렵지 않다. 폰트 객체 생성한 다음에 레이블의 '.font'에 대입해주면 끝. 개괄적인 내용은 아주 훌룡한 튜토리얼이 있어서 링크로 대체한다. (영어지만 그냥 이미지만 보면서 따라해도 쉽게 할 수 있다.)관련글 ☞ Common Mistakes With Adding Custom Fonts to Your iOS App 프로그램 소스 코드는 아래와 같다. let myLabel = UILabel() let fontSize = UIFont.systemFontSizelet newFont = UIFont(name: "font_family_name", size: fo..
이미지 위에 텍스트를 그리는 경우, 외곽선(Stroke)을 그리는 방법에 따라서 그려진 결과 이미지의 텍스트 품질에 영향이 있다. 예전에 C#에서 프로그래밍 할 때는 투명배경에 그릴 때와 불투명배경에 텍스트를 그릴 때 비슷한 품질의 차이가 있었는데, 그 때 생각이 나네. 텍스트의 외곽선을 선택적으로 그린다고 했을 때, 구현하는 방법에 따라서 아래 두 가지 방법을 생각해볼 수 있을 것 같다.1. if 조건문을 이용해서 필요한 경우에만 그려주는 경우 2. NSStrokeWidthAttributeName 속성값을 이용하는 경우2번 방법을 이용하는 경우는 width 값을 0으로 주면 결국에는 외곽선을 안그리는 결과를 가져온다. 2번 같은 방법은 코드에서 조건문이 사라지기 때문에 개인적으로 선호하는 방법이다. (..
iOS 앱 개발 시 ImageView에 적용 가능한 ContentMode의 속성에 따른 이미지 표시 방법을 정리 해봤다. 한글로 늘리기, 자르기 정도로만 알고있어서 영어 단어만 봐서는 정확하게 어떻게 표시하는건지 감이 잘 안잡힌다.참고로 UIImageView가 가지고 있는 속성은 아니고 UIView의 속성인 듯 하다. 근데 일반 뷰에서도 쓸 일이 있긴한가..?? 아직 아이폰앱 개발 뉴비라서 잘 모르겠다. 쉽게 외우는 나만의 방식은 제일 밑에서 소개하겠다.상하로 길고 크기가 큰 원본 이미지를 해당 이미지보다 크기가 작은 정사각형의 UIImageView 컨트롤에 표시하는 방식으로 진행했다. 일단 아래 이미지가 샘플 이미지다. 블로그에 첨부한다고 리사이즈를 해서 작은데 테스할 때 사용한 이미지는 당연히 원본 ..
문제의 현상을 조금 구체적으로 설명하면, 일단 Windows7에서는 문제가 안되고, Windows10에서만 발생한다. (Windows8은 없어서 테스트 못해 봄) 트레이 영역에 생성한 아이콘을 마우스 우클릭 했을 때 컨텍스트 메뉴를 띄워주는데, 윈도우의 시작표시줄을 우클릭 했을 때 뜨는 컨텍스트 메뉴가 동시에 떠버리는 현상이다. 같이 뜨는 것 자체도 문제지만, 이렇게 동시에 떴을 때 아래 이미지처럼 z-order가 시작표시줄이나 시스템 컨텍스트 메뉴보다도 더 밑에 위치해 있어서 선택하는 것 역시 쉽지가 않다. 문제의 원인을 파악하는건 어렵지만 해결 방법은 매우 간단한 경우가 많은데, 이번에도 그랬다..마우스 우클릭 이벤트를 잡는 부분의 코드를 WM_RBUTTONDOWN 이벤트를 잡아서 처리했는데, 이걸 ..