라벨이 아이폰인 게시물 표시

아이폰 그리고 안드로이드 화면 동일성 추구 개발에 관하여...

이미지
 아이폰과 안드로이드를 각각 네이티브로 개발을 해온지 세월이 꽤나 흘렀다. 항상 화면의 동일성을 추구하였다. 이왕이면 같은 화면을 보여줘야 사용자가 편할꺼란 생각이었다. 그러다 보니 몇가지 원칙이 생겼다. 일단 화면을 보자. 안드로이드 화면이다. 아이폰 화면이다. 각 화면의 가운데에 뷰를 만들고 거기에 제목 문자열 그리고 그 밑에 프로그레스바를 추가하였다. 안드로이드의 액티비티는 엑스코드의 뷰컨트롤러가 된다. 안드로이드의 프레임레이아웃은 엑스코드의 뷰가 된다. 기본으로 이런 구조를 맞추고 나머지 세세한 부분을 맞추면 된다. 엑스코드에서 크기는 뷰는 전체 뷰와 크기를 동일하도록 컨스트럭트를 추가한 후 거기 비율을 조정한다. 안드로에드에서 크기는 프레임 레이아웃의 크기를 0dp 로 설정한 다음 웨이트를 주어서 조정하면 둘의 크기는 같아진다. 안드로이드에서 리니어와 프레임만 사용해서 구현하면 엑스코드의 뷰를 사용한 것과 동일한 화면을 맞출 수 있다. 각 특성별로만 있는 객체는 가급적 사용하지 않는것이 좋다. 대부분의 화면은 라벨, 버튼, 프로그레스, 이미지 등이면 충분하다. 사실 사용자는 이게 아이폰인지 안드로이드인지 상관하지 않는다. 기능에 충실한 앱을 만드는 것이 기술자이지 않을까 싶다.

Guideline 2.1 - Information Needed 대응

이미지
기존에 운영되는 앱에 전면광고를 제거하고 배너광고만 두고 개편을 하였다. 심사 거절은 이렇다. 광고 추적 투명성 어쩌고 저쩌고 인거 같다. 광고가 나오기 전에 허용여부를 받아야 하는데 그게 나오지 않는다는거 같다. AppDelegate.swift 부분에 구현하라는 검색 결과에 따라 앱 시작할 때 허용여부를 묻는 걸 구현하여 심사를 다시 올렸다. 결과는 같은 것만 되풀이 했다. 몇번을 되풀이 했는지 모른다. 심사자를 바꿔달라고 해도 같은 말만 되풀이 했다. 결국 안되는 영어로 정독을 했다. 개발자 커뮤니티에서 찾은 샘플코드로 다시 변경하여 올렸다. 결국 이걸로 통과가 되었다. 별도의 함수를 만들어서 이 함수에서 허용 여부에 대한 답이 없으면 약간 지연 후 다시 호출하도록 하였다. 이 함수는 광고가 표출되는 화면의 ViewDidLoad 에서 호출하도록 구현하였다. 심사자들이 너무 꼼꼼하게 처리하는건 아닌거 같다. 안전이나 이런 곳에는 꼼곰한게 맞는데 이런 광고 모듈에 철저한 심사는 약자에 대한 횡포인거 같다.

아이폰에서 유튜브 mp3 다운받는 방법

아이폰에서 유튜브 음원파일 다운로드 하는 밥법입니다. 일단 앱스토어에서 fuleMusic 앱을 다운로드 받습니다. 앱을 실행하면 오른쪽 상단에 마법물약 아이콘을 터치합니다. 하단에 배너 광고가 사라지면서 그 자리에 Youtube-DL 버튼이 생깁니다. 이제 그 버튼을 터치 해보세요. 다운로드 창이 뜹니다. 유튜브에서 주소를 복사하여 다운로드 주소에 붙여넣기를 하면 Download URL 이 활성화됩니다. 이 버튼을 터치하시면 다운로드가 시작됩니다. 다운로드 시간이 많이 걸리므로 광고를 보시고 기다리면 됩니다. 다운로드가 완료되면 창이 닫히고 메인창 음원리스트에 음원이 추가되어 있는걸 확인할 수 있습니다.

앱 출시 과정에 대한 넋두리

 아이폰 앱을 먼저 만들고 안드로이드 앱을 만들었습니다. web server는 node express, database는 mongodb, server는 네이버클라우드 1년 무료를 신청하여 마이크로 서버에 위의 환경을 구축하였습니다. 도메인은 가비아에 신청하여 1년 결제를 하였고 SSL 은 letsencrypt 에 연동하여 매월 갱신되도록 설정하였습니다. haproxy 를 설치하여 서버에 접근하는 트래픽을 분산하도록 설정하였습니다. 가령 예를 들어 topScore api 를 호출하는 건수가 많아지면 하나의 node express 로 처리하는게 버거울꺼 같아서 같은 서비스를 포트별로 분기하는 방식으로 설정하였어요. 그 트래픽 분기는 haproxy 가 하는 것이고요. 이게 서버 성능을 100%까지 끌어올리는데 꽤 역할을 합니다. 일단 서버측 모듈은 이런식으로 대충 구성이 되어 클라이언트인 앱 개발을 시작하였습니다. 아이폰 앱을 스위프트로 스토리보드를 사용하여 만들었습니다. 화면 구성을 하고 기능들을 입혀 가면서 서버 모듈과 테스트도 하여 완성시켜 나갔습니다. 아이폰 앱을 심사를 올리고 안드로이드 개발에 나섰습니다. 아이폰의 ViewController 를 안드로이드의 Activity 로 변환하는 느낌으로 개발을 하였습니다. 안드로이드는 자바로 구성하였는데 저 같은 경우는 아이폰에서 안드로이드를 더하는 느낌으로 개발하므로 코틀린은 자료가 없어서 힘들었고 자바는 자료가 많아 개발하기가 너 나은 느낌이었습니다. 둘 다 앱이 심사에 통과되어 스토어에 올라 갔는데 다운로드 수가 늘지 않습니다. 디자인이 문제 인거 같아 아는 디자이너를 수배하여 디자인 시안을 받아서 적용하였습니다. 이 작업이 만만치가 않더군요. 나중에 금전적인 여유가 있으면 개발 전에 디자인을 받아서 작업하는 좋겠다는 생각이 들더군요. 디자인을 적용하니 이제야 어구를 갖춘 어선이 되었구나 하는 느낌이었습니다. 만선을 기대하여 출항하는 배처럼...., 다운로드 수가 많아지길 바라며 스토어에 올렸는데....... 

아이폰에서 RFID 사용하는 방법

아이폰에서 NFC 나 RFID 를 사용하는 방법을 조사한 내용입니다. 아이폰은 NFC 가 안된다... 이런 말을 많이 듣습니다. 조사한 결과로는 iOS 11 이 설치된 iPhone 7 이상의 폰에서 가능합니다. NFC 와 RFID 의 차이는 무엇일까? NFC는 RFID 취약점을 보완한 물건이라고 생각하면 좋습니다. 보통 RFID는 태그의 고유값을 읽어 들여 이를 서버에서 처리하는 내용입니다. 바코드를 대체하기 위해 만들어서 사용했기 때문입니다. 하지만 이를 교통카드 처럼 결제에 이용되다 보니 RFID-ID(보통 anti collision identification 이라고 부릅니다.)는 리더만 있으면 쉽게 수집하여 복사할 수 있습니다. 쉽게 말해 보안에 취약합니다. 결제에 사용하기 위해 고유값 보다 변동되는 값을 사용하고 암호화를 사용할 수 있는 쓰기 가능한 영역이 필요해서 추가된 내용이 NFC로 보면 되겠습니다. 청출어람이 이런 곳에 쓰이면 딱 맞는 표현일까요? 저도 이런 생각을 했습니다. 그럼 결제에 사용하는게 아니라 인식만 하기 위해서 아이폰을 활용하면 어떨까? 아이폰 7 이하에서는 "애플페이 결제할 때 RFID-ID가 발급되니까" 이를 인식하면 되지 않을까? 아래 링크에 자세한 설명이 되어 있긴 합니다만 "결론은 안된다!!"입니다. https://www.raptrack.com/article/blog/core-nfc-2/ anti collision identification 발급이 랜덤하게 매번 다르게 생성이 됩니다. 이는 읽을 수만 있는 형식으로 제공됩니다. 물론 이런 방식으로 제공해야 보안에 우수합니다. 이제 iOS 11 이상이 설치된 iPhone 7 이상에서 NFC를 사용하는 방법입니다. core NFC 프레임워크에서 제공하는 델리게이트를 사용하면 가능합니다. NDEF 메시지를 읽어서 개발자가 태그를 인코딩하면 가능합니다. 보통 카드번호 같은 형식을 만들어서 인코딩합니

소액결제 유도 추정 문자

이미지
바로 위와 같은 문자가 왔네요. 아이폰이라 클릭이 되지 않네요. 위 숫자는 아이피로 클릭하면 서버로 연결이 됩니다. 연결되면 서버에 설정된 일이  실행되겠지요. 가령, 소액결제 나 연락처 주소 등 개인정보를 가져갈 수 있습니다. 해결법은 보낸 번호를 차단하고 메시지는 삭제 하는 겁니다.

[iOS] 프로퍼티 선언시 어디에 할까? .h 또는 .m

iOS 업데이트 되면서 변화된게 있다. 인터페이스에 객체와 메소드를 선언하는데 기존에는 .h 이곳에 했었다. 하지만 이제는 프로퍼티가 public 인지 private 인지 판단해야 한다. public 이면 .h 파일에 선언하고 private 이면 .m 파일에 선언해야 한다. 별 구분없이 사용해서 앱을 제작하였지만 좀 더 견고한 앱을 제작하기 위해서는 객체지향 설계에 따라 구분하는게 좋다. 샘플 코드에 갑자기 .m 파일에 프로퍼티를 선언하길래 이건 뭔가 싶었다. 하지만 애플 문서를 보다 보니 그렇게 나누어서 하라고 한다. 앞으로 구분해서 사용해야 겠다.

아이폰 느려졌을 때 대처방법

아이폰이 많이 느려졌다. 요즘 사용하는 앱들이 자원을 많이 차지해서일터이다. 이럴땐 이렇게 해보자 일단 [설정-일반-재설정]을 선택하자. 이곳에서 [모든 설정 재설정]을 선택하면 초기화가 된다. 이 작업을 하기 전에 백업은 반드시 하도록 하자. 재부팅하면서 설정을 초기화 하는데 조금 빨라짐을 느낄 수 있다. 그래도 느리다면 교체를 검토해야 한다. 난 언제 바꾸지.  ㅠㅠ

iOS 에서 JSON 결과 가져오기

이미지
iOS 5 부터 JSON을 처리하기 위한 NSJSONSerialization 이 추가되어 있습니다. 이를 활용하여 사용하는 방법입니다. 코드는 몇줄 되지 않습니다. 먼저 request를 작성합니다. NSURLReauest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"주소"]]; request 결과를 받기 위한 response를 작성합니다. NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; JSON 데이터를 받기 위한 NSArray를 선언합니다. NSError *jsonParsingError = nil; NSArray *receiveArray = [NSJSONSerialization JSONObjectWithData:response option:0 error:&jsonParsingError]; 루프를 돌면서 자료를 처리합니다. NSDictory *JSON_Data; for (int i=0; i < [receiveArray count]; i++) {   JSON_Data = [receiveArray objectAtIndex:i];   NSLog{"Name: %@, price:%@", [JSON_Data objectForKey:"@name"], [JSON_Data objectForKey:@"price"]); } 위와 같이 작성한 결과를 돌려보니 잘 나옵니다.