라벨이 IOS인 게시물 표시

[Swift-30-Projects] 03. IOS 클론코딩 FacebookMe

이미지
[Swift-30-Projects]03. IOS 클론코딩 FacebookMe 테이블 뷰를 이용해서 화면을 구성해보자. 앱 뜯어보기 한 화면의 테이블 뷰이다. 상단에는 네비게이션 바가 있고 Facebook이라고 적혀있다. 5개의 섹션으로 이루어져 있다. 프로필셀로 이루어진 섹션, 여러 정보들을 보여주는 섹션, 즐겨찾기 섹션, 설정과 정책 섹션, 로그아웃 섹션. 페이지 이동 할 수 있는 부분에는 화살표가 있고, 로그아웃은 중앙에 정렬되어있다. 기능은 구현하지 않고 껍데기만 구현해본다. 네비게이션 바 상단 네비게이션 바를 띄운다. 이번 프로젝트는 스토리보드를 쓰지 않고 진행한다. 하나의 테이블 뷰 이기 때문에 스토리보드를 쓰는 것 보다는 테이블 뷰를 보기 좋게 짜는게 구조화 되어 이해하기 쉬울 것 같다. ** 스토리보드 없이 코딩하는 방법 **을 이용해서 화면을 하나 띄운다. 다만 주의해야 할 점은 네비게이션 바 위에 뷰를 하나 띄운다는 점이다. title을 설정해주고, navigationController?.navigationBar.barTintColor 로 네비게이션 바의 색을 지정해주면 끝! 테이블 구조 전체 섹션은 5개이다. 각 섹션별로는 1,7,1,3,1개의 로우가 있다. 몇 몇 개의 로우를 제외하면, disclosureIndicator가 있다. 테이블 셀은 눌리고 나면 선택해제가 바로 되어야 한다. 프로필 섹션 프로필의 셀 모양은 subtitle이다. 다양한 셀 모양 을 알아두자. 텍스트라벨과, 이미지, 디테일텍스트라벨을 입력해주면 완성 기능 섹션 여러가지 기능이 있는 섹션이다. 셀의 스타일을 subtitle로 만들어주고 이미지와 타이틀을 넣어준다. FAVORITE 헤더의 길이를 길게하기위해, 아무 내용도 없는 셀을 하나 추가해서 2배로 긴 헤더를 만들어 주었다. 설정 섹션 기능 섹션과 마찬가지로 이미지와, 내용을 넣어준다. 로그아웃 섹션 글의 색상을 red로 바꿔주

[IOS] 뷰 컨트롤러의 생명주기 - Life cycle of ViewController

이미지
[IOS] 뷰 컨트롤러의 생명주기 스토리 보드 없이 뷰 컨트롤러를 호출하면 viewDidload()에서 이런 저런 설정을 해준다. viewDidload 는 언제 호출되고, 이 다음과 이전에 호출되는 것이 또 있을까? 라는 궁금증을 가지고 검색을 했더니 viewController life-cycle이라는 키워드를 찾았다. Life Cycle 뷰 컨트롤러는 어떤 생명주기를 가지고 있을까? 1 init 2 loadView 3 viewDidLoad 4 viewWillAppear 5 viewDidAppear 6 viewWillDisappear 7 viewDidDisappear -> 4 viewWillAppear 8 viewDidUnload 이런 생명주기를 가진다. 가장 먼저 뷰 컨트롤러에 구현되어있던 viewDidLoad를 시작으로 살펴보면, 로드 -> 나타남 -> 사라짐 -> 언로드의 순서를 가진다. Did와 Will로 전후에 호출되는 함수를 구별한다. 예를 들면 viewDidLoad는 뷰가 로드 되었다. 그 다음에 viewWillAppear는 뷰가 나타날 것이다. 와 같이 이름만 보아도 언제 호출되는지 알 수 있도록 만들어놓았다. viewDidload 뷰 로드 완료 후 자동을 호출된다. 리소스의 초기화에 많이 사용된다. 뷰가 처음 만들어질 때 한 번만 실행된다. viewWillAppear 얼핏 보면 viewDidload와 같은 기능을 하는 것 처럼 보인다. 실제도 viewDidload 바로 다음에 호출된다. viewDidload 와의 차이점은 위의 생명주기의 viewDidDisappear -> viewWillAppear 에서 나타난다. 뷰1:메인페이지, 뷰2:상세페이지가 있다고 가정하자. 화면의 이동이 있을 때, 메인페이지에서 상세페이지로 갔다가 다시 메인으로 돌아오면 이미 그려진(viewDidload가 한번 호출 된) 메인페이지는 다시 viewDidload가 호출되

Xcode에서 storyBoard없이 개발하기 - 뷰 하나 띄우기

이미지
storyBoard없이 개발하기 UIViewController를 storyBoard없이 만들기 IOS를 개발하다보니, storyBoard를 가지고 개발하는 경우와 없이 개발하는 방법 두 가지가 혼재되어있어, 이번 기회에 storyBoard없이 개발하는 방법에 대해 공부해보려 한다. 스토리 보드 없이 코드만으로 화면을 구성하려면, 스토리 보드만 지우면 되는게 아닌 메인 인터페이스 설정 및 코드상에서 window에 대한 설정을, 진입점을 잡아줘야 한다. 환경 설정 스토리 보드 지우기 -> 실행 (Thread 1: Exception: "Could not find a storyboard named ‘Main’ in bundle NSBundle) Project -> General -> Main interface -> 공백입력 info.plist -> Application Scene Manifest -> Storyboard Name -> 줄 전체 삭제 -> 실행 (Thread 1: Exception: "Invalid parameter not satisfying:) iOS 13 이상만) iOS 13 이전에는 모든 장면 기능이 AppDelegate.swift 클래스에 있었으며 이제는 SceneDelegate.swift라는 별도의 클래스에 있습니다. SceneDelegate.swift 에서 프로젝트를 설정하겠습니다. 아래와 같은 코드를 SceneDelegate.swift 에서 작성(수정)합니다. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return }

[Swift-30-Projects] 02. IOS 클론코딩 Stopwatch

이미지
[Swift-30-Projects] 02. IOS 클론코딩 Stopwatch Stopwatch 앱 뜯어보기 화면 절반은 뷰, 절반은 테이블 뷰 뷰의 절반은 디스플레이, 나머지는 제어 버튼 테이블 뷰는 기록 셀이 들어가야 함 기능 한 페이지 짜리 앱이다. 초기 상태 : [LAB, START], START 버튼을 누르면 [LAB, STOP] LAB은 기록. STOP 누르면 [RESET, START] 시작 버튼을 누르면 스톱워치가 가야한다. 랩을 누르면, 기록이 저장되어야한다. 화면 구성 storyBoard로 구성할 수 있는 만큼 함. 싱글 뷰를 하나 만들고 하위에 스탑워치를 위한 뷰, 시작 종료를 위한 버튼2개, 기록을 나타낼 테이블 뷰를 넣는다. 뷰에는 라벨을 2개 넣어 기본 경과 시간과, 랩간 차이를 보여주는 라벨을 넣는다. 조작 버튼은 누를 때 마다 스탑워치의 상태를 변경한다. 테이블 뷰를 하나 만들고, 테이블 뷰 안에는 랩 버튼을 누를 때마다 셀을 넣어준다. 버튼동작 [스타트, 랩, 리셋, 스탑 버튼] 다른 기능은 생각하지 않고 버튼의 동작과, 스탑워치의 진행 상태값만 고려하여 구현한다. 초기는 [LAB, START] 상태로 둔다. START -> [LAB, STOP] -> [RESET, START] RESET 버튼을 누르면 초기화 상태. LAB 버튼을 누르면, 테이블에 시간 기록. 시간 시작, 멈춤, 초기화 isPlaying 이 true인 상태 즉 기록이 되는 중 에만 시간이 가고 false인 상태에서는 멈춰야한다. 데이터를 위해 타이머 모델을 하나 만들어준다. 필요한 내용은 타이머객체와 시간카운터이다. 타이머는 문서 를 보고 만든다. 0.035 초마다 시계를 업데이트 해줄 것이고 계속 반복하기 때문 mainStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: self, sel

[Swift-30-Projects] 01. IOS 클론코딩 GoodAsOldPhones

이미지
[Swift-30-Projects] IOS 클론코딩 GoodAsOldPhones Good As Old Phones 앱을 구조 살피기 앱 레이아웃 구성 Products Details Contact Us 앱을 구조 살피기 화면은 크게 2개의 Tab Bar로 구성되어있다. Products 와 Contact Us. 상품의 목록을 나열하는 Products는 테이블 뷰로 이루어져있다. 각각의 상품을 입력하면, 상세페이지로 넘어간다. 상세페이지에는 카트에 추가할 수 있는 버튼이 있다. Contact Us 페이지는 하나의 UIView이며, 연락처가 적혀있다. 앱 레이아웃 구성 앱 동선은 Storyboard를 이용해서 구성해준다. 먼저 크게 Tab Bar 컨트롤러로 두 화면을 갈라준다. 그리고 각각의 Tab Bar의 Item의 이름을 Products와 Contact Us로 변경해준다. 간단한 Contact Us 페이지에는 UIView를 넣어준다. Products 페이지에는 Navigation Controller와 TableView를 추가해준다. TableView의 Cell 선택시에는 UIView로 이동할 수 있도록 해준다. Contact Us 간단한 페이지 부터 구현한다.(개인취향이기 때문이다.) Custom Class로 ContactUsViewController를 추가해주고 하나 생성해준다. override func viewDidLoad() { super.viewDidLoad() setupScrollView() setupContents() } ContactUsViewController를 만들어준다. Storyboard에서 해당 UIView를 컨트롤 할 컨트롤러로 UIViewController를 지정해준다. 뷰가 로드되는 시점에 스크롤 뷰를 하나 생성하고, 뷰를 하나 생성한다. 뷰에 스크롤뷰를 추가하고, 스크롤 뷰에 뷰를 서브뷰로 추가한다. func set

[IOS] AppDelegate는 뭐하는 녀석이지?

이미지
[IOS] AppDelegate AppDelegate.swift 는 swift로 IOS 개발을 시작하면서 부터 보였고, 계속 궁금해서 이 기회에 정리해놓으려한다. 공식문서 참고 UIApplicationDelegate AppDelegate.swift 크게 두가지 기능을 한다. AppDelegate 클래스를 정의 어플리케이션이 그려질 window를 생성하고, 상태가 변할 때 반응 할 수 있게 한다. 또한 AppDelegate 클래스는 UIApplicationDelegate 프로토콜을 채택해야한다. 앱에 대한 진입 점과 입력 이벤트를 앱에 전달하는 실행 루프를 생성 이 작업은 파일 상단에 나타나는 UIApplicationMain 의 특성이다. (@UIApplicationMain)에 의해 수행된다. 하지만 IOS13부터는 AppDelegate.swift , SceneDelegate.swift 두 파일로 나뉘어 생긴다. 그렇기 때문에 여러 소스를 보았을 때 혼란을 야기했다. 이전에는 (~ IOS12) 아래와 같은 구조였다. AppDelegate Process Lifecycle App Launched App Terminated UI Lifecycle Entered Foreground Become active 하지만 지금은 (IOS13) 아래와 같다. Session Lifecycle에 대한 역할이 추가되었다. AppDelegate Process Lifecycle Session Lifecycle Session Created Session Discarded SceneDelegate UI Lifecycle Entered Foreground Become active AppDelegate 클래스에 있던 프로퍼티인 window가 SceneDelegate로 옮겨졌다. 하지만 하나의 화면에서 여러개의 다중 화면을 지원하면서 scene 개념이 추가

[IOS] IOS 디자인 패턴 - MVC(Model-View-Controller) 맛보기

이미지
[IOS] IOS 디자인 패턴 - MVC(Model-View-Controller) Model - 데이터에 관한 로직 View - 사용자에게 보여지는 화면 Controller - Model과 View 사이의 동작관리 사용자가 블로그 앱에 글을 작성했을 때, View가 변하게 된다. 이때 Controller는 View에서 입력된 값들을 모델로 전달 해준다. 만약 필요한 경우 Model에서 값을 계산해야 한다면, 결과값을 Controller에게 전달한다. Controller는 전달 받은 값을 바탕으로 View를 업데이트 한다. MVC 디자인 패턴은 이렇게 역할에 따라 구조가 나뉜다. UI를 바꾸고 싶으면 View를 수정하면되고, 데이터 처리 로직을 수정하고 싶으면 Model을 손보면 된다. 위에서 설명 했듯이 Model에서 View로 접근하는 일은 없다. 반대로 이야기 하면, Controller가 중간에서 Model에게 View가 보낸 값을 전달해주고, Model의 결과값을 View로 전달 해 업데이트 할 수 있게해야한다. View -> Controller : Delegate를 사용하여 해결(Controller가 View의 변경사항에 대응할 수 있음) Model -> Controller : Notification을 사용하여 해결(Model의 값이 변경되었을 때 Controller에게 전달) Controller -> View : 업데이트 한다. Controller -> Model : 업데이트 한다. 역할을 단순하게 나누어 빠르게 구현할 수 있으나, View lifeCycle 코드가 Controller에 위치하기 때문에 Controller가 커진다.

[IOS] Image Notification Push 구현하기

이미지
[IOS] Image Notification Push 구현하기 APNs를 이용해서 푸쉬 를 보낼 수 있다는 가정하게 작성된 글 입니다. Image Push Notification 만들기 (Using Notification Service Extension and Notification Content Extension). 기본적인 알림 기능 이 동작하고 있다고 가정하고 설명합니다. service extension과 content extension을 추가해줍니다. Service extension은 Service라는 이름으로, Content extension은 Content라는 이름으로 추가 해 줍니다. xcode > Editor > Add Target > Notification Service Extension > productname : "Service" > Next > Finish xcode > Editor > Add Target > Notification Content Extension > productname : "Content" > Next > Finish 추가 후 결과 화면은 다음과 같습니다. Service > NotificationService.swift는 다음과 같습니다. import UserNotifications class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? override func didReceive(_ request: UNNotificationRequest, withContentHandler conten

[IOS] Notification Push 구현하기

이미지
[IOS] Notification Push 구현하기 순서 푸쉬계졍 생성 (apple-membership) 어플리케이션 제작 Push Notifications(푸쉬를 날려줄 도구) 1. 푸쉬계졍 생성 참고 블로그 : https://faith-developer.tistory.com/153 푸쉬를 위해서는 계정이 필요하다. a. 인증서 생성 b. App ID 생성 (Identifiers) c. Push 인증서 등 록 (Certificates) a. 인증서 생성 키체인 접근 > 인증서 지원 > 인증 기관에 인증서 요청 > 이메일주소입력 > 디스크에 저장 > CertificateSigningRequest.certSigningRequest 파일 저장 b. App ID 생성 identifiers > +버튼 > appId > bundleId 입력 > Push Notifications 선택 > Continue > Register c. Push 인증서 등록 identifiers > bundleId 선택 > Configure > Development SSL Certificate > Create Certificate > 위에서 생성한 CertificateSigningRequest.certSigningRequest 파일 업로드 > Countinue > Download > aps_development.cer 다운로드 다운받은 aps_development.cer를 실행하면 키체인에 등록된다. 등록된 키 체인에서 push_cert.p12 파일로 내보내준다. 이 파일은 후에 메시지를 전송하는데 쓰인다. 2. 어플리케이션 제작 참고 블로그 : https://www.raywenderlich.com/8164-push-notifications-tutorial-gettin

[iOS] 간단한 키체인과 해싱으로 보안 강화 (Basic iOS Security: Keychain and Hashing)

이미지
[iOS] 간단한 키체인과 해싱으로 보안 강화 (Basic iOS Security: Keychain and Hashing) 민감한 데이터를 저장하고, 저장된 데이터를 안전하게 꺼내어 사용자 인증 하는 과정을 Keychain을 이용하여 구현하는 방법을 소개합니다. 해당 포스트의 원문은 다음과 같습니다 : https://www.raywenderlich.com/129-basic-ios-security-keychain-and-hashing 소스코드 다운로드 AuthViewController.signInButtonPressed() 로그인 버튼이 눌렸을 떄 호출 AuthViewController.signIn() 함수 호출 AuthViewController.signIn() 사용자의 입력 종료 이메일, 비밀번호 입력 받은 데이터 검증 디바이스의 이름 가져오기 이름, 이메일, 비밀번호로 User 데이터 만들기 AuthController.signIn() 로그인 함수 호출 AuthController.signIn() class func passwordHash(from email: String, password: String) -> String { let salt = "x4vV8bGgqqmQwgCoyXFQj+(o.nUNQhVP7ND" return "\(password).\(email).\(salt)".sha256() } 입력받은 이메일과 비밀번호를 넘겨줘 AuthController.passwordHash()로 해싱 키체인(Keychain)에서 앱의 데이터를 식별하는데 사용되는 서비스 이름을 상단에 정의 KeychainPasswordItem.savePassword()로 암호 키체인에 저장 UserDefaults에 현재 유저정보 저장 KeychainPasswordItem(service: serviceName, account: user.email).s

[IOS] Sign In With Apple 살펴보기

이미지
Sign In With Apple 살펴보기 Sign in with Apple 애플 아이디로 로그인을 할 수 있는 Sign in with Apple이 공개 된 후 적용하고 이해한 내용을 기록으로 남겨둔다. 참고 URL : https://developer.apple.com/documentation/authenticationservices/adding_the_sign_in_with_apple_flow_to_your_app 순서 : https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api/authenticating_users_with_sign_in_with_apple#see-also 버튼 추가 새 프로젝트를 만들고 ViewController에 버튼을 호출하기 위한 함수를 추가한다. import AuthenticationServices 해준다. @IBOutlet weak var loginProviderStackView: UIStackView! 프로퍼티를 추가한다. func setupProviderLoginView() { let authorizationButton = ASAuthorizationAppleIDButton() authorizationButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside) self.loginProviderStackView.addArrangedSubview(authorizationButton) } @objc func handleAuthorizationAppleIDButtonPress() { } 인증 버튼 동작 extension ViewController: ASAuthorizationControllerDelegate { } exte

[app review] #01 2020-03-13 Binary Rejected

이미지
[app review] #01 2020-03-13 Binary Rejected 직접 만든 간단한 앱을 앱스토어에 제출했다. 처음 받아보는 리뷰. 결론은 좀 기다려 달라는 내용이어서 해야 할 일은 없어보인다. 처음 제출하는 앱이어서 빠트린 것들이 많을텐데 일단은 게시를 목표로 수정해야겠다. Complement Todo 애플 심사 지침서 읽어보기 https://developer.apple.com/kr/app-store/review/guidelines/ Hello, We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct. Common practices that may lead to an investigation include, but are not limited to: - Inaccurately describing an app or service - Misleading app content - Engaging in inauthentic ratings and reviews manipulation - Providing misleading customer support responses - Providing misleading responses in Resolution Center - Engaging in misleading purchasing or bait-and-switch schemes - Engaging in other dishonest or fraudulent activity within or outside of the app During our investig

[IOS] Apple의 인증 체계 - CodeSigning, Certificates, Provisioning Profile

이미지
[IOS] Apple의 인증 체계 - CodeSigning, Certificates, Provisioning Profile IOS 개발을 시작하면서 가장 먼저 겪은 문제가 바로 이 인증서 문제이다. 받은 소스가 빌드가 되지 않았고, 인증서가 맞지 않는다는 에러를 발견했다. 구글링을 통해 인증서를 발급받아서 개발을 하다가, 관리가 안되고 계속 인증서가 필요해서 어떻게 관리하면 좋을지 기록으로 남긴다. 인증서는 왜 필요할까? 애플(apple)은 자신들이 허가한 하드웨어(IOS)에 소프트웨어(어플리케이션)가 동작하도록 승인 수 있다. 매번 앱이 실행될 때마다, 해당 앱이 애플로부터 인증을 받았는지 확인한다. 앱은 실행될 수 있는 권한을 가지고 있어야한다. 하지만 개발자는 애플의 권한이 없기 때문에, 애플에게서 권한을 요청해서 받아야한다. 어떻게 요청하고 무었을 요청해야 하는지 정리한다. 출처 :  http://beankhan.tistory.com/115 개발자 권한 받기 키체인에서 인증서 서멍 요청(Certificate Signing Request) 만들기 인증서 서명 요청서 제출 후 애플에게 권한 받기 애플 개발자 센터에서 바로 요청할 수 있는 것이 아닌, 인증서 서명 요청을 만들어야 한다. 키체인 접근 > 인증서 지원 > 인증 기관에서 인증서 요청 > 이메일 입력 > 인증서 저장 만든 CSR을 이용해 Apple developer > Certificates, Identifiers & Profiles > Certificates > +버튼(add) > 개발용 / 배포용 선택 > CSR업로드 위 단계를 완료하면 개발용/배포용 인증서를 발급받을 수 있다. 다운 받은 인증서를 실행하면, 나는 애플대신 소프트웨어(어플리케이션)을 실행할 수 있는 권한이 생긴다. 키 체인의 내 인증서에도 추가된다. Provisio