ios 13부터 dark mode를 지원하기 시작했다

그래서 앱 역시 dakr mode 지원을 고려해야 한다.

폰에서 다크 모드 설정하는 방법은 다음과 같다.

https://support.apple.com/ko-kr/HT210332

 

iPhone, iPad 또는 iPod touch에서 다크 모드 사용하기

조명이 어두운 환경에서 최적의 시각적 경험을 하려면 다크 모드를 켜십시오.

support.apple.com

 

애플은 다크 모드를 지원하면서 기본색에 대해서는 라이트모드 / 다크모드에서 사용될 색을 정의하고 개발자가 시스템 색을 사용할 경우 화면 모드에 따라서 다른 색을 보여주도록 지원하고 있다. 이것을 Semantic Color라 한다.

예. system Blue를 사용할 경우 다음과 같이 각각 다른 색이 표현되게 된다.

더 많은 색에 대한 정의는 다음 페이지를 참고하면 된다.

https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/color/

 

Color - Visual Design - iOS - Human Interface Guidelines - Apple Developer

Color Color is a great way to impart vitality, provide visual continuity, communicate status information, give feedback in response to user actions, and help people visualize data. Look to the system’s color scheme for guidance when picking app accent co

developer.apple.com

 

1. Assets를 이용해서 다크 모드 지원하기

1-1. 모드 별로 다른 색을 정의 하기

assets에 "Color Set"를 추가하고 라이트 모드와 다크모드에서 사용할 색을 정의한다.

Appearance는 Any, Light, Dark로 나눠지는데 그 정의에 따라서 표현되는 색이 변경된다.

사용하는 방법은 다음과 같다.

assets에 정의한 색이름을 코드상에서 사용해서 UIColor를 생성한다.

1-2. 모드 별로 다른 이미지를 정의 하기

Color set과 동일하게 이미지 역시 Any, light, dark Appearance에 맞춰서 이미지를 추가해주면 app은 해당 모드에 맞는 이미지를 보여주게 된다.

any 에서는 빨강색 차가 보여질 것이고, dark 에서는 파랑색 차가 보여지게 된다.

만일 라이트 모드와 다크모드에서의 이미지를 동일하고 색으로만 구별한다고 한다면?

이미지 속성중 "Render As"를 "Template Image"로 바꾸고 

다음과 같이 코드를 추가한다면 라이트/다크모드에 따라서 이미지는 동일하고 tintColor로 다르게 보여질수 있다.

 

2. 현재 앱의 다크 모드 여부를 확인해서 코드로 지원하기

UITraitCollection.userInterfaceStyle를 이용해서 현재 어떤 모드인지를 알 수 있고 그 모드에 따른 색을 반환하는 예제 함수이다.

이런 식으로 view가 load 되는 시점 혹은 appear 되는 시점에 동적으로 이미지 혹은 색을 변경해줄 수 있다.

 

덧> 만일 앱이 다크모드를 지원하지 않고 항상 동일하게 보여지게 하고 싶다면 다음과 같이 처리하면 된다.

info.plist에서 appearance를 "Light"로 명시하면 된다.

by 무위자연 2021. 8. 31. 13:29

*개발 환경 : Xcode 12.4 / 사용언어 : swift

UI를 구성하다 보면 반복적인 사용 혹은 동적인 생성 해서 구성하는 경우에 custom view를 만들어서 사용하게 되는데

custom view를 만드는 방법에 대해서 정리하려고 한다.

만들고 싶은 customview는 UIView를 base로 하고 Label 1개, Button 1개 있는 파란색 View로 가정한다.

만들고 싶은 custom view

< xib 없이 custom view 만들기>

1. UIView를 상속 받은 클래스 파일을 추가한다.

2.. 초기화 함수를 선언해준다. 

3.. 필요한 UI 요소들들 추가해준다. - 필요한 constraint를 추가한다.

 

UI를 모두 코드로 만드는 것에 익숙하지 않거나 스토리보드를 이용하고자 한다면 다음과 같이 추가하시면 됩니다.

< xib 를 이용해서 custom view 만들기>

1. UIView를 상속받은 클래스 파일을 추가한다.

2. 1번에서 추가한 클래스가 사용할 xib 파일을 추가합니다.

- 1과 2번의 파일 이름이 동일해야 하는 것은 아니지만 가독성을 해치지 않기 위해서 가급적 동일하게 맞추는 것이 낫습니다.

3. 초기화 함수를 선언해줍니다. 이때 어떤 xib를 읽어올지에 대한 코드가 추가되어야 합니다.

4. xib 파일로 가서 다음과 같이 owner를 지정해줍니다.

4-1. File's Owner를 선택한다.

4-2. 우측의 Identity inspector에서 NSObject를 1번 클래스 명으로 바꿔줍니다.

5. 스토리보드에 Label, Button을 추가합니다.

 

<사용하는 방법>

어떻게 customv view를 만들었는지는 상관이 없으며

해당 custom view를 사용하는 화면에서

코드로 추가한다면 customview를 생성하고 추가한다.

스토리보드에서 추가한다면 UIView를 원하는 위치에 추가한 다음에 해당 UIView의 클래스명을 custom 클래스 이름으로 바꿔준다.

최종 적용한 화면은 다음과 같습니다.

by 무위자연 2021. 5. 20. 09:50

ios 개발 전업을 선언하고 5개월 가량을 다음 정도의 spec?을 가진 앱을 2개를 유지 보수 작업을 진행하였다.

전혀 다른 성향의 개발자(혹은 복수의 개발자)가 만들어 놓은 2개 앱을 어떠한 가이드 문서 없이 보면서

이런 부분은 배워야지 혹은 이렇게하지 말아야지에 대한 회고를 정리해보려고 한다.

1. 2개 앱 Spec: 서버가 있고 안드로이드를 지원하고 앱의 화면은 크게 2가지로 구성된다.

네이티브로 구성된 화면이 있고 필요에 따라서 웹페이지를 보여주는 화면이 있다.

앱의 주요 설정 및 공지사항 등은 서버에서 내려 받아서 보여준다.

local에는 사용자 설정 정보 이외의 데이터를 저장하지 않는다.

2 카테고리 혹은 키워드 별로 정리해보았다. 

- Naming

변수 네이밍은 내용이 명확하게 반영되어야 한다.

예. isNickDuplicate 개발자는 닉네임 중복을 확인한 상태를 저장하는 변수라고 썼지만 이름만 보면 닉네임이 중복인지 아닌지로 읽힌다?

> 나는 이것을 isNickDuplicateCheck 이런 식으로 바꿔 보았다.

- 조건문 처리

early return pattern을 가급적 쓰려고 노력해야 겠다.

- uicomponent

자주 사용하는 component의 경우 base를 선언하고 필요한 스타일이나 프로퍼티를 만들어두는 것이 좋더라.

예. 빨강색 글씨에 파랑색 배경색을 가진 버튼이 기본 버튼, 회색 글씨에 오렌지색 배경을 가진 버튼이 subbutton으로 쓰인다고 하면

UIButton을 extension으로 선언해서 스타일을 미리 정의하던지 아니면 baseButton을 만들고 그걸로 UI를 구성한다면 메인 색 변경 같은 정책 변경시 쉽게 대응이 되고 화면을 새로 구성할 때도 유용하다.

- tableview cell 구성시

index를 가지고 어떤 cell을 그릴지 혹은 어떤 동작을 할지를 정해진 코드가 한 앱에 많았다. 그러니 어떤 cell이 그려지는 것이 맞는지 index 값을 보고 판단하지 못하니 가독성이 떨어지고 순서를 바꾼다고 하더라도 실수의 여지가 생긴다.

그래서 각 cell이 그려지는 바가 나타나도록 string array를 이용하거나 데이터의 특정 값을 이용해서 처리하게 수정하는 것이 좋더라.

이것은 button.tag를 이용해서 처리하는 부분에서도 동일하다. tag 0, 1,2로 처리하면 당사자도 만들 당시에만 명확하게 아는 것이지

가독성이 떨어진다. 이것 역시 처리할 array를 목록을 가지고 동작하게 하는 것이 가독성이 높아진다.

- webview

앱의 특성상 webview base를 잘 만들어 놔야 어디서든 잘 쓸 수 있다.

- 파일 및 폴더 관리, static string 등등

한 앱의 경우 하나의 폴더에 파일이 20개씩 있으니 어떤 의미를 가지는지 알수 없고 찾기도 어렵다.

controller를 구성할 때도, view 폴더를 구성할 때도 의미 없는 하나의 나열로 구성된 것은 찾기가 어렵다.

특히 xcode 11.7에서 빌드해야 한 앱은 xcode가 하나의 폴더를 여는 것 조차가 버벅인다.

이 관리는 assets 관리도 동일하다. 이미지 관리를 위한 폴더를 거의 사용하지 않고

거의 하나의 폴더를 이용하다보니 assets의 미리보기도 제 역할을 할 수가 없다.

그래서 depeth 혹은 폴더수가 늘더라도 하나의 완결된 화면 혹은 분리 가능한 폴더로 나누어서 관리하도록 하는 것이 좋더라.

> context 단위이면 좋겠다는 표현일수 있겠다.

- ui 구성시에

여러 구역으로 나눠진 UI에서 UIView를 단독으로 사용하는 것은 지양해야 하고 작은 단위가 보여서 하나의 구역을 이루는 경우

UIStackView를 적극적으로 사용하자.

UIView 하위에 UIView 한땀한땀 그리면 순서가 바뀌거나 중간에 하나의 요소가 빠지면 수정하는데 시간이 많이 걸린다.

- viewModel은 꼭 쓰자

이상하게 2 앱 모두 viewModel을 쓰지 않는다. 그러다 보니 viewcontroller안에 로직이 있다보니 UI 관련 내용과 데이터 관련 내용이 혼재 되어 있어서 가독성이 떨어지면 비동기 처리 부분이 애매한 곳들이 있다.

- 뜬금없는 snapkit?

하나의 앱은 코드의 일관성이 있어서 한명이 만든 것인지 혹은 하나의 rule을 잘 지킨 것인지 알수 없지만

하나의 앱은 최초 개발자와 최초 개발자의 코드를 따르지만 수준이 조금 떨어지는 개발자, 그리고 앞에 두 사람과 다른 소속의 한사람이 짠 코드로 나눠진다. 3번째 사람이 만든 화면은 모두 snapkit을 짜여 있다. snapkit 쓰는 것 자체가 문제는 아니지만 전반적으로 스토리보드로 짠 앱에서 혼자 아는 snapkit으로 넣는 것...

난 개인 적으로 반대하는 편이다. 정답은 없겠지만. 

- Mappable 사용시

서버에서 주는 값이 어떤 타입을 의미해서 그 비교를 하는 값들이 하드코딩된 어떤 string이라면, 다음과 enum으로 정의하고 그 enum으로 비교하는 것이 오타를 줄이는 방법이더라.

nameType을 바로 사용하지 않고 enum을 정의해서 사용하게 mapping에서 구현함.

 

- appStore.

겪었던 것중에 특이했던 것은 앱의 어떤 화면에서도 안드로이드 혹은 다른 플랫폼에 대한 내용이 나와서는 안된다. 그것이 실제 동작과 무관한 공지사항 내에 이미지여도 마찬가지다. 나오면 무조건 심사 reject이다.

- 가장 중요한 것!!!!

fastlane은 사랑이다!!!

ios 개발자는 무조건 해야 한다 https://docs.fastlane.tools/

 

덧> 이번 회고를 바탕으로 개인 프로젝트 2탄 및 곧 진행할 신규 프로젝트 개발에 잘 녹여내고 그것에 대한 회고를 남기도록 하겠습니다.

by 무위자연 2021. 4. 14. 13:07

개발 환경 : Xcode 12.1

사용언어 : swift

UserDefaults을 사용해서 사용자 정보를 저장하는 방법을 공유하기 위한 포스팅입니다.

UserDefaults란 사용자 정보를 key - value 조합으로 저장하고 읽어올 수 있도록 애플에서 제공하는 기능입니다.

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

출처 : developer.apple.com/documentation/foundation/userdefaults

 

Apple Developer Documentation

 

developer.apple.com

 

다음의 경우에 사용해볼 수 있습니다.

- 앱에서의 사용자성 정보를 저장한다.

- UI 데이터 설정시 마지막 실행 때 정보를 저장하고 있다가 보여준다

- db 없이 간단한 데이터를 CRUD(만들고 읽고 쓰고 삭제하는) 지원

등등등.

 

해당 기능을 지원하는  데이터 형식은 다음과 같습니다.

UserDefaults 기능을 지원하는 형식

 

사용하는 방법은 다음과 같습니다.

예시1 - string 값을 저장하고 쓴다면?

예시2 - string array를 쓴다면?

지원하는 형에 따라서 마음껏 저장하고 불러오면 된다!!

 

단, 용량 제한이 없는 것은 아니니까 필요할 때만 사용하면 좋다.

애플 문서 : developer.apple.com/documentation/foundation/userdefaults/1617187-sizelimitexceedednotification

 

Apple Developer Documentation

 

developer.apple.com

One more Things!!!

UserDefaults에 서로 연관성을 가지는 데이터를 한번에 저장하고 싶다면?

Data 형을 쓰면 되는데 이 때 codable을 상속 받은 structure를 쓴다면 아주 쉽게 get / set 이 가능해진다.

codable이 뭔지가 궁금하시다면?

bmwe3.tistory.com/1765?category=682591

 

[swift] codable를 이용해서 json 파일 읽고 쓰기

개발 환경 : Xcode 12.1 사용언어 : swift 애플은 데이터의 json으로의 encode / decode를 지원하기 위해서 codable이란 프로토콜을 지원하고 있다 (Xcode 9.0+) developer.apple.com/documentation/swift/codable..

bmwe3.tistory.com

 

by 무위자연 2021. 1. 14. 11:00

#social login에 대한 정리

  • 개발환경 : Xcode 12.2

  • 사용언어 : swift

  • 용어 정리 - login /logout으로 통일함 > api 회사마다 sign / login 다르게 쓴다.

#1 kakao

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

#2 apple

 

Apple Developer Documentation

 

developer.apple.com

#3 google

 

Google Sign-In for iOS  |  Google Developers

Get users into your apps quickly and securely, using a registration system they already use and trust—their Google account.

developers.google.com

#4 facebook

 

iOS - Facebook 로그인 - 문서 - Facebook for Developers

 

developers.facebook.com

#5 naver

 

네이버아이디로로그인 iOS 개발가이드

NAVER Developers - 네이버아이디로로그인 iOS 개발가이드

developers.naver.com

 

각 social login을 구현한 프로젝스 소스 위치는 다음과 같습니다.

github.com/zapping0320/SocialLogin

 

zapping0320/SocialLogin

Contribute to zapping0320/SocialLogin development by creating an account on GitHub.

github.com

*해당 소스에는 applicatoin id 관련 정보는 제외 되어 있으니 사용할 경우 info.list을 추가해서 사용해야 함

 

 

 

by 무위자연 2020. 12. 3. 11:17

개발환경 Xcode 12.1

개발 언어 : swift

난 swift와 storyboard로 이루어진 app을 가지고 있고 애플 와치 se를 샀다.

그래서 가벼운 마음으로 app 데이터를 보여주는 watch app이 있으면 좋다고 생각했다.

작업 당시 xcode에서 생성 가능한 watch app의 크게 선택지가 다음과 같다.

1. watch app 개발을 하기 위해서는 새로운 target을 추가로 이동한다.

2. watch만으로 동작 가능한 앱인지 아니면 app와 연동이 되어야 하는지?

난 'app과 연동한다;를 선택했다.

 

3. 그 다음에 Interface를 선택한다. 

- storyboard와 swiftUI 중에 선택한다.

- storyboard를 선택하면 Life Cycle은 WatchKit만 선택 가능하지만 swiftUI를 선택하면 "SwiftUIApp"과 "WatchKit App Delegate"가 선택 가능하다.

> swiftUI 와 "SwiftUIApp"으로 설정한 경우 app과 watch app이 통신 하는 방법을 찾지는 못했다 ㅠㅠㅠㅠ

apple 문서에서도 swiftui + watchkit app 으로 되어 있었다 ㅠㅠ

developer.apple.com/tutorials/swiftui/creating-a-watchos-app

 

Apple Developer Documentation

 

developer.apple.com

그래서 난 storyboard와 watchkit app delegate를 하기로 했다.

데이터 공유의 방향은 다음으로 정했다.

- app에서는 데이터를 CRUD 모두 한다.

- watch에서는 데이터를 RU 만 한다. 

기본적인 통신으로 고려했던 방법은 다음과 같다.

1. 현재 app 에서 데이터를 저장하는 방법은 realm이란 라이브러리를 사용하고 있으니 realm 파일을 App Group을 이용해서 공유하는 방식으로 처리한다.

- 실제 이 방법으로 widget은 공유하고 있는 상태이다.

지만 watch app에 realm이 설치하는 방법을 찾지 못하였다 ㅠㅠㅠㅠ

2. app에서 생성한 데이터를 app에 알고 있는 경로에 json 파일로 저장하고 그걸 watch에서 읽는 방법

사용자에게 노출되지 않는 app내 혹은 app group 내 경로를 맞추는 데 실패하였다.

시뮬레이터 기준으로 다음처럼 나오더라고요

- app에서 얻은 경로

file:///Users/dd/Library/Developer/CoreSimulator/Devices/01BFA962-A2AA-47FC-B1C2-A4638317799A/data/Containers/Shared/AppGroup/724A8AEB-4451-4418-9767-9F78658CEDA1/wrecords.json

- watch에서 얻은 경로

file:///Users/dd/Library/Developer/CoreSimulator/Devices/5E88A606-60DA-4412-96D6-1D386B204C46/data/Containers/Shared/AppGroup/72538C89-C6E1-4FF0-ADB0-044942559F25/wrecords.json

3. 마지막으로 WCSession을 이용해서 json 데이터를 string으로 주고 받도록 한다!!!!!!!!!!!!!!!!!! 

WCSession 

The object that initiates communication between a WatchKit extension and its companion iOS app.

와치와 app 사이에 통신하기 위한 객체... 정도인 듯하다.

출처 :developer.apple.com/documentation/watchconnectivity/wcsession 

 

Apple Developer Documentation

 

developer.apple.com

해당 내용을 구현한 애플의 샘플 주소는 다음과 같다.

developer.apple.com/documentation/watchconnectivity/using_watch_connectivity_to_communicate_between_your_apple_watch_app_and_iphone_app

 

Apple Developer Documentation

 

developer.apple.com

하지만 난 다음 포스팅이 이해하기가 쉬워서 차용했다.

martiancraft.com/blog/2018/02/notification-handling-on-watchkit/

 

Notification Handling on WatchKit

According to our own Richard Turton, notifications are one of the key interaction modes on Apple Watch. A well-designed notification quickly presents any pertinent information to the user and may also give them the opportunity to act on said information. I

martiancraft.com

적용하는 순서는 다음과 같다.

1. app에 wcsession을 제어할 수 있는 코드를 추가한다.

1-1. app delegate에 Session handler를 이용해서 지원 여부를 확인하면 좋다

2. watch 에서도 app과의 메세지를 주고 받도록 session handler를 추가한다.

gist.github.com/zapping0320/cc1fe8368f83a09091fa3797c28003b4.js"></script>

3. app에서 watch로 메시지를 보낸다.

app의 session handler의 sendMessage 를 이용해서 watch에 string을 보낼 수 있다.

4. watch에서 app으로 메시지를 보낸다.

watch에서도 3번과 유사하게 session handler의 sendMessage를 활용하면 된다.

(3,4번 공통)은 메시지를 보내면 응답으로 오는 replyHandler를 이용해서 상대방 혹은 자기가 원하는 동작을 추가해서 구현할 수 있다.

이 때 주고 받는 데이터를 나의 경우에는 json string을 주고 받아서 Encode / Decode 해서 처리하였다.

이 부분에 대해서 궁금하다면 여기를 클릭 bmwe3.tistory.com/1765

 

[swift] codable를 이용해서 json 파일 읽고 쓰기

개발 환경 : Xcode 12.1 사용언어 : swift 애플은 데이터의 json으로의 encode / decode를 지원하기 위해서 codable이란 프로토콜을 지원하고 있다 (Xcode 9.0+) developer.apple.com/documentation/swift/codable..

bmwe3.tistory.com

마치기전에

왜 개발환경을 강조하면서 시작했을까 할 수 있다.

하드웨어를 영향은 아닌 것 같고 Xcode 12.2에서는 app <> watch  메시지를 연결해주는 WCSession 디버깅이 안 된다!!!

부디 유사한 프로젝트 진행하시는 분들에게 도움이 되길 바랍니다.

 

덧> 해당 개발 사항은 하기 앱에 적용되어 있으니 한번 보셔도 좋을 것 같습니다.

https://itunes.apple.com/US/app/id1527099671

by 무위자연 2020. 11. 30. 18:26

개발 환경 : Xcode 12.1

사용언어 : swift

애플은 데이터의 json으로의 encode / decode를 지원하기 위해서 codable이란 프로토콜을 지원하고 있다 (Xcode 9.0+)

developer.apple.com/documentation/swift/codable

 

Apple Developer Documentation

 

developer.apple.com

해당 프로토콜을 이용해서 쉽게 json 데이터를 다룰 수 있다. 특히 파일 저장이나 rest api 응답을 받아서 처리할 때 유용하다.

임의의 구조체를 선언하고 codable을 상속 받기만 하면 일단 사용할 준비가 완료 된다.

다음과 같은 임의의 구조체가 있다고 가정해보자.

1. 구조체를 json string으로 

해당 구조체를 이용해서 생성한 데이터를 json string으로 바꾸어서 파일까지 저장한다면 다음과 같이 구현할 수 있다.

 

json string으로 변환했을 때까지를 출력하면 다음과 같이 나온다.

 

2. json string을 구조체로

json 으로 저장된 파일에서 원하는 구조체로 읽어 내는 것은 다음과 같이 사용할 수 있다.

 

3. Date 형식의 경우

codable 프토로콜을 상속 받더라도 json 문법에 맞지 않는 Date 같은 데이터는 처리할수가 없는데

명시적으로 처리하는 방법을 알려준다면 encode/decode가 가능해진다.

encoding 할 경우 다음과 같이 추가해준다면, Date 형식을 읽고 쓰는데 문제가 없다.

 

*처음으로 코드를 캡쳐 대신에 gist를 써보니 깔끔하네요

by 무위자연 2020. 11. 19. 11:57

개발환경 : Xcode 12.1

시작하기 전에 Widget 자체에 대해서 궁금하시다면

bmwe3.tistory.com/1761

 

[ios][swiftUI][WidgetKit] home screen widget(widget)기능 구현하기

개발환경 : Xcode 12.0.1 1. wigetkit이란? ios14부터 홈 화면에 widget을 넣을 수 있다. app이 가진 정보를 app을 열지 않고도 보여주고(일부) 필요할 경우 app을 실행해서 할 일 할 수 있게 해주는 정도의 기

bmwe3.tistory.com

Widget Configuration을 2가지로 나눌 수 있다.

developer.apple.com/documentation/widgetkit/creating-a-widget-extension

 

Apple Developer Documentation

 

developer.apple.com

StaticConfiguration은 홈에 설정된 위젯의 내용에 대한 변경 기능을 제공하지 않는 것이고

예시.

IntentConfiguration은 위젯 변경 (Edit Widget)을 제공하는 것이다.

예시 - Edit Widget이 보인다.

만들 위젯 혹은 앱 데이터의 성향에 따라서 결정하면 된다.

어떤 Configuration을 설정할지는 "Target"추가 화면에서 "Include Configuration Intent"를 클릭하면 IntentConfiguration가,

클릭을 해제하면 StaticConfiguration가 설정되게 된다.

 

만들 때 무엇을 선택하더라도 변경이 쉬우므로 크게 고민하지 않아도 된다.

차이점은 Widget 생성자와 TimelineProvider가 무엇을 상속받느냐의 일뿐이다.

  StaticConfiguration IntentConfiguration
생성자
TimelineProvider

TimelineProvider

IntentTimelineProvider
intentdefinition file X O

 

IntentConfiguration으로 만든 앱이라면 다음과 같이 intentdefinition file에서 parameter을 추가해줄 수 있다.

해당 parameter는 위젯 편집 으로 진입해서 값을 수정할 수 있게 된다.

by 무위자연 2020. 10. 29. 07:42

개발환경 : Xcode 12.0.1

1. wigetkit이란?

ios14부터 홈 화면에 widget을 넣을 수 있다. app이 가진 정보를 app을 열지 않고도 보여주고(일부) 필요할 경우 app을 실행해서 할 일 할 수 있게 해주는 정도의 기능이다.

애플 공식 가이드 글 : developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/widgets

 

Widgets - System Capabilities - iOS - Human Interface Guidelines - Apple Developer

A widget elevates key content from your app and displays it where people can see it at a glance on iPhone, iPad, and Mac. Useful and delightful, widgets can also help people personalize their iPhone Home screens in unique ways. In iOS 14, iPadOS 14, and ma

developer.apple.com

2. 기존 app에 추가하기 위해서는?

Xcode > File > New > Target > WidgetKit을 선택하면 된다

3. 개발시 UI 구성은 반드시 swiftUI로 구성해야 한다.

이 때 app의 개발환경과는 별도이므로 app은 storyboard, widget은 swiftUI로 구성할 수 있다.

- swiftUI 관련 내용은 다음 블로그 포스팅을 참고 했다.

medium.com/harrythegreat/swiftui-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-1%ED%8E%B8-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0-11e7b589e6de

 

SwiftUI 튜토리얼 1편 — 기본구조

최근 SwiftUI를 공부하며 정리한 내용들을 복습하고자 블로깅하게되었습니다. Swift UI는 UIKit 위에서 빌드되는 프레임워크로 새로운 방식의 UI 인터페이스를 제공하며 선언형 방식의 구조를 가지고

medium.com

4. widgetkit에서 파일을 추가할 경우 반드시 target membership을 확인한다.

target membership을 설정해야 app의 파일과 widgetkiet의 ***homewidget.swift이외의 파일 내용을 ***homewidget.swift에서 접근할 수 있게 된다. 

target membership은 파일 선택후 file inspector(화면 우측 중앙)에서 변경 가능하다

설정하지 않았을 경우 다음과 같이 scope 에러가 나게 된다

RecordView3가 정의되어 있지만 homewidget에서 RecordView3에 접근할수 없다

5. widget은 timelineProvider가 제공하는 timelineEntry를 가지고 UI를 구성한다.

timelineprovider가 다음 entry를 제공하면 변경이 되게 된다.

5-1 timeline이 시간순으로 변경되는 중에 새로 갱신할 필요가 app에서 발생할 경우 다음과 같이 reload를 요청할 수 있다.

출처 : https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date

 

Apple Developer Documentation

 

developer.apple.com

6. widget 등록 화면에서의 데이터 보여주기

다음과 같이 homewidget의 preview 데이터를 제공하면 widget 등록시 해당 데이터를 보여주고 사용자에게 어떤 위젯 형태(small, medium, large)를 선택할지 도움을 줄 수 있다.

해당 preview가 적용된 위젯 선택 화면은 다음과 같이 나오게 된다.

 

* one more thing!!

app과 widgetkit이 클래스나 파일을 공유할 때는 target membership이면 되지만 데이터를 공유하기 위해서

app group을 설정해주어야 한다.

Xcode > project 설정 > signing & capabilities > Capability 에서 app group을 설정

설정하면 다음과 같이 나온다

by 무위자연 2020. 10. 25. 07:49

 

1. 구글 admob 이란? 

- 구글에서 제공하는 광고 플랫폼  https://admob.google.com/intl/ko/home/

 

Google AdMob: 모바일 앱 수익 창출

인앱 광고를 사용하여 모바일 앱에서 더 많은 수익을 창출하고, 사용이 간편한 도구를 통해 유용한 분석 정보를 얻고 앱을 성장시켜 보세요.

admob.google.com

admob의 이익

2. 시작하기

2-0. 구글 계정을  만든다.

2-1. 구글 admob에 가입을 한다.

2-2. 광고를 추가한다. 이 때 어떤 형태의 광고를 만들지 정하게 된다(배너, 전면 등) - 여기서는 배너로 추가한다.

2-3. 추가한 광고는 다음과 같이 확인이 가능하다.

 

3. SDK를 확인하고 app에 추가한다.

관련 문서 주소 :  https://developers.google.com/admob/ios/quick-start?hl=ko

 

시작하기  |  iOS  |  Google Developers

iOS 앱을 제작 중인 AdMob 게시자를 위한 모바일 광고 SDK입니다.

developers.google.com

3-1. 2번에서 추가한 광고 타입에 따른 코드를 확인한다. 여기서는 배너타입으로 확인할 예정이다.

https://developers.google.com/admob/ios/banner?hl=ko

 

배너 광고  |  iOS  |  Google Developers

배너 광고는 기기 화면의 상단이나 하단에 있는 앱의 레이아웃 안에 게재됩니다. 사용자가 앱과 상호작용하는 동안 배너가 화면에 표시되며, 일정 시간이 지나면 자동으로 새로 고침될 수 있습�

developers.google.com

3-2. app info list에 광고 정보를 추가한다.

https://developers.google.com/admob/ios/app-transport-security?hl=ko

 

앱 전송 보안  |  iOS  |  Google Developers

ATS(App Transport Security)는 iOS 9에서 도입된 개인정보 보호 기능입니다. 새 앱에서는 기본적으로 이 기능이 사용되며, 보안 연결이 적용됩니다. 이러한 변경에 따라 Xcode 7 이상으로 생성하고 ATS를 사

developers.google.com

3-3. 배너 View를 지정하고 다음과 같이 코드를 입력하면 배너가 로드가 된다.

4. 테스트하기

4-1. 정상적으로 배너가 로드 되는지 확인하기 위해서 test unitID를 입력해서 시뮬레이터에서 확인한다.

 > test mode가 뜨는 광고 배너가 보인다면 정상적으로 로드 테스트가 끝났다.

4-2. 2번에서 생성한 광고 단위의 unitID를 입력해서 시뮬레이터에서 확인한다.

- 시뮬레이터이므로 실제 광고 단위여도 test mode가 뜬다

4-3. 빌드 버전을 실제 단말에 연결해서 확인한다.

- test unitID로 보이는지 확인한다.

- 실제 unitID로는 보이지 않는다!!!

단, 다음과 같이 테스트 단말의 device id를 입력한 경우에만 보인다.

5. 실 광고 unitID를 넣어서 AppStore에 앱을 배포하고 수일을 기다린다.(2~3일?)

- 구글 admob 페이지에서 app store 연결하기를 통해서 사용된 app과 adbmob을 연결 시켜준다.

https://support.google.com/admob/answer/2773509?hl=ko

 

AdMob에서 앱 설정하기 - Google AdMob 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

- 몇 시간을 기다리면, 다음과 같이 admob이 하단에 보이게 된다.

by 무위자연 2020. 8. 31. 13:35
| 1 2 |