1. react-native 설치 및 프로젝트 생성

$ npm install -g react-native-cli

$ react-native init TestProject

$ cd TestProject

$ npm install

https://github.com/nashorn74/TestProject

 

nashorn74/TestProject

Contribute to nashorn74/TestProject development by creating an account on GitHub.

github.com

 

2. Cocoa Pod 설치 (iOS용)

$ cd ios

$ pod install

$ cd ..

https://stackoverflow.com/questions/56916798/react-rctbridgedelegate-h-file-not-found

 

React/RCTBridgeDelegate.h' file not found

I have created a new project called auth using react-native init auth at terminal.When i tried to run the project using react-native run-ios. The build failed and gave a error 'React/RCTBridgeDeleg...

stackoverflow.com

 

3. ios 앱 빌드 및 실행

$ react-native run-ios

* Android Studio와 달리 XCode에서 직접 빌드 및 실행을 할 수 있다.

 

https://yuddomack.tistory.com/entry/1React-Native-%EC%84%A4%EC%B9%98%EC%99%80-%EC%8B%A4%ED%96%89hello-world

 

1.React Native 설치와 실행(hello world)

지난 시간에는 꿀잼 리액트의 매력을 나열해봤습니다. 본디 React.js부터 시작하는게 순서가 아니겠나 싶지만 현재 React Native 프로젝트를 진행중이기 때문에 까먹지 않기 위해 React Native의 시작부터 디자인..

yuddomack.tistory.com

https://woolbro.tistory.com/59

 

[React-Native] React-Native 입문기 - iOS, Android 설치 및 실행

안녕하세요~~!! 예전부터 이슈였지만, 최근에야 제가 좀 보게 된 React-Native에 대해서 천천히 포스팅 해보려고 합니다. 설치와 실행기, 기본적인 부분을 공부하면서 포스팅 하려고 합니다!! 기회가 된다면, 프로..

woolbro.tistory.com

https://g6ling.gitbooks.io/react-native-tutorial-korean/react_native_inspector.html

 

React Native Inspector · react-native-tutorial-korean

No results matching ""

g6ling.gitbooks.io

https://facebook.github.io/react-native/docs/getting-started

 

React Native · A framework for building native apps using React

A framework for building native apps using React

facebook.github.io

 

by 나숑 2020. 2. 3. 03:00

GitLab-CI와 fastlane을 이용한 iOS 앱 테스트 및 빌드 통합 시스템을 구축하는 과정에서, Apple에서 공식적으로 제공하는 XCode Server를 이용하면 동일한 통합 관리가 가능하다는 것을 알게 되었다. 

https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/

 

Xcode Server and Continuous Integration Guide: About Continuous Integration in Xcode

Xcode Server and Continuous Integration Guide

developer.apple.com

 

by 나숑 2020. 1. 6. 03:53

1. match를 이용하여 iOS용 인증서와 프로비저닝 파일을 관리하는 방법이 이해가 안되고 헷갈렸다. 처음에는 직접 인증서를 별도의 git 리파지토리에 매뉴얼로 관리해줘야 한다는 것인줄 알았는데... 알고 보니 비어있는 프라이빗 리파지토리만 만들어서 연결해주면 되는 문제였다. ㅠㅠ

공식 매뉴얼을 계속 보고 또 보았지만, 처음엔 그저 헷갈리기만 할뿐..

https://codesigning.guide/

 

Code Signing Guide for Teams

A new approach to code signing A best practices guide on how to manage certificates and provisioning profiles in your development team. Wait, what is code signing? Code signing is required on iOS when distributing your app to customers. It assures that you

codesigning.guide

https://docs.fastlane.tools/actions/match/

 

match - fastlane docs

A new approach to iOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues. match is the implementation of the codesigning.guide concept. match creates all required ce

docs.fastlane.tools

https://docs.fastlane.tools/codesigning/getting-started/

 

Getting Started - fastlane docs

New to fastlane? Click here to open the installation & setup instructions first xcode-select --install # Using RubyGems sudo gem install fastlane -NV # Alternatively using Homebrew brew cask install fastlane fastlane init More Details Codesigning concepts

docs.fastlane.tools

쓸데없이 인증서 파일을 직접 리파지토리에 올려놓으니 계속 쓸데없는 상황만 반복되고, github이나 bitbucket, gitlab에서의 인증 관련 내용을 보느라 시간 낭비를 했다. 에러 메시지가 계속 "Couldn't decrypt the repo, please make sure you enter the right password" 라는 식으로 뜨니 헷갈릴 수 밖에..

결국 마이크로소프트 사이트에 있는 내용이 도움이 될 줄이야... 비어있는 git 리파지토리만 제대로 연결되고 애플 개발자 사이트에 접속하여 인증서 처리만 정상적으로 되면 빈 리파지토리에 필요한 인증서가 자동으로 커밋 & 푸시된다. 허허허... 이런 원리일 줄이야.

https://docs.microsoft.com/ko-kr/xamarin/ios/deploy-test/provisioning/fastlane/match

 

iOS용 fastlane – match - Xamarin

이 문서에서는 iOS 개발에 대한 코드 서명 인증서 및 프로비저닝 프로필을 만들고 유지 관리하는 데 사용되는 fastlane의 일치 명령을 설명합니다.

docs.microsoft.com

 

2. 아무리 바꿔봐도 계속 Match[!] Can't find class 'adhoc'이라는 오류가 뜨는 동일한 문제가 발생한다. 그런데 알고보니, fastlane의 버전 문제란다!! fastlane v2.28.3에서만 발생하는 문제니 기존 버전을 삭제하고 최신 버전을 설치해주면 된다.

brew cask uninstall fastlane

sudo gem install fastlane -NV

https://github.com/fastlane/fastlane/issues/15606

 

[Regression] Match[!] Can't find class 'adhoc` · Issue #15606 · fastlane/fastlane

New Regression Checklist Updated fastlane to the latest version I read the Contribution Guidelines I read docs.fastlane.tools I searched for existing GitHub issues Regression Information Breaking v...

github.com

이를 위해서는 먼저 Gem의 최신버전 업그레이드와 기존버전 클린업이 필수...

https://sourabhbajaj.com/mac-setup/Ruby/RubyGems.html

 

RubyGems · macOS Setup Guide

No results matching ""

sourabhbajaj.com

그럼에도 새로 설치한 fastlane이 제대로 실행되지 않는다. Ruby 2.6.0으로 다음을 참고해서 업그레이드 해준다.

https://www.learningsomethingnew.com/how-to-solve-fastlane-installation-error-on-mac-os-mojave

 

How to solve fastlane installation error on macOS Mojave

What is fastlane Fastlane is a very useful automation tool for publishing iOS / Android apps. It make the building and deployment process scriptable, which makes it less error prone, and lets you push updates automatically with no manual involvement. The p

www.learningsomethingnew.com

그래도 안되어서 다음과 같이 처리하니 해결..

sudo gem install fastlane -NV -n /usr/local/bin

그다음에는 bundler가 없다고 에러.. 

gem install -n /usr/local/bin/ bundler
gem install -n /usr/local/bin/ fastlane

https://github.com/fastlane/fastlane/issues/15183

 

Fastlane not working on MacOS Catalina Dev beta · Issue #15183 · fastlane/fastlane

I was using fastlane perfectly before I upgraded to MacOS 10.15 Developer beta. Since upgrade I cant get fastlane to work. Every time I run any lane I am getting this error : zsh: /usr/local/bin/fa...

github.com

정말 징그럽다. ㅠㅠ

 

* 헷갈리게만 하는 불필요한 레퍼런스

https://medium.com/@jonathancardoso/using-fastlane-match-with-existing-certificates-without-revoking-them-a325be69dac6

 

Using fastlane match with existing certificates without revoking them

Fastlane match improves drastically code signing, even for small teams, their only issue is that by default, it does not work with existing…

medium.com

https://github.com/fastlane/fastlane/issues/12613

 

Fastlane beta shows "Couldn't decrypt the repo, please make sure you enter the right password" · Issue #12613 · fastlane/fastlan

I can't able to run the "fastlane beta", because it shows the error "Couldn't decrypt the repo, please make sure you enter the right password!". Enter the passphrase tha...

github.com

 

by 나숑 2019. 11. 25. 10:15

https://stackoverflow.com/questions/46192280/detect-if-the-device-is-iphone-x


You shall perform different detections of iPhone X depending on the actual need.

for dealing with the top notch (statusbar, navbar), etc.

class var hasTopNotch: Bool {
    if #available(iOS 11.0, tvOS 11.0, *) {
        // with notch: 44.0 on iPhone X, XS, XS Max, XR.
        // without notch: 20.0 on iPhone 8 on iOS 12+.
        return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
    }
    return false
}

for dealing with the bottom home indicator (tabbar), etc.

class var hasBottomSafeAreaInsets: Bool {
    if #available(iOS 11.0, tvOS 11.0, *) {
        // with home indicator: 34.0 on iPhone X, XS, XS Max, XR.
        return UIApplication.shared.delegate?.window??.safeAreaInsets.bottom ?? 0 > 0
    }
    return false
}

for backgrounds size, fullscreen features, etc.

class var isIphoneXOrBigger: Bool {
    // 812.0 on iPhone X, XS.
    // 896.0 on iPhone XS Max, XR.
    return UIScreen.main.bounds.height >= 812
}

Note: eventually mix it with UIDevice.current.userInterfaceIdiom == .phone
Note: this method requires to have a LaunchScreen storyboard or proper LaunchImages

for backgrounds ratio, scrolling features, etc.

class var isIphoneXOrLonger: Bool {
    // 812.0 / 375.0 on iPhone X, XS.
    // 896.0 / 414.0 on iPhone XS Max, XR.
    return UIScreen.main.bounds.height / UIScreen.main.bounds.width >= 896.0 / 414.0
}

Note: this method requires to have a LaunchScreen storyboard or proper LaunchImages

by 나숑 2018. 10. 11. 11:23


PayPal iOS SDK

https://github.com/paypal/PayPal-iOS-SDK


Braintree iOS SDK

https://github.com/braintree/braintree_ios



iOS용 Facebook 로그인 - 빠른 시작

https://developers.facebook.com/docs/facebook-login/ios


Facebook SDK for Swift

https://developers.facebook.com/docs/swift

https://github.com/facebook/facebook-sdk-swift



Naver ID Login SDK for iOS

https://github.com/naver/naveridlogin-sdk-ios



Getting Started on iOS (WeChat Open Platform)

http://open.wechat.com/cgi-bin/newreadtemplate?t=overseas_open/docs/mobile/getting-started/ios


How To Implement WeChat Login In iOS Swift

http://www.kekearif.com/how-to-implement-ios-wechat-login/


WeChat Login Android 연동

https://medium.com/@joongwon/wechat-login-android-%EC%97%B0%EB%8F%99-17d5c4f27614

Android WeChat Pay 개발하기

https://blog.kimkevin.net/android-dev-wechat-pay/



Instagram API —Authentication using Swift

https://wetalkit.xyz/instagram-api-authentication-using-swift-3bf27d7ed6aa


Manage Clients (Instagram Developer)

https://www.instagram.com/developer/clients/manage/

User Endpoints (Instagram Developer)

https://www.instagram.com/developer/endpoints/users/

by 나숑 2018. 4. 14. 20:35


Auk, an image slideshow for iOS / Swift

https://github.com/evgenyneu/Auk

// Show remote images
scrollView.auk.show(url: "https://bit.ly/auk_image")
scrollView.auk.show(url: "https://bit.ly/moa_image")

// Show local image
if let image = UIImage(named: "bird.jpg") {
  scrollView.auk.show(image: image)
}


// Scroll images automatically with the interval of 3 seconds
scrollView.auk.startAutoScroll(delaySeconds: 3)


Array or Dictionary Object to JSON String

/**
 JSON Object(NSArray, NSDictionary) -> String
 
 ```
 let inputJsonDictionary = ["first": true, "second": false]
 let resultDictionaryString = JSONStringify(value: inputJsonDictionary as AnyObject)
 print(resultDictionaryString)
 // {"second":false,"first":true}
 
 let inputJsonArray = [["first": true], ["second": false]]
 let resultArrayString = JSONStringify(value: inputJsonArray as AnyObject)
 print(resultArrayString)
 // [{"first":true},{"second":false}]
 ```
 
 - Parameter value: 변환할 Object(NSArray, NSDictionary)
 - Parameter prettyPrinted: 이쁘게 표현할지 여부 (default = false)
 - Returns : JSON 문자열
 */
func JSONStringify(value: AnyObject, prettyPrinted: Bool = false) -> String {
    
    let options = prettyPrinted ? JSONSerialization.WritingOptions.prettyPrinted : []
    
    if JSONSerialization.isValidJSONObject(value) {
        do {
            let data = try JSONSerialization.data(withJSONObject:value, options:options)
            if let jsonString = String(data: data, encoding: String.Encoding.utf8) {
                return jsonString
            }
        } catch {
            print("JSON serialization failed:  \(error)")
        }
    }
    return ""
}


http://kka7.tistory.com/33


by 나숑 2018. 1. 30. 23:55


https://swifter.kr/2016/12/31/swift-3-0%EC%97%90%EC%84%9C-userdefaults-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/


2) 저장

[이전]

[Swift 3.0]

저장관련 메소드는 set(_: forKey:)구조로 되어 있다. 컴파일러가 첫번째 파라미터의 형을 유추하여 알맞은 메소드가 호출하는 구조이다.

3) 읽기

[이전]

[Swift 3.0]

4) 삭제

[이전]

[Swift 3.0]

5) 존재 확인

[이전]

[Swift 3.0]


by 나숑 2018. 1. 1. 13:37

Swift에서 쉽게 multipart/formdata 형식으로 이미지 파일을 업로드(POST 방식)할 수 있는 라이브러리가 있어서 적용해보니 생산성이 무척 좋다.


import Alamofire


Alamofire.upload(multipartFormData: { (multipartFormData) in

            multipartFormData.append(UIImageJPEGRepresentation(UIImage(named: "1.png")!, 1)!, withName: "image", fileName: "swift_file.jpeg", mimeType: "image/jpeg")

            for (key, value) in parameters {

                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)

            }

        }, to:"http://127.0.0.1:3000/picture")

        { (result) in

            switch result {

            case .success(let upload, _, _):

                

                upload.uploadProgress(closure: { (Progress) in

                    print("Upload Progress: \(Progress.fractionCompleted)")

                })

                

                upload.responseJSON { response in

                    //self.delegate?.showSuccessAlert()

                    print(response.request)  // original URL request

                    print(response.response) // URL response

                    print(response.data)     // server data

                    print(response.result)   // result of response serialization

                    //                        self.showSuccesAlert()

                    //self.removeImage("frame", fileExtension: "txt")

                    if let JSON = response.result.value {

                        print("JSON: \(JSON)")

                    }

                }

                

            case .failure(let encodingError):

                print(encodingError)

            }

            

        }


* 아카이브 빌드를 하고 앱스토어에 등록하려고 하니 "이 빌드가 유효하지 않습니다."라면서 등록이 안되는 문제가 발생했다. 그리고 다음과 같은 메일이 날라왔다.

Dear developer,

We have discovered one or more issues with your recent delivery for "AppName". To process your delivery, the following issues must be corrected: 

Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path. 

Once these issues have been corrected, you can then redeliver the corrected binary. 

Regards,

The App Store team

 

이에 대한 해결 방법은 다음과 같다. 예전에도 이와 비슷하게 외부 라이브러리 관련된 에러가 있었는데 비슷한 유형인 듯하다.

https://stackoverflow.com/questions/38667492/how-to-debug-invalid-bundle-error-which-happens-only-after-submitting-to-app-s

After adding the custom Swift framework to my project I got this email after uploading the app to iTunes connect.

I got this email from iTunes store,

Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path.

The fix is simple for this issue,

Step 1: Make sure your Custom framework is added to Embedded Binaries in General tab of your target. enter image description here

Step 2: Under build settings,

Set Always Embed Swift Standard Libraries = Yes for your main project target.

And Set Always Embed Swift Standard Libraries = No for your custom framework target.

This solved my problem and I was able to upload binary to iTunes connect.


--------------------


Alamofire is an HTTP networking library written in Swift.

https://github.com/Alamofire/Alamofire


세련된 HTTP 프레임워크 Alamofire

https://outofbedlam.github.io/swift/2016/02/04/Alamofire/


[Raywenderlich - iOS/Swift] Alamofire 사용하기

http://rhammer.tistory.com/115


* git의 서브 모듈은 처음 써보는데, 다음과 같이 처리하면 된다.

--------------------------

http://ohgyun.com/711


다른 이름으로 부모 리파지터리를 클론해보자.

~/mywork
$ git clone git@github.com:ohgyun/submodule_test_parent.git submodule_test_parent_2

~/mywork
$ cd submodule_test_parent_2

이렇게 서브모듈이 포함된 리파지터리를 클론하면,
submodule_test_child 디렉토리는 존재하지만 내용은 비어있다.

~/mywork/submodule_test_parent_2
$ ls submodule_test_child


먼저, 서브모듈을 가져오려면 먼저 초기화 해야한다.

~/mywork/submodule_test_parent_2
git submodule init
Submodule 'submodule_test_child' (git@github.com:ohgyun/submodule_test_child.git) registered for path 'submodule_test_child'


다음으로 서브모듈을 업데이트한다.

~/mywork/submodule_test_parent_2
$ git submodule update
Cloning into 'submodule_test_child'...
...
Submodule path 'submodule_test_child': checked out '45069090990ad8c291f5f67b23c0aca83d6a4d6f'


서브모듈을 업데이트한다는 건,
현재 부모 리파지터리의 커밋에서 참조하고 있는 서브모듈의 커밋을,
자식 리파지터리의 리모트에서 체크아웃해온다는 뜻이다.

자식 프로젝트의 디렉토리로 이동해 로그를 확인해보면 대상 커밋으로 채워진 걸 확인할 수 있다.


by 나숑 2018. 1. 1. 00:27

생각보다 괜찮은 라이브러리들이 많아서 좋다. 가져다 쓰기도 편하고 커스터마이징도 쉽게 되어 있다. 좋은 세상~!


https://github.com/EranBoudjnah/MTCircularSlider

Screenshot

Screenshot from Simulator


https://github.com/kaandedeoglu/KDCircularProgress

Youtube Link

Screenshot

Screenshot Screenshot Screenshot Screenshot Screenshot Screenshot Screenshot


https://github.com/MatiBot/MBCircularProgressBar

 please tell me and I will add your app here.


직접 custom control을 제작하는 과정을 상세히 기록해놓은 좋은 블로그도 있다.

단, Swift 1.2로 되어 있어서 Swift 3에서 사용하려면 다소의 컨버팅 작업이 필요할 듯하다.

https://www.raywenderlich.com/82058/custom-control-tutorial-ios-swift-reusable-knob


by 나숑 2017. 5. 19. 09:42

아래에 있는 Slide Menu 라이브러리들을 가져다가 사용해보려고 샘플을 돌려보다가 쓸데 없는 컴파일 에러만 계속 생겨서 다음 동영상을 보고 직접 만들었다. 훨씬 간단하다!

https://www.youtube.com/watch?v=K89-RLzYxQM


----------------

UI/UX 관련해서는 라이브러리를 많이 사용해야 하니 레퍼런스가 필요하다.

https://swifter.kr/2016/09/03/swifter%EA%B0%80-%EC%B6%94%EC%B2%9C%ED%95%98%EB%8A%94-%EC%95%8C%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EA%B0%9C%EB%B0%9C%EC%9A%A9-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/


UI 디자인

7. ParseUI

깔끔한 로그인 화면등에 사용할 수 있는 UI를 사용할 수 있다.

parseui

8. FlatUIKit

플랫한 UI 라이브로리로 경고창이나 버튼, 입력박스등을 참고할 수 있다.

flatuikit2 flatuikit1 flatuikit3

9. JSQMessagesViewController

다양한 앱에 메시지받는 기능이나 채팅기능을 구현하고 싶을 때 유용하며 Firebase와도 궁합이 잘 맞는다.

screenshot0

10. KRPrograssHUD

다른 로딩 라이브러리도 많지만 색상이나 상세정보를 깔끔하고 쉽게 변경할 수 있어 추천한다. 보통은 SVProgressHUDMBPrograssHUD를 많이 사용한다.

styles

11. DualSlideMenu

Swift언어로 작성된 일반적인 슬라이드 메뉴를 구현할 때 자주 사용하는 라이브러리중 하나이다.

dualslide

12. SlideMenu3D

입체적인 슬라이드메뉴를 구성해야할 경우 사용할 수 있는 라이브러리로 유튜브에 올라온 영상을 참고하자.

13. UIImageView-Letters

구글 서비스를 사용하다보면 나오던 원형 아이콘에 이니셜이 들어가는 형태의 이미지를 구현하고 싶을 때 이용할 수 있는 라이브러리이다.

uiimage-letters

14. UIViewController-KeyboardAnimation

키보드를 눌렀을 때 애니메이션 처리에 유용한 라이브러리인데 최근 업데이트가 되지 않고 있다.

an_kb_animation_demo

15. UIColor-Hex-Swift

UIColor에 16진수 색상을 쉽게 사용하고 싶은 경우에 이용할 수 있는 라이브러리이다.

16. UITextField-Navigation

개인정보 입력화면 양식등에 다음 텍스트필드로 입력할 수 있도록 이동이 가능하게 만들어주는 라이브러리이다.

screenshot2

17. UICountingLabel

카운팅 애니메이션이 필요할 경우 이용할 수 있다.

demo

18. FoldingTabBar.iOS

TabBar를 사용하는 UI를 구성시 깔끔한 애니메이션을 적용하고 싶은 경우에 이용할 수 있는 라이브러리이다.

foldingtabbar

19. LTNavigationBar

스크롤바가 방해되지 않는 형태의 네비게이션을 구현할 때 유용하다.

ltnav

20.JDAnimationKit

코드 작성이 적고 깔끔하고 쉽게 애니메이션을 구현할 수 있는 라이브러리이다.

jdani

21. ZoomTransitioning

사진을 나열한후 줌 액션을 통해 이동애니메이션등을 깔끔하게 처리할 수 있는 라이브러리이다.

zoomtran

 

by 나숑 2017. 5. 15. 11:35