336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Int형 천단위 콤마 찍고 스트링으로 변환해주기

설명

보통 돈을 나타낼때 천자리마다 콤마(,)를 찍습니다. Int형 값에 천단위마다 콤마(,)를 찍어주고 String형 값으로 변환해주는 소스 입니다.


사용환경

* Swift 4.2
* XCode 10.0


코드

//Swift 코드
let intValue: Int = 1000

let value: NSNumber = intValue as NSNumber
print("NSNumber = \(value)")
let formatter = NumberFormatter()
formatter.numberStyle = .decimal

guard let resultValue = formatter.string(from: value) else { return }
print("Result Value = \(resultValue)")


//출력 결과
NSNumber = 1000
Result Value = 1,000


//Objective-C
NSNumberFormatter * numFormatter = [[NSNumberFormatter alloc] init];
[numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
int value = 1000;
NSString * price = [NSString stringWithFormat:@"%@", [numFormatter stringFromNumber:[NSNumber numberWithInt:value]]];


맞치며

단위가 관련된 앱을 만들다 보면 많이 사용되는 방법 중 하나입니다. 틀린점이나 궁금한점 있으면 댓글 남겨주세요 :)


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

몸무게매니저 - 몸무게를 효과적으로 관리 하세요!

소개

여섯번째로 소개할 앱은 “몸무게매니저” 입니다.
몸무게를 관리 하기 쉽게 만들려고 만든 어플리케이션입니다.
간단하게 그날 몸무게와 메모를 적고 그래프를 통해 변화를 알수 있는 어플입니다.

정보

이름 - 몸무게매니저
지원OS - iOS
가격 - 무료

주요기능

자신의 몸무게를 관리 하시는 분들을 위한 어플입니다.
한눈의 자신의 몸무게 변화를 확인 하세요.

주요 기능
1) 그래프 형식의 몸무게 변화

  • 그래프 형식으로 자신의 몸무게의 변화를 일,주,월,년 단위로 알수 있습니다.
  • 그래프 옆에 자신의 목표 몸무게까지 달성 퍼센트가 표시됩니다.

2) 목표 몸무게를 설정 할 수 있습니다.

  • 목표를 세워 더 빠르게 목표를 향해 달려 갈 수 있습니다.

3) 메모 기능

  • 그날 몸무게를 적으면서 메모를 해 나중에 회고를 하세요.

4) BMI

  • BMI를 통해 자신의 몸의 비만도 상태를 간접적으로 알 수 있습니다.
    (* BMI(체질량 지수)는 인간의 비만도를 나타내는 지수로, 체중과 키의 관계로 계산됩니다.)

앱 이미지

'App 소개' 카테고리의 다른 글

[iOS, android] 타임박스  (0) 2023.08.29
[iOS, android] 콘티공유 - 쉬운콘티공유  (0) 2022.08.17
[iOS]내주변화장실  (0) 2018.07.14
[iOS]콘티메이크  (1) 2017.05.29
[iOS]워드북-영어편  (2) 2016.06.14
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

내주변화장실 - 생리현상을 참으면 병 걸립니다.

소개

다섯번째로 소개할 앱은 “내주변화장실” 입니다.
공공데이터를 이용해서 만든 어플리케이션 입니다.
현재 위치를 기반으로 반경 1km 안에 있는 공공화장실을 지도에 보여줍니다.
안드로이드는 아직 지원이 되지 않습니다.

정보

이름 - 내주변화장실
지원OS - iOS
가격 - 무료

주요기능

내 주변에 있는 공공 화장실 위치와 정보를 알려드립니다.

1) 반경 1km 안에 있는 공공 화장실 위치를 알려드립니다.

  • 정보 제공은 공공 데이터에서 제공 받았습니다.

2) 화장실에 대한 자세한 정보를 제공합니다.

  • 주소, 담당기관, 전화번호, 시설에 관한 정보

3) 원하는 지역의 화장실 정보를 저장 할 수있습니다.

  • 행정구역(특별시, 광역시, 도) 형태로 정보를 제공합니다.

생리현상은 살면서 누구나 겪는 매우 자연스러운 현상입니다. 우리의 몸은 항상성을 유지하기 위해 다양한 활동을 하고 있으며 이때 불필요한 것들을 배출하는 것이 바로 생리현상이다. 즉 참으면 병에 걸립니다.

어플리케이션 이미지

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


info.plist 내용 코드로 가져오기


설명

안녕하세요. 앱이름, 앱버전, 앱빌드정보등 앱을 만들면서 필수적으로 필요한 정보들이 있습니다. 물론 앱을 만들면서 적절히 활용도 할 수 있습니다. 기본적인 내용은 info.plist 파일에 있는 내용들을 코드로 가져와서 사용하는 부분입니다. 왼쪽에 file list에서 info.plist 파일을 선택한 후 XCode에 오른쪽 상단에 있는 버튼 중에 Comparison이라는 버튼을 클릭 하면 코드 형식으로 info.plist를 볼 수 있습니다. 그 내용을 코드로 가지고 와서 필요한 부분 꺼내서 쓰는 코드 입니다. 세팅값에 따라 가져 올수 있는 정보의 양이 많기 때문에 이 포스트에서는 앱이름, 앱버전, 앱빌드버전 그리고 앱이 지원하는 미니멈SDK버전만 가지고 오겠습니다.


사용환경

* Swift 4.0
* XCode 9.2

코드

옵셔널 형태로 가져오기 때문에 if문을 통해서 옵셔널을 벗겨서 사용을 해야 앱이 튕기지 않고 잘 사용 하실수 있습니다.

if let infoDic: [String: Any] = Bundle.main.infoDictionary {
    if let appName: String = infoDic["CFBundleName"] as? String { print("appName = \(appName)") }
    if let appVersion: String = infoDic["CFBundleShortVersionString"] as? String { print("appVersion = \(appVersion)") }
    if let appBuild: String = infoDic["CFBundleVersion"] as? String { print("appBuild - \(appBuild)") }
    if let minimumOSVersion: String = infoDic["MinimumOSVersion"] as? String { print("minimumOSVesion - \(minimumOSVersion)") }
} else {
    print("Not Info")
}
//출력 결과
appName = 노스모킹
appVersion = 1.0.0
appBuild - 1
minimumOSVesion - 9.0

맞치며

info.plist 파일에 있는 내용은 매우 중요한 정보들이 들어 있습니다. 코드로 가져왔던 앱버전,앱이름등등 사실 앱을 만들면서 코드로 가져와서 사용되는 부분이 극히 적을수 있습니다. 필요한 정보만 가지고 와서 활용을 하면 됩니다. 감사합니다. 틀린점이나 궁금한점 있으시면 댓글 남겨주세요 :)



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


리뷰 페이지로 이동하기

설명

앱을 평가받는 중요한 요소중 하나인 리뷰입니다. 리뷰를 쓸수 있게 유도하는것도 좋은 방법이고, iRate 라는 오픈소스를 통해 알트 창을 띄어 유도하는 방법도 있습니다. 앱스토어 리뷰 페이지로 이동 시켜주는 코드 입니다. 고유 아이디 부분에 어플 고유 아이디를 삽입 한후 실행 시키면 리뷰 페이지로 이동합니다. 앱 아이디는 아이튠즈 웹페이지에 들어가셔서 주소를 확인하면 뒤에 id부터 ?까지가 앱 아이디 입니다. 개발자 사이트에 나와있는 고유 아이디와 같습니다.


사용환경

* Swift 4.x
* Xcode 9.2

소스코드

YourAppID 부분에 아이튠즈에 나와있는 고유ID를 넣어주시면 됩니다. 출시전에도 앱의 고유아이디는 받아 올 수 있습니다.

if let reviewURL = URL(string: "itms-apps://itunes.apple.com/app/itunes-u/id\(YourAppID)?ls=1&mt=8&action=write-review"), UIApplication.shared.canOpenURL(reviewURL) { // 유효한 URL인지 검사합니다.
    if #available(iOS 10.0, *) { //iOS 10.0부터 URL를 오픈하는 방법이 변경 되었습니다.
        UIApplication.shared.open(reviewURL, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(reviewURL)
    }
}

맞치며

앱 개발자로서 좋은 리뷰를 받으면 정말 기분이 좋습니다. 내 앱에 대해서 평가가 안 좋을수도 있지만 리뷰를 통해 많은 분들이 앱이 나아가야 하는 방향등 여러가지를 가르쳐줍니다. 리뷰를 통해 발전된 앱을 유저들에게 제공하는 것도 앱개발자로서 역할인거 같습니다. 틀린점이나 궁금한 점 있으시면 언제든지 댓글로 알려주시면 대답해 드리겠습니다. 감사합니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


SCTableIndex


설명

섹션을 사용하지 않고 테이블에 들어갈 String의 초성을 가지고 인덱스를 만드는 라이브러리입니다. 섹션 인덱스가 필요 할경우 활용해서 사용하실수 있습니다.


Github 주소

https://github.com/myoungsc/SCTableIndex


스크린샷


작업한 환경

* Swift 4
* XCode 9.1
* iOS 9.0 (Min SDK)

설치방법

다른 CocoaPod 처럼 설치 하시면 됩니다.

1. 터미널에서 해당 프로젝트 디렉토리로 이동한 후 'Pod init'
2. 디렉토리에 있는 PodFile에 (pod 'SCTableIndex')를 추가
3. 터미널에서 'pod install'
<

사용방법

import SCTableIndex

arrItem.sort()
sctbindex.delegate = self
//Use Selector Font, HelveticaNeue-Medium is Normal Font
//sctbindex.initialFont = UIFont(name: "HelveticaNeue-Medium", size: 13)!
//Use Selector initial Text Color, black is Normal Color
//sctbindex.initialTextColor = UIColor(red: 50.0/255.0, green: 50.0/255.0, blue: 50.0/255.0, alpha: 1.0)
//String Array item
sctbindex.setView(arrItem)


//MARK: SCTableIndex Delegate
extension ViewController: SCTableIndexDelegate {
    // Move starting point item that select initial text
    func scTableIndexReturnInitialText(_ strInitial: String, index: Int) {
        tbMain.scrollToRow(at: IndexPath(row: index, section: 0), at: .top, animated: true)
    }
}

라이센스

라이센스는 MIT라이센스를 따릅니다. 앱에 적용하실때는 사용하였다고 명시만 해주시면 됩니다.



'iOS 프로그래밍 > CocoaPod' 카테고리의 다른 글

SCCardView  (0) 2017.12.21
SCWebPreview  (0) 2017.08.30
SCPageControl  (0) 2017.08.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


SCCardView


설명

뷰 밑에 있는 카드를 선택하여 상단에 있는 전체뷰를 바꿔주는 controller 입니다. 카드영역은 콜렉션뷰를 사용하였고 위에 내용이 표시되는 부분은 커스텀 하여서 원하는 목록을 넣어서 사용 할수 있습니다.

Github 주소

https://github.com/myoungsc/SCCardView

스크린샷


작업한 환경

* Swift 3.0.1
* XCode 8.3.1
* iOS 9.0 (Min SDK)

설치방법

다른 CocoaPod 처럼 설치 하시면 됩니다.

1. 터미널에서 해당 프로젝트 디렉토리로 이동한 후 'Pod init'
2. 디렉토리에 있는 PodFile에 (pod 'SCCardView')를 추가
3. 터미널에서 'pod install'

사용방법

import SCCardView

// Int index, [String: String] key, Value
// Make dummy data (Necessary key Image Card UI)
let dummyData: [Int: [String: Any]] = [0: ["image": UIImage()!,
                                          "title": "Catholic Church",
                                          "url": "https://github.com/myoungsc/SCCardView/blob/master/Example/SCCardView/Images.xcassets/sc0.imageset/sc0.jpg?raw=true",
                                          "description": "Maybe famous Catholic Churchsadl"],
                                       1: ["image": UIImage(named: "sc1")!,
                                           "title": "Beautiful Sea",
                                           "description": "Beautiful sea anywhere on earth"],
                                       2: ["image": UIImage(named: "sc2")!,
                                          "title": "Famous temple",
                                           "description": "A landscape of famous temple"],
                                       3: ["image": UIImage(named: "sc3")!,
                                          "title": "Pretty Flower",
                                          "description": "Pretty Flower\nphoto  by myoung father"],
                                       4: ["image": UIImage(named: "sc4")!,
                                          "title":"Vast Sky",
                                          "description": "Vast korea sky\nphoto by myoung father"],
                                       5: ["image": UIImage(named: "sc5")!,
                                          "title": "Leaf",
                                          "description":"Leaf anywhere on Korea\nphoto by myoung father"]]

sccard.delegate = self
sccard.cardStyle = .onlyTop
//if cardstyle round cutom
/*
 sccard.cardStyle = .custom
 sccard.initCustomCardStyle([.topLeft, .bottomRight])
 */
sccard.initialViewData(dummyData)

// Set initial value
if let dicSubData: [String: Any] = dummyData[0] {
    if let img: UIImage = dicSubData["image"] as? UIImage,
        let title: String = dicSubData["title"] as? String,
        let des: String = dicSubData["description"] as? String {
        sccardSubImg.image = img
        sccardSubTitle.text = title
        sccardSubDes.text = des
    }
}
// Autolayout bottom card ratio
contBottomDes.constant = sccard.bottomInterval


// Delegate
// Selector Card Click. Required Delegate
func SCCardSelectorCard(_ index: Int, dic: [String: Any]) {
    if let img: UIImage = dic["image"] as? UIImage,
        let title: String = dic["title"] as? String,
        let des: String = dic["description"] as? String {
        sccardSubImg.image = img
        sccardSubTitle.text = title
        sccardSubDes.text = des
    }
}

// Refresh content view from down image. Required Delegate
func SCCardURLIndexRefresh(_ img: UIImage) {
    sccardSubImg.image = img
}

// Card Down Gesture. optional Delegate
internal func SCCardDownCardAction(_ indexPath: IndexPath) {
    print("down gesture \(indexPath)")
}

// Card Up Gesture. optional Delegate
internal func SCCardUpCardAction(_ indexPath: IndexPath) {
    print("up gesture \(indexPath)")
}

라이센스

라이센스는 MIT라이센스를 따릅니다. 앱에 적용하실때는 사용하였다고 명시만 해주시면 됩니다.



'iOS 프로그래밍 > CocoaPod' 카테고리의 다른 글

SCTableIndex  (0) 2017.12.21
SCWebPreview  (0) 2017.08.30
SCPageControl  (0) 2017.08.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


위도와 경도로 주소 가져오기

설명

안녕하세요. 오랜만에 포스트를 올리네요. 오늘 할 포스트 내용은 iOS에서 위도와 경도를 가지고 해당 주소를 알아내는 소스코드입니다. 사진을 찍을때 위치정보가 같이 저장된다면 사진첩 어플에서 지도에 사진이 위치별로 표시되는 기능이 있습니다. 사진에 저장된 위치를 기반으로 표현을 하는겁니다. 사진에 있는 위치를 알아오는 법은 나중에 한번더 포스트해서 정리 하겠습니다. 코드 자체는 매우 간단합니다. CLLocation에 해당 위도,경도를 넣어주신 다음에 CLGeocoder 객체를 사용하셔서 받아오시면 됩니다.


사용환경

* Swift4.x
* Xcode 9.1

소스 코드

import CoreLocation

//latitude: 위도, 도: 경도
let findLocation = CLLocation(latitude: 37.576029, longitude: 126.976920)
let geocoder = CLGeocoder()
let locale = Locale(identifier: "Ko-kr") //원하는 언어의 나라 코드를 넣어주시면 됩니다.
geocoder.reverseGeocodeLocation(findLocation, preferredLocale: locale, completionHandler: {(placemarks, error) in
    if let address: [CLPlacemark] = placemarks {
        if let name: String = address.last?.name { print(name) } //전체 주소
    }
})

CLPlacemark에 들어있는 정보들

CLPlacemark에 대한 정보는 밑에 있는 도큐멘트에서 알아 볼 수 있습니다. 필요한 부분만 가져다가 쓰시면 될거 같습니다.

CLPlaceMark에 대한 애플 도큐멘트

맞치며

위치기반 시스템이 들어간 앱이라면 많이 사용 하시는 부분입니다. 포스트를 하면서 드는 생각인데 추가적으로 현재 위치를 가져오는 부분도 추가로 포스팅 작업을 하겠습니다. 틀린점이나 궁금한점 있으시면 언제든지 댓글로 말해주세요 :)



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


앱스토어 올라가는 스크린샷에 동영상을 추가해서 앱을 설명 할 수 있습니다. 그 동영상이 실제 앱이 구동되는 화면을 가지고 설명되는 동영상이면 상관이 없지만, 앱을 설명하는 동영상에 실제 화면이 포함되지 않는 동영상이 올라갈 경우 사용자에게 명확한 설명이 안되고 추상적이기때문에 애플 측에서 리젝을 합니다.


리젝 사유

Performance - 2.3.4

Your App Preview includes content that does not sufficiently reflect the app in use.
Specifically, your preview:

- Showed footage other than the app in use.

Next Steps

Please revise your App Preview to only use video screen captures of the app,
narration, and textual and design overlays.

해결 방안

동영상을 올릴경우 꼭 전체화면은 아니지만 보여지는 화면에 실제 사용되는 앱의 모습니 있어야 됩니다. 매우 간단한 해결 방안이지만 만약 리젝을 당했던 동영상이라면 동영상을 다시 만들어야 되는 문제가 발생 합니다.


마치며

처음부터 이러한 사실을 알고 있다면 좋겠지만, 보통의 경우 한번당하고 나서 알게됩니다. 직접 동영상을 만들지 않는 것이라면 영상 제작자에게 잘 얘기를 해서 수정해야되는 방향으로 가거나 아예 동영상을 삭제 해야되지 않을까 싶습니다. 리뷰를 맡기면서 느끼는 거지만 요새는 리뷰를 하루면 해주기 때문에 출시하기 일주일전에 개발자가 출시해야되는 옵션을 걸고 리뷰를 맡아 보고나서 출시일에 맞쳐서 앱을 출시 하는 것도 리젝을 피하는 하나의 방법이지 않을까 싶습니다. 틀린점이나 궁금한점 있으면 언제든지 댓글을 남겨 주세요 :)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


설명

런처이미지 사이즈에 대해서 포스팅 하겠습니다. 3.5인치에서 4인치 화면만 있다가 4.7인치와 5.5인치가 추가될때 런처이미지를 추가 하지 않으면 4.7과 5.5인치에서는 그냥 확대된 상태로만 나오던 적이 있었습니다. 애플에서 설명을 하는 런처이미지는 이렇습니다.

A launch screen appears instantly when your app starts up.
The launch screen is quickly replaced with the first screen of your app,
giving the impression that your app is fast and responsive.
The launch screen isn’t an opportunity for artistic expression.
It’s solely intended to enhance the perception of your app as quick
to launch and immediately ready for use. Every app must supply a launch screen.

앱이 시작되면 즉시 런처이미지가 나타납니다. 런치이미지는 빠르게 앱의 시작화면으로 바뀌어서 빠르게 반응하는 것 같은 인상을 줍니다. 런처이미지는 예술적으로 표현하는 곳이 아닙니다. 다만 앱이 즉시 사용 준비가 된 상태라는 것을 알려주기 위한 용도로만 사용도비니다. 모든 앱에서는 런처이미지를 제공해야됩니다. (직역입니다. 틀린부분이 있을텐데 그냥 넘어가주세요.. 영어공부 열심히 하겠습니다…)

앱이 시작되는 부분에서 나타나는 화면이고, 앱이 사용할 준비가 끝나면서 사라지는 장면이라는 것입니다.


이미지 사이즈 표

Device Portrait size(세로 방향) Landscape size(가로 방향)
12.9” iPad Pro 2048px × 2732px 2732px × 2048px
10.5” iPad Pro 1668px × 2224px 2224px × 1668px
9.7” iPad 1536px × 2048px 2048px × 1536px
7.9” iPad mini 4 1536px × 2048px 2048px × 1536px
iPhone X 1125px × 2436px 2436px × 1125px
iPhone 8 Plus 1242px × 2208px 2208px × 1242px
iPhone 8 750px × 1334px 1334px × 750px
iPhone 7 Plus 1242px × 2208px 2208px × 1242px
iPhone 7 750px × 1334px 1334px × 750px
iPhone 6sPlus 1242px × 2208px 2208px × 1242px
iPhone 6s 750px × 1334px 1334px × 750px
iPhone SE 640px × 1136px 1136px × 640px

맞치며

사실 LaunchScreen.storyboard 여기서 통합적으로 해주면 되기는 합니다. 오토레이아웃도 사용할 수 있고요. 아이폰x에서 탭바가 네이비게이션 이동을 탭바를 사라지게 하는 hidesBottomBarWhenPushed 옵션을 주게 되면 위로 올라갔다가 사라지는 이슈가 있는데,, 아이폰x 런처 이미지를 넣어주면 해결 된다는 글을 본적이 있습니다. (적용을 해봤지만 실패 해서 일단 다른 방법을 사용 하고 있습니다.) 필요로 하면 넣어주는게 맞는거 같습니다. 포스팅에 잘못된점이 있으면 댓글 달아주시면 수정하도록 하겠습니다.



+ Recent posts