Release IOS 하기 전 설정
- Info.plist에서 설정과 버전을 맞추기 (react native 버전마다 코드가 다를수도 있음 주의)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>TEST</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>es</string>
<string>ko</string>
<string>ja</string>
<string>zh</string>
</array>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.2.4</string> /// 배포될 어플 버전
<key>CFBundleVersion</key>
<string>1.2.4</string> /// 배포될 어플 버전
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
// 해당 dict가 열리고 닫힐 때 까지의 코드 ->
// 애플 정책 상 https만 허용 / http를 사용하 려고 할 시 필수 입력
// 애플은 ssl에 민감한 정책을 가지고 있다고 함
// https에 제대로 된 ssl이 아닐시 사용 x / domain 아이피 형식일 경우도 안되는 듯
// 통신 할 api 의 url을 제대로 설정해줘야 사용 가능
// request도 보내지지 않는 경우가 이에 해당
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>https://test.test.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSRequiresCertificateTransparency</key>
<false/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<key>test.test.com</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSRequiresCertificateTransparency</key>
<false/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
</dict>
</dict>
// 어플에서 필요한 권한 을 받을 시 밑에 자세한 설명을 써야
// 새벽에 어플이 심사에서 리젝당하는 경험을 피할 가능성이 낮아진다
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) would like access to your photo gallery to provide QR code service.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) would like to use your GPS to provide nearby shopping malls based on customer location information.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) would like to use your GPS to provide nearby shopping malls based on customer location information.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) would like to use your GPS to provide nearby shopping malls based on customer location information.</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) would like to use your microphone (for videos)</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) would like to save photos to your photo gallery to provide customer service's submit a picture service</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) would like to save photos to your photo gallery to provide customer service's submit a picture service</string>
<key>UIAppFonts</key>
<array>
<string>Fonts/Merriweather-Regular.ttf</string>
<string>Fonts/Roboto-Regular.ttf</string>
<string>Fonts/Roboto-Bold.ttf</string>
<string>Fonts/Roboto-Light.ttf</string>
<string>Fonts/Roboto-Medium.ttf</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
```
배포용 Release버전 빌드 과정
xcode - product - schema - edit schema - run - info tap - build configuration의 설정을 debug에서 release로 변경
실제 기기에서 빌드 시 release 버전으로 빌드 됨 --
실 기기에 release버전으로 어플 빌드 시 xcode - product - archive 메뉴가 활성화 됨 (실 기기에서 빌드시에만 활성화)
(
테스트폰이 있지 않은 이상 함부로 자신의 아이폰을 베타버전으로 업그레이드 하지 말자
업그레이드시 xcode에서 인식을 못하기에 테스트폰을 구하거나
주말인데 당장 재심사 요청을 해야 한다면 회사를 다시 가서 테스트폰을 가져와야하는 불상사 발생 -- 경험담
)
archive 진행 후 어플을 바로 appStore에 올릴 지 IPA파일로 뽑을 지 정할 수 있음
난독화가 필요없고 바로 appStore에 올릴 시 export없이 진행하면 됨
if(파일을 난독화를 해야 하는 경우 || IPA를 뽑아 빠르게 QA팀의 폰등에 깔아 테스트를 진행해야 하는 경우)
-> IPA 뽑은 후 apple configuration2 프로그램 다운 받기 (사용해본 것 중에 가장 빠르고 가장 직관적임) -> 아이폰 선 연결시 apple configuration2 화면에 바로 뜸 -> IPA파일 끌어다가 놓으면 자동 설치 -> (만약 설치가 안된다면 ipa의 재서명 과정이 잘못됐는지 다시 한번 자세히 살펴보자)
재서명 과정
- unzip "$ipaPath"
- Payload 파일 생성
- rm -rf "Payload/$name.app/_CodeSignature/"
- 이미 있던 서명 제거
- cp $mobileprovision_file_path "Payload/$name.app/embedded.mobileprovision"
- ipa 뽑을 시 생성된 mobileprovision 파일 복사 (확실 치 않음)
- codesign -d --entitlements entitlements.xml "Payload/$name.app/$name"
- codesign --entitlements entitlements.xml -v -f -s "$developer_name" "Payload/$name.app"
- 해당 ipa 뽑을시 인증서 서명 (정확한 개발자 서명 // 찾고 있음)
- zip -qr $name-resigned.ipa Payload/ Symbols/
- 다시 압축
앱 스토어 등록
- 등록시 전버전과 해당버전 체크 필수
- xcode에서 바로 등록시 apple 배포 빌드 에 최소 5~15분 정도후에 나타남
- 보통 한국 시간으로 새벽에 심사가 진행 됨
- 심사 시 여러가지의 이유로 리젝 당함
- 하는 사람마다 전버전에선 넘어갔던 이유도 리젝의 이유가 될 수 있음
- 위치 정보를 왜 사용하냐고 리젝 → 위치 정보를 기반으로 근처 쇼핑몰를 추천하는 서비스를 제공 중이기에 사용한다고 답변 → 심사 다시 진행 후 통과
- 각 권한 별로 description이 없다고 리젝 → Info.plist → <key>NSCameraUsageDescription</key> <key>NSLocationAlwaysUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key> → 모든 기능들의 permission 에 설명 코드 추가 후 재 심사 요청 (답변이 아니라 코드 수정이라 재 심사) → 다음날 새벽에 심사 진행 후 통과
- 하는 사람마다 전버전에선 넘어갔던 이유도 리젝의 이유가 될 수 있음
- 개인이나 팀프로젝트의 경우 다음날 답변해도 되지만 회사의 경우 해당 담당자가 새벽에 즉각 처리를 해야하기에 매우 피곤함
'Javascript > ReactNative' 카테고리의 다른 글
React-Native Android 배포 과정 정리 (0) | 2021.03.28 |
---|