본문 바로가기

Javascript/ReactNative

React-Native IOS 배포 과정 정리

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&apos;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&apos;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