Xcode에서 독립적 인 런타임 설정 세트를 구성하는 방법
내 iPhone 애플리케이션은 프로덕션 , 스테이징 및 테스트 와 같은 세 가지 서버에 연결됩니다 . 연결하는 서버에 따라 애플리케이션이 사용하는 구성 값 (예 : Facebook App ID, TestFlight 팀 키 등)이 많이 있습니다.
GIT의 모든 설정을 가지고 컴파일하거나 릴리스 할 때 응용 프로그램에서 사용할 구성 만 선택하고 싶습니다. 예를 들어, 테스트가 선택되어, 제품 -> 실행 엑스 코드는에 연결하는 응용 프로그램의 디버그 버전 실행 테스트를 하고, 제품 -> 아카이브는 또한 연결하는 릴리스 버전으로 IPA 파일 생성 테스트를 .
디버그 및 릴리스보다 빌드 구성을 더 많이 만들고 싶지 않습니다 (빌드 구성 / 런타임 구성의 6 가지 조합을 의미하기 때문입니다). 내가보기에 이상적인 솔루션은 프로덕션 , 테스트 및 스테이징 의 세 가지 구성표가 있고 각 구성표는 응용 프로그램과 함께 사용할 세 가지 Info.plist 파일 중 하나를 선택하는 것입니다. 이를 통해 다른 런타임 설정을 정의 할뿐만 아니라 백엔드 서버에 따라 다른 애플리케이션 버전이나 번들 식별자도 정의 할 수 있습니다. 그러나 다른 빌드 구성을 선택하는 것 외에는 다른 방법으로 아카이브 작업을 구성 할 수없는 것 같습니다. 어떤 식 으로든 달성 할 수있는 아이디어가 있습니까?
편집 : 좀 더 명확하게하기 위해 프로덕션 / 스테이징 / 테스트 는 iOS 애플리케이션 버전이 아니라 백엔드 서버입니다. iOS 앱은 debug / release의 두 가지 버전으로 제공됩니다 . 즉 , 예를 들어 해당 서버에서 반환 된 JSON으로 인한 충돌을 디버깅하기 위해 프로덕션 서버에 연결하는 애플리케이션 의 디버그 버전 을 실행하고 싶을 수 있습니다 . 명확성을 위해 서버 이름을 A, B 및 C로 지정할 수 있습니다.
각 환경에 대해 다른 빌드 대상을 사용하는 것이 좋습니다. 이전에이 모델을 성공적으로 사용했습니다. 프로젝트 설정에서 현재 대상을 복제하고 필요에 따라 빌드 설정을 변경할 수 있습니다. Info.plist File
해당 대상에 대한 기본 plist를 변경할 수 있는 속성이 있습니다.
그런 다음 해당 대상을 사용할 각 환경에 대한 체계를 만들 수 있습니다.
한 단계 더 나아가 각 대상 및 다른 이름에 대해 다른 번들 ID를 사용할 수 있습니다. 예를 들어 동일한 장치에 스테이징 및 프로덕션 빌드를 모두 설치할 수 있습니다.
유일한 단점은 프로비저닝 프로파일을 업데이트 할 때 더 많은 작업이 필요하다는 것입니다.
이를위한 좋은 방법은 빌드 구성과 C 매크로를 사용하는 것입니다. 이렇게하면 실제로 대상을 올바르게 사용하지 않는 모든 구성에 대해 별도의 대상을 만들 필요가 없습니다.
먼저 프로젝트 수준에서 구성을 설정하려고합니다.
디버깅, 엔터프라이즈 배포 및 원하는 기타 유형의 특수 빌드에 대해 서로 다른 구성을 만들 수 있습니다.
다음으로 컴파일러에 전달 될 각 구성에 대해 몇 가지 매크로 플래그를 정의 할 수 있습니다. 그런 다음 컴파일 타임에 이러한 플래그를 확인할 수 있습니다. 대상 수준에서 "전 처리기 플래그"빌드 설정을 찾습니다.
삼각형을 확장하면 각 구성에 대해 다른 값을 정의 할 수 있습니다. 여기서 KEY=VALUE
또는 KEY
매크로 만 정의 할 수 있습니다 .
코드에서 이러한 매크로의 존재 여부 또는 값 (있는 경우)을 확인할 수 있습니다. 예를 들면 :
#ifdef DISABLE_FEATURE_X
featureXButton.hidden = YES;
#endif
// ...
#if FOOBAR_VISIBLE == 0
foobarView.hidden = YES;
#elif FOOBAR_VISIBLE == 1
foorbarView.hidden = NO;
#else
#error Invalid value for FOOBAR_VISIBLE
#endif
빌드 설정에서 작은 따옴표로 묶어야하는 문자열 값도 전달할 수 있습니다 (예 : DEFAULT_LOCALIZATION_NAME='@"en"'
.
Schemes 편집기를 사용하여 디버그 및 아카이브 시간 동안 사용되는 구성을 구성 할 수도 있습니다. 스키마 편집기에서 "실행"또는 "아카이브"를 선택하면 적절한 구성을 선택할 수 있습니다.
If you need to parameterize entries in the Info.plist file, you can define their value using a custom build setting. Add a custom build setting for your target:
And then give it an appropriate value for your different configurations:
Then in the Info.plist file you can reference this setting:
Note that the one limitation of this approach is that you cannot change the following items:
- Settings.bundle
Additionally, in older versions of Xcode without asset catalog support, you cannot change the following items:
- Icon.png
- Default.png
These cannot be explicitly defined in the Info.plist file or anywhere else, which means you need different targets to change them.
Hope this helps.
Here's a much easier solution if the concerned libs allow to set the keys in code, meaning that you can have production value in your plist file, but change them in your AppDelegate (or whichever file they are first used in).
Works with facebook, twitter and google sdk at the moment.
Ex:
#ifdef DEBUG
// Facebook
[FBSettings setDefaultAppID:@"SandboxID"];
// Fabric / TwitterKit - must be called above [Fabric with:@[TwitterKit]];
[[Twitter sharedInstance] startWithConsumerKey:@"SandboxKey" consumerSecret:@"SandboxIDSecret"];
#endif
Same in Swift, just use #if instead of #ifdef.
Note about Facebook This worked with version 3 of their SDK, I'm not sure it's possible with later versions.
It is probably very low tech but I just have a method called apiURL()
that returns the URL of the API I want. I have localhost, stage, and production and I simply uncomment the one I want. It's worked well for me so far. I've only forgotten to switch it back a few times. Oops.
'programing' 카테고리의 다른 글
Mac에서 Eclipse -clean을 실행하는 방법은 무엇입니까? (0) | 2020.12.15 |
---|---|
Python 하위 프로세스 와일드 카드 사용 (0) | 2020.12.15 |
프로그래밍 방식으로 SwipeRefreshLayout 트리거 (0) | 2020.12.14 |
DataTables : 정의되지 않은 'length'속성을 읽을 수 없습니다. (0) | 2020.12.14 |
Selenium 웹 드라이버 및 Java. (0) | 2020.12.14 |