Posted
Filed under 개발/iOS
* 20 Xcode Tips & Tricks - Updated for Xcode 9 - 2017
https://www.youtube.com/watch?v=38LNXk_oTak&t=308s
- 1. Visual debugging: 앱을 실행시키고 있는 상태에서 디버깅 창의 작은사각+큰사각+작은사각 형태의 아이콘을 클릭하면 층구조의 스토리보드를 볼 수 있다.
- 4. cmd+0: 왼쪽 상태창 숨김. cmd+opt+0: 오른쪽 상태창 숨김
- 5. Automatic indentation: 영역지정후 ctl+I
- 6,7. 컴포넌트 배치나 연결에 View hierachy를 사용하라
- 10. 폰트크기조정: cmd++ or cmd--
- 11. 리네이밍: 영역지정후 오른쪽버튼 -> refactor -> rename 단축키는 cmd+ctl+e
- 12. 리팩토링: 영역지정후 오른쪽버튼 -> refactor -> extract method
- 13. cmd 누른 상태에서 브라킷에 가져다대면 시작 브라킷까지의 영역을 보여줌
- 15. //MARK: - Example 을 쓰면 아웃라인에서 함수를 구분해줌
- 16. 주석 on off: cmd+/
- 17. cmd+shift xcode 전용 스포트라이트 창이 열림
- 18. 커스텀 definition추가: Xcode에서 커스텀 함수로 추가하고 싶은 영역을 선택해서 함수 스니펫에 추가하면 단축키로 함수를 추가 가능.
- 19. 함수를 선택 -> 오른쪽 클릭 -> jump to definition 으로 원래 함수정의 위치로 날라감



* 10 Xcode Tips & Tricks - Xcode 10
https://www.youtube.com/watch?v=1uVnWbygg_c
- 1. 스토리보드 리팩토링: Editor -> Refactor to Storyboard
- 2. Build time Track: defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES 를 터미널에 입력
- 7. 멀티라인 커서 에디팅: ctrl + shift + 클릭
- 8. vertical selection: option + 드래그
- 9. 스토리보드 프리뷰: assistant editor -> Manual -> preview
- 10. #warning("워닝메시지"), #error("에러메시지")를 붙여서 반드시 수정하도록 notice를 줄 수 있다.
2019/09/24 18:54 2019/09/24 18:54
Posted
Filed under 개발/iOS
사용자 삽입 이미지















Move the fighter to the left and right to avoid the meteorites and destroy the enemies!

The goal is to defend the universe by defeating various enemies and 5 types of alien bosses using missiles and items.

Three fighters with different ability are available. Please select your favorite fighter according to your play style.

Destroying the fourth boss will increase all abilities of the fighter to the highest value, regardless of the type of the fighter selected.

Pour all the missiles in the final stage!

Unlimited continue is allowed. Even if you are not good at shooting games, you can always clear game by continuing the infinite challenge.


https://apps.apple.com/app/space-piyongpiyong/id1462255763
사용자 삽입 이미지







2019/08/16 20:29 2019/08/16 20:29
Posted
Filed under 개발/iOS
* 코드를 작성할 때는 Swift 코딩규약에 따라 작성한다

스위프트 공식 홈페이지에서 마련한 가이드라인은 다음과 같다.
- API Design Guidelines
http://swift.org/documentation/api-design-guidelines/

코딩교육사이트로 유명한 raywenderlich.com 에서 제시하는 가이드라인은 다음과 같다. 현재 v4.2 를 기준으로 하고 있다.
- The Official raywenderlich.com Swift Style Guide
http://github.com/raywenderlich/swift-style-guide
이 가이드라인은 한국어로도 번역되어 있다.
http://kka7.tistory.com/59

구글에서 제안하는 스위프트 코딩 규약은 다음 페이지에서 찾을 수 있다.
- Google Swift Style Guide
http://google.github.io/swift/

일본의 IT 교육회사에서 사용하고 있는 스위프트 코딩규약도 있다. 2018년 1월 시점
- Swiftコーディング規約@Life is Tech !
http://qiita.com/ShinokiRyosei/items/916e658fda6d6862c706

Github에서도 스위프트 코딩스타일에 대한 가이드라인을 마련했는데 2017년 11월 시점으로 업뎃을 중단했다.
- Github guide to Swift style and conventions
http://github.com/github/swift-style-guide



*규약을 항상 외우고 있을수는 없기 때문에 Lint 플러그인을 사용하여 자동으로 문법오류를 잡도록 하는것이 편리하다. SwiftLint라는  도구가 그 역할을 할 수 있다.
- SwiftLint
http://github.com/realm/SwiftLint

SwiftLint를 개발한 realm.io의 소개강의가 있다
- SwiftLint로 보다 명확하고 깔끔한 코드를 만들어 보세요!
http://academy.realm.io/kr/posts/slug-jp-simard-swiftlint/

SwiftLint의 사용법은 다음 페이지에서 상세히 설명하고 있다.
- iOS ) 내 프로젝트에 SwiftLint를 적용해보자
http://zeddios.tistory.com/447



* 코드를 깔끔하게 작성했다면 코드를 자동으로 문서화 하는 툴인 Jazzy를 사용할 수 있다.
- Jazzy
http://github.com/realm/jazzy

realm.io에서 개발한 jazzy를 사용하면 Xcode에서 Markdown 스타일로 작성한 코드를 문서화해준다
- Documenting Your Swift Code in Xcode Using Markdown
http://www.appcoda.com/swift-markdown/
- Swift Documentation
http://nshipster.com/swift-documentation/

한글로 된 Jazzy의 사용법은 다음 사이트에 나와 있다.
- [Jazzy] Xcode에서 Jazzy를 이용해서 애플 래퍼런스 문서 스타일의 API문서 만들기
http://bitboylabs.wordpress.com/2016/10/18/jazzy-xcode%EC%97%90%EC%84%9C-jazzy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%95%A0%ED%94%8C-%EB%9E%98%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EB%AC%B8%EC%84%9C-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%98-api/

가장 최신의 Jazzy 사용설명 페이지는 다음과 같다
- Generate & Host your iOS Documentation
http://medium.com/@jonathan2457/generate-host-your-ios-documentation-39e21b382ce8
- Swift用ドキュメント生成ツール「Jazzy」のセットアップ&操作方法
http://qiita.com/uhooi/items/d900c2de03e9d9f39b95


* jazzy 사용
- gem update --system으로 gem 최신화
- gem install jazzy로 설치
- 인스톨중 퍼미션에러 발생. rootless라는 OSX의 시스템요소때문에 발생한다고 한다
http://stackoverflow.com/questions/32891965/error-while-executing-gem-errnoeperm-operation-not-permitted
- sudo gem install -n /usr/local/bin jazzy
- 빌드가 가능한 xcode 디렉토리에서 jazzy --clean --min-acl private를 실행하면 문서가 생성된다.
2019/05/09 20:06 2019/05/09 20:06
Posted
Filed under 개발/iOS
Swift Xcode Release Date
5.0 10.2 2019-03-25
4.2 10.0 or later 2018-09-17
4.1 9.3-9.4 2018-03-29
4.0 9.0-9.2 2017-09-12
3.1 8.3-8.3.3 2017-03-27
3.0 8.0-8.2 2016-09-13
2.2.x 7.2-7.3 2015-12-08

정확히 반년 주기로 업그레이드를 하고 있다. Swift 3.0 버전을 지원하는 마지막 Xcode 버전은 8.3.3이므로 안돌아가는 코드가 있으면 구버전을 설치하여 작업하면 되겠다. 구버전 Xcode의 다운로드는 아래 사이트에서.
http://xcodereleases.com/
2019/05/09 10:54 2019/05/09 10:54
Posted
Filed under 개발/iOS
* How To: Working With Timers In Swift
https://learnappmaking.com/timer-swift-how-to/
- 반복타이머 설정 (@objc 필요)
[code]
let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fire), userInfo: nil, repeats: true)
[/code]

- 클로저로 만들수도 있다
[code]
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
    print("FIRE!!!")
})
[/code]

- userInfo를 이용해 타이머속 함수에 값을 전달할 수 있다
[code]
let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fire(timer:)), userInfo: ["score": 10], repeats: true)

@objc func fire(timer: Timer)
{
    if  let userInfo = timer.userInfo as? [String: Int],
        let score = userInfo["score"] {

        print("You scored \(score) points!")
    }
}
[/code]

- 카운트다운 타이머 생성
[code]
var timer:Timer?
var timeLeft = 60
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(onTimerFires), userInfo: nil, repeats: true)
@objc func onTimerFires()
{
    timeLeft -= 1
    timeLabel.text = "\(timeLeft) seconds left"

    if timeLeft <= 0 {
        timer.invalidate()
        timer = nil
    }
}
[/code]

- 타이머는 run loop와 동시에 돌아간다. 런루프는 상황을 보고 타이머를 돌리는데 tolerence를 주면 타이머에 여유를 줄 수 있다. 애플은 10% 여유분을 권장한다. tolerence는 ±가 아닌 +만을 의미한다. 또한 이번 타이머가 톨러런스에 의해 늦어지더라도 다음 타이머에는 영향을 주지 않는다.
[code]
let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fire), userInfo: nil, repeats: true)
timer.tolerance = 0.2
[/code]

- 타이머는 메인쓰레드의 run loop에 default mode로 등록되므로 메인쓰레드가 너무 바쁘면 실행되지 않을 수도 있다. 다음과 같이 commonModes로 등록하면 쓰레드가 타이머를 항상 감시하게 된다.
[code]
let timer = Timer(timeInterval: 1.0, target: self, selector: #selector(fire), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: .commonModes)
[/code]

- 타이머가 아닌 Grand Central Dispatch를 이용하여 코드에 딜레이 주기. 타이머는 계속 감시해야 하는데 GCD는 한번만 실행되므로 이쪽이 더 경제적이다.
[code]
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) { 
    print("BOOYAH!")
}
[/code]

* Build a count down timer with Swift 3.0
https://medium.com/ios-os-x-development/build-an-stopwatch-with-swift-3-0-c7040818a10f
- 카운트다운 타이머를 만드는 예제
2019/05/08 10:34 2019/05/08 10:34
Posted
Filed under 개발/iOS
[App Store Connect 설정]
- 나의 앱은 이미 App Store Connect에 등록한 상태여야 한다.

- Features(앱 내 추가 기능) -> Game Center로 이동

- 하이스코어 순위표를 추가하고 싶다고 한다
 + Leaderboards(순위표) 옆의 + 버튼을 클릭 -> 개별 순위표
 + Leaderboard Reference Name(순위표 식별 정보): High Score
 + Leaderboard ID(순위표 ID): highScoreTestApp
 + Score Format Type(점수 표기 형식): Integer
 + Score Submission Type(점수 제출 방법): 가장 높은 점수
 + Sort Order(정렬 순서): High to Low(높은 점수순)
 + Score Range(점수 범위): 기입필요 없음

- Leaderboard Localization(순위표 현지화) -> Add Language(언어 추가)
 + Language(언어): English
 + Name(이름): High Score
 + Score Format(점수 표기 방법): Integer (100,000,122)
 + Score Format Suffix(점수 표기 접미사): Point
 + Score Format Suffix (Plural) (점수 표기 접미사 복수형): Points


[GameViewController.swift 설정]
- 게임센터 로그인 체크

[GameScene.swift 설정]
- 게임 종료시 리더보드 업데이트
- 게임 종료시 업적성취 판정
- 리더보드 호출
2019/05/02 16:51 2019/05/02 16:51
Posted
Filed under 개발/iOS
[개요]
- 앱스토어에서 발생한 매출액이 50달러를 넘으면 총 매출의 30%를 제한 금액(카드사 16%, 애플 13%, 운영설비 1%)을 그 다음달에 개발자에게 지급한다. 이때 각 나라의 정책에 따라 수익금에 대해 소득세가 과세되는데, 적절한 서류를 제출함으로써 이 금액을 면제받을 수 있다.
https://itunespartner.apple.com/en/music/faq/Banking%20and%20Tax_Tax


[미국]
- 미국에서 판매한 금액에 대해서는 70% 수익에 대해 미국 국세청(IRS)에 의해 30%의 원천징수를 당하게 되므로 결과적으로 수익은 49%가 된다

- 미국과 한국 사이에는 이중과세방지협약이 체결되어 있어, 미국에서의 원천징수액을 완전히 면제받을 수 있다.

- 미국 원천세 감면신청을 위한 서류는 W8-BEN인데 이 서류를 작성하기 위해서는 EIN(Employer Identification Number)이 필요하다.
https://www.irs.gov/forms-pubs/about-form-w-8-ben

- EIN 발급을 위해서는 다음과 같은 양식의 SS-4 서류를 제출해야 한다.
https://www.irs.gov/forms-pubs/about-form-ss-4

- 해외에서의 EIN 발급은 팩스 또는 전화에 의해 이루어진다.
https://www.irs.gov/ko/businesses/small-businesses-self-employed/how-to-apply-for-an-ein

- 개인개발자의 SS-4 Form 기재사항은 다음과 같다.
1. 자신의 이름.
4a. 자신의 주소지 (상세)
4b. 자신의 주소지 , 도시 , 구 우편번호
8a. 법인이 아닌 개인개발자라면 소속회사는 없는것으로 간주한다. No에 체크
9a. sole proprier 를 체크
10. Compliance with IRS withholding rate 를 체크
18. 이전에 EIN 받은적이 있느냐는 항목: 자신에 맞게 체크

맨밑에 친필서명, 날짜, 전화번호및 팩스번호 기입후 미국 (304)-707-9471로 전송한다.
https://www.irs.gov/filing/where-to-file-your-taxes-for-form-ss-4

- 전화에 의한 신청
팩스는 왔다갔다 하는 시간이 많이 걸려서 싫다는 사람은 전화로 신청한다. 001-1-267-941-1099에 전화해서 1번(영어)->1번(외국에서 신청)을 눌러 상담원과 연결한다. 위에서 설명한 SS-4 Form 기재사항을 영어로 대답해주고 그 외 필요한 사항을 정확히 전달해주면 그자리에서 바로 EIN을 발급해준다. EIN이 발급되면 확인증을 팩스로 보내주고 우편으로도 발송해준다. 혹시 스펠링을 틀릴까 걱정되면 다음 Phonetic 차트를 이용하는 것도 방법이다.
https://en.wikipedia.org/wiki/File:FAA_Phonetic_and_Morse_Chart2.svg

- EIN을 받았으면 Appstore Connect의 계약, 세금 및 금융거래 -> 유료 앱 메뉴에서 W8-BEN 서류를 온라인으로 제출한다.


[일본]
- 동일한 프로세스가 일본시장에 대해서도 이루어진다. 일본에서 앱 판매시 원천징수율은 20%인데 일본도 역시 우리나라와 이중과세방지협약을 맺고 있으므로 소득세 경감신청을 할 수 있다.

- 이를 위해서는 租税条約に関する届出(使用料に対する所得税及び復興特別所得税の軽減・免除)[様式3]을 작성해야 한다.
https://www.nta.go.jp/taxes/tetsuzuki/shinsei/annai/joyaku/annai/1648_41.htm

- 이 서류는 수작업으로 작성하는게 아니라 Appstore Connect의 계약, 세금 및 금융거래 -> 유료 앱 메뉴에서 필요사항을 기입하면 자동으로 작성된 PDF 서류가 다운로드 된다.

- 자동기입된 서류를 프린트후 서명하여 다음 주소로 보내면 완료이다. 처리는 약 90일 정도까지 걸릴 수 있다고 한다.
Apple Inc. MS 198-2RA, 12545 Riata Vista Circle, Austin, TX 78727, USA
2019/05/01 16:16 2019/05/01 16:16
Posted
Filed under 개발/iOS
[Xcode 프로젝트 설정]
- 프로젝트 생성시 Product Name은 스페이스 없는 연속된 글자로 설정한다. Camelcase를 쓰면 알아보기 좋다.
- Version은 1.0 보다는 1.0.0 으로 쓰는것이 좋다.



[Apple Developer 설정]
- developer.apple.com -> Certificates, Identifiers & Profiles -> Identifiers -> App IDs에서 와일드카드가 아닌 프로젝트의 고유한 App ID를 작성해야 한다. 이때 입력하는 번들ID는 프로젝트의 번들ID와 일치해야 한다.
- App ID 는 Xcode -> Capabilities 에서 메뉴 중 아무거나 하나를 ON으로 해 주면 자동으로 등록되므로 문제없이 하고 싶다면 이 방법을 추천한다.

- iOS Distribution용 Certificate가 없다면 생성해 주어야 한다. 이 때 CSR 파일이 요구된다
- CSR(Certificate Signing Request)파일은 실제 개발에 사용하는 맥북의 고유한 키 파일이다.
- 런처패드 -> 기타 -> 키체인 접근 -> 인증서 지원 -> 인증 기관에서 인증서 요청 -> 디스크에 저장됨 으로 CSR파일을 생성 및 저장한다. 도큐먼트 폴더에 일괄적으로 모아두면 파악하기 좋다.

- developer.apple.com의 Provisioning Profiles -> Distribution -> +버튼으로 추가 -> App store 선택 -> App ID 선택 -> Download 후 실행하면 키체인에 등록된다.
- 맥북에 있는 Provisioning Profile이 충돌할 경우 파일을 다 지우고 다시 설치하면 된다.
- Provisioning Profile 파일은 Finder -> 이동 메뉴에서 Option키 클릭 -> 라이브러리 -> MobileDevice에 자동으로 저장된다.


[App Store Connect 설정 1]
- appstoreconnect.apple.com에서 My Apps (나의 앱) -> New iOS App을 선택했을때 번들ID가 뜨면 Apple Developer에서 생성한 App ID가 iTunes Connect에 연동된 것이다. SKU는 아무렇게나 넣어도 되는데 번들ID를 그대로 넣어주는게 편하다.


[Xcode에서 Appstore에 업로드]
- Xcode에서 실행을 시뮬레이터가 아닌 디바이스를 선택
- 메뉴의 Product -> Archive  -> Validate 로 앱스토어에 업로드 할 패키지를 생성
- Submit 과정에서 Validate가 이루어지기 때문에 Validate는 미리 안해도 되지만 만일을 위해서 수행한다
- 패키지가 생성되면 Archive -> Submit 으로 업로드.
- 업로드시 동일한 빌드넘버를 가진 빌드를 중복해서 올릴 수 없으므로 작업시 빌드넘버는 자동으로 증가하도록 설정하면 편리하다.


[App Store Connect 설정 2]
- appstoreconnect.apple.com에서 My Apps(나의 앱) -> Activity(활동 내역)에서 업로드한 ipa 빌드를 확인할 수 있다.
- Processing 중이라면 끝나기를 기다려야 하는데 길어도 수십분 정도면 종료된다.
- 5.5인치 화면(iPhone 8+)와, 12.9인치 화면(iPad 프로)에 대한 스크린샷을 업로드해야 하므로 시뮬레이터로 준비한다.
- Appstore용 아이콘은 1024x1024, Copyright는 회사이름
- 게임센터가 필요하면 나의 앱 -> 앱 내 추가 기능 -> Game Center 에서 순위표와 목표달성 테이블을 작성하고 App store 메뉴에서 Game Center를 활성화한다.
- Build에서 Xcode로 제출한 Archive를 선택
- Pricing에서 가격설정후 Submit for Review
2019/05/01 15:46 2019/05/01 15:46
Posted
Filed under 개발/iOS
1. 프로젝트 작성시 Include Unit Tests 선택


2. 프로젝트 버전을 1.0 → 0.9.0 으로 변경


3. 빌드시 빌드넘버를 자동으로 증가하도록 함

Xcode 메뉴 → Build Phases → + 버튼 → New Run Script Phase → 다음코드 추가

[code]
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
[/code]

4. Deployment Target을 12.1 → 10.0 으로 변경


5. Cocoapod으로 SwiftLint 설치

pod init -> pod 'SwiftLint' 추가 -> pod install
Xcode 메뉴 → Build Phases → + 버튼 → New Run Script Phase → 「${PODS_ROOT}/SwiftLint/swiftlint autocorrect」 추가
2019/04/10 15:36 2019/04/10 15:36
Posted
Filed under 개발/iOS
사용자 삽입 이미지















잠수함을 타고 끝없는 심해로 들어가세요.

코인 다섯개를 모아 연료탱크를 업그레이드합니다.
50번의 업그레이드 후 연료탱크는 더이상 소모되지 않습니다.
스타 취득시 연료가 증가하고 잠수함이 작아져
장애물을 더욱 손쉽게 빠져나갈 수 있습니다.

10,000 m 잠수에 도전하세요!


https://itunes.apple.com/app/id1457811913
사용자 삽입 이미지





2019/04/04 19:15 2019/04/04 19:15
Posted
Filed under 개발/iOS
Family Model Size
(Inch)
Width (Points) Height (Points) Rendered Width
(Pixel)
Rendered Height
(Pixel)
Points Per Inch Retina Factor Release Date
iPad Pro (3nd gen 12.9") 12.9 1024 1366 2048 2732 264 2 10/30/2018
iPad Pro (2nd gen 12.9") 12.9 1024 1366 2048 2732 264 2 6/13/2017
iPad Pro (1st gen 12.9") 12.9 1024 1366 2048 2732 264 2 11/11/2015
iPad Pro (3nd gen 11") 11 834 1194 1668 2388 264 2 10/30/2018
iPad Pro (2nd gen 10.5") 10.5 834 1112 1668 2224 264 2 6/13/2017
iPad Pro (1st gen 9.7”) 9.7 768 1024 1536 2048 264 2 3/31/2016
iPad Air 3 10.5 834 1112 1668 2224 264 2 3/18/2019
iPad Air 2 9.7 768 1024 1536 2048 326 2 10/22/2014
iPad Air 9.7 768 1024 1536 2048 264 2 11/1/2013
iPad 6th gen 9.7 768 1024 1536 2048 264 2 3/27/2018
iPad 5th gen 9.7 768 1024 1536 2048 264 2 3/24/2017
iPad 4th gen 9.7 768 1024 1536 2048 264 2 11/12/2012
iPad 3rd gen 9.7 768 1024 1536 2048 264 2 3/16/2012
iPad 2 9.7 768 1024 768 1024 132 1 3/11/2011
iPad 1st gen 9.7 768 1024 768 1024 132 1 4/3/2010
iPad mini 5 7.9 768 1024 1536 2048 326 2 3/18/2019
iPad mini 4 7.9 768 1024 1536 2048 326 2 9/9/2015
iPad mini 3 7.9 768 1024 1536 2048 264 2 10/22/2014
iPad mini 2 7.9 768 1024 1536 2048 326 2 11/12/2013
iPad mini 7.9 768 1024 768 1024 163 1 11/2/2012
iPhone XS Max 6.5 414 896 1242 2688 458 3 9/21/2018
iPhone XR 6.1 413 896 826 1792 326 2 10/26/2018
iPhone XS 5.8 375 812 1125 2436 458 3 9/21/2018
iPhone X 5.8 375 812 1125 2436 458 3 11/3/2017
iPhone 8 Plus 5.5 414 736 1242 2208 401 3 9/22/2017
iPhone 7 Plus 5.5 414 736 1242 2208 401 3 9/16/2016
iPhone 6s Plus 5.5 414 736 1242 2208 401 3 9/25/2015
iPhone 6 Plus 5.5 414 736 1242 2208 401 3 9/19/2014
iPhone 8 4.7 375 667 750 1334 326 2 9/22/2017
iPhone 7 4.7 375 667 750 1334 326 2 9/16/2016
iPhone 6s 4.7 375 667 750 1334 326 2 9/25/2015
iPhone 6 4.7 375 667 750 1334 326 2 9/19/2014
iPhone SE 4 320 568 640 1136 326 2 3/31/2016
iPhone 5c 4 320 568 640 1136 326 2 9/20/2013
iPhone 5s 4 320 568 640 1136 326 2 9/20/2013
iPhone 5 4 320 568 640 1136 326 2 9/21/2012
iPhone 4S 3.5 320 480 640 960 326 2 10/14/2011
iPhone 4 3.5 320 480 640 960 326 2 6/21/2010
iPhone 3GS 3.5 320 480 320 480 163 1 6/19/2009
iPhone 3G 3.5 320 480 320 480 163 1 7/11/2008
iPhone 1st 3.5 320 480 320 480 163 1 6/29/2007
iPod touch 6th gen 4 320 568 640 1136 326 2 7/15/2015
iPod touch 5th gen 4 320 568 640 1136 326 2 10/11/2012
iPod touch 4th gen 3.54 320 480 640 960 326 2 9/1/2010
iPod touch 3rd gen 3.54 320 480 320 480 163 1 9/9/2009
iPod touch 2nd gen 3.54 320 480 320 480 163 1 9/9/2008
iPod touch 1st gen 3.54 320 480 320 480 163 1 9/5/2007
2019/03/29 13:10 2019/03/29 13:10