반응형

Flutter 로 ios 개발시에 TestFlight 환경을 사용해야 해서 몇번이나 업로드 했지만. 

 

결과는 완료됐다고 나왔는데 Apple Store Connect 페이지에서 보이지 않는 상황 발생 앱 빌드시간도 걸리고 업로드도 시간이 걸려서 

 

한참찾다가 알림을 꺼놓은 Apple 계정으로 수신된 메일 발견 

ITMS-90683: Missing purpose string in Info.plist

ITMS-90683: Missing purpose string in Info.plist - Your app’s code references one or more APIs that access sensitive user data, or the app has one or more entitlements that permit such access. The Info.plist file for the “Runner.app” bundle should contain a NSPhotoLibraryUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data. If you’re using external libraries or SDKs, they may reference APIs that require a purpose string. While your app might not use these APIs, a purpose string is still required. For details, visit: https://developer.apple.com/documentation/uikit/protecting_the_user_s_privacy/requesting_access_to_protected_resources.

Runner > info ( info.plist ) 를 열어서 Privacy - Local Network Usage Description

사용자의 민감정보 ( 위치 카메라 접근권한 )등 을 요구할때. 왜 요구하는지 Info.plist에 상세하게 써야하는 부분인데 이부분을 누락했다. 

Runner > info ( info.plist ) 를 열어서 Privacy - Local Network Usage Description 의 옵션을 선택 후 value 에는 

 

Location permission may be requested when using certain functions 를 넣어주었다.

Privacy - Local Network Usage Description 에는  Photo Library Access Warning 를 넣어주었다.

 

IDE로 처리할 경우  /ios/Runner/info.plist 파일에 

<key>NSPhotoLibraryUsageDescription</key>
<string>Photo Library Access Warning</string>
<key>NSLocalNetworkUsageDescription</key>
<string>Location permission may be requested when using certain functions.</string>

를 추가 

 

위치 정보 이외에 카메라 등등 권한을 필요할때도 같은 에러가 나는데 항목을 선택해서 넣어주면 된다 항목을 보는 방법은 

Privacy 검색

해당 항목 옆에 생기는 +를 누른위 텍스트를 입력해주면 자동완성이 되기때문에 수정이 쉽다!

반응형
반응형

개인적으로 또는 이전 글에서 

https://marvingood.tistory.com/51

을 사용해서 배포시, 배포가 안된다면 우선 개발자 계정으로 등록된 메일을 열어보세요 . 

 

Flutter ios 배포 TestFlight 배포 방법 가이드

Flutter ios 배포 TestFlight 배포 방법 가이드 Flutter ios 배포 TestFlight 배포 방법 가이드에 대해서 설명드리겠습니다. flutter 개발시 ios 배포시에는 여러가지 과정을 거쳐야 하는데요 TestFlight 같은경우

marvingood.tistory.com

한참 삽질하다가 배포가 실패 할 경우 Apple Store connect 에서 업로드가 안됐거나 반려가 됐다면 

제일 먼저 확인!! 메일부터

배포가 실패 할 경우 Apple Store connect 에서

라는 메일이 여러번 왔었는데 메일에 알람이 없어서 ㅡ.ㅡ 뒤늦게 발견 

ITMS-90683: Missing purpose string in Info.plist - Your app’s code references one or more APIs that access sensitive user data, or the app has one or more entitlements that permit such access.

 

해결 방법 : ITMS-90683[해결방법] ITMS-90683: Missing purpose string in Info.plist

 

ITMS-90683[해결방법] ITMS-90683: Missing purpose string in Info.plist

Flutter 로 ios 개발시에 TestFlight 환경을 사용해야 해서 몇번이나 업로드 했지만. 결과는 완료됐다고 나왔는데 Apple Store Connect 페이지에서 보이지 않는 상황 발생 앱 빌드시간도 걸리고 업로드도 시

marvingood.tistory.com

내용과 

ITMS-90078: Missing Push Notification Entitlement - Your app appears to register with the Apple Push Notification service, but the app signature's entitlements do not include the 'aps-environment' entitlement.

내용의 설정이 없어서 업로드가 반려된 내용으로 메일을 받았다.

각 에러를 해결하는 방법을 알아봐야겠다

반응형
반응형

Flutter ios 배포 TestFlight 배포 방법 가이드

Flutter ios 배포 TestFlight 배포 방법 가이드에 대해서 설명드리겠습니다.

 

flutter 개발시 ios 배포시에는 여러가지 과정을 거쳐야 하는데요 TestFlight 같은경우에는 배포 전  내부테스트와 외부 테스트에 이용 할 수 있습니다.

 

애플 앱스토어 센터 

https://appstoreconnect.apple.com/login

 

https://appstoreconnect.apple.com/login

 

appstoreconnect.apple.com

 

해당 사이트에 로그인을 한다 

로그인을 한 뒤 이동되는 페이지에서 [ 나의 앱 ] 선택 후 상단에 앱 + 버튼을 눌러 신규 앱 선택 , 

 

출시 할 apple 디바이스의 기기를 선택 한다 나의 경우는 ios ( 모바일 ) 만 TestFlight를 진행하기 때문에 ios 선택 

 

Flutter ios 배포 TestFlight 배포 방법 가이드

번들 아이디는 개발자 계정으로 설정된 번들아이디중 선택 가능 

 

완료 후 이동되는 페이지에서 TestFlight  를 선택 하고 내부 테스팅 +  선택 

Flutter ios 배포 TestFlight 배포 방법 가이드

내부테스팅을 누르면 그룹명을 설정할 수 있다.

내부 테스팅 사용자에 테스트에 참여할 사용사를 초대해야하는데 기존에 사용자가 프로젝트에 등록되어 있지 않으면 상단의 사용자 및 액세스를 통해서 사용자 등록을 해줘야 한다

Flutter ios 배포 TestFlight

사용자는 이메일로 추가하며 apple계정에 등록된 이메일로 초대를 보내야 사용자가 사용 가능함.

 

여기까지 세팅 애플 세팅 완료 

 

이제 xcode 를 사용해서 빌드버전 업로드를 진행해야 한다. 빌드파일은 flutter build 시 생성된 ios 디렉토리의  xcworkspace를  아래 xcode 사진의 제일 하단 open a project. or file 을 선택해서 열어주면 된다 . 

빌드의 방법은 IDE에서 run 누르면 생성되거나 , flutter 명령어로 flutter build ios를 terminal에 입력한다 .

Flutter ios 배포 TestFlight 배포 방법 가이드

프로젝트가 open이 완료 되었으면

Flutter ios 배포 TestFlight 배포 방법 가이드

아래 두가지를 세팅을 해줘야한다.

General에

1. Supported에 지원할 기기를 선택해 준다.

나는 처음에 ipad와 macos의 기본설정으로 업로드를 진행해서 ipad,macos의 에러로 실패 했다. 

( 각 디바이스에 맞는 아이콘이 없다는 이유 ) 아마 아이콘이 추가된다면 가능 할 것 같다.

 

2. Minimun deployments의 최소 ios의 지원 버전을 선택해 준다 이것도 그대로 11버전으로 유지 ( 개발중인 앱에 따라서 개인적으로 변경 ) 

 

3. identity 설정

앱 카테고리는 본인의 앱 목적에 맞게 설정해 줘야 하고. 

display-name은 위 애플 앱센터에 로그인 할때 만들었던 앱의 이름으로 똑같이 해주는게 편하다 

bundle identifier역시 . 애플 앱 페이지에서 설정했던 번들의 이름과 동일하게 설정을 해주고 

버전은 최초버전 1.0.0으로 해준다 

빌드는 1 디폴트 설정유지 . 이하 항목들은 기본으로 유지해준다.

 

두번째 탭인 Signing & Capabilities 설정을 해주어야 하는데 

 

1. Signing 

Automatically manage signing 체크 

Team 항목에 계정이 없으면 선택 뒤 add account 하고 계정 로그인하면 선택할수 있는 항목이 나온다 ( 본인은 개발자 계정으로 함 )

bundle identifier 동일하게 설정 .

 

2. 아래 항목들은 본인이 사용하는 애플 제공 서비스 항목에 따라 설정을 해주면 된다. 

 

Flutter ios 배포 TestFlight 배포 방법 가이드

설정 완료후 화면 상단 Product. 탭 클릭 -> Destination 후 빌드에 Any Ios Device를 선택해 준다 

Flutter ios 배포 TestFlight 배포 방법 가이드

다음 같은 Product탭에서 Archive 선택시 빌드가 실행된다. 빌드의 진행 상황은 상단 로딩탭에 작게 표시된다 

빌드가 완료된다면

빌드의 진행 상황은 상단 로딩탭
빌드 완료시 팝업

빌드 완료 다음 단계 진행 팝업이 뜨는데 이때 우선 우측의 Validate App 선택후 쭉쭉 진행 기본적으로 기본 체크되어있는 항목 그대로 진행하면 된다.

 

특이사항 또는 앱 이름이 다를경우 변경해서 진행.

 

무사히 Validate App 이 완료됐으면 해당 버튼 위 Distribute App 진행. 과정에서 아까 애플 앱 사이트에 빌드 버전이 배포되게 된다. 

 

빌드 완료시. TestFlight에 들어가 테스팅 유저에게 배포하면 끝 !

반응형
반응형

Automatically assigning platform `iOS` with version `11.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile

 

flutter  ios 개발시에 해당 오류를 겪는 상황이 생긴다 

Automatically assigning platform `iOS` with version `11.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile

 

나의 경우는 firebase의 dynamic link 세팅중 android는 잘 됐지만 아이폰에서 빌드시 에러가 났다.

 

인터넷에 많이 나와있는 해결방법인. 

 

/ios/Podfile 위치에 있는 파일의 내용을 수정하는 방법이 자주 나와있었는데 해방 방법은 아래와 같다

 

제일 상단

# Uncomment this line to define a global platform for your project
# platform :ios, '11.0'

 

이렇게 된 곳이 있다. 해당 부분에서

# platform :ios, '11.0'

 ->

platform :ios, '11.0'

이렇게 주석을 해제하는 방법이었는데 나에게는 해당 방법이 적용되지 않았다.

 

 

두번째 방법으론  위 방법을 적용 한 상태에서 아래에 있는 

target 'RunnerTests' do
  inherit! :search_paths
end

이부분을 주석처리를 따로 해주는 것이었는데. 테스트 해주는 부분으로 

해당 부분을 주석처리 해주었다.

 

#   target 'RunnerTests' do
#     inherit! :search_paths
#   end

하지만 이 경우에도 에러가 발생했기 때문에 다른 해결책이 필요했다.

 

에러 발생 로그창 잘 읽어보면 마지막에

Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

Error running pod install
Error launching application on iPhone 14 Pro.

해당 문구가 뜬다.  처음부터 가이드를 읽을껄.. pod repo update 명령어부터 먼저 실행!

오 업데이트 진행 후 정상 진행 앱이 실행됐는데 

 

이때 1,2번에서 실행했던 내용을 복구 한뒤 pod repo update  만 된 상태로 실행

 

잘된다.

 

에러를 먼저 읽고 flutter doctor에서 제시하는 방법을 먼저 써야겠다.. 읽지도 않고 찾아보다 발생한 시간 허비 

 

Automatically assigning platform `iOS` with version `11.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile 완료

반응형
반응형

Firebase Dynamic link 세팅 (1)

 

Firebase Dynamic link 세팅 (1)

새로 개발하는 앱에 , 컨텐츠 공유 기능이 필요하게 됐는데 이 기능을 위해선 공유하기 -> 공유 -> 링크선택 순서로 진행 후 앱이 설치되어 있으면 앱을 연 후 공유된 컨텐츠로 이동 , 위 방법 진

marvingood.tistory.com

 에서 한 내용 

1. flutter firebase 연동

2. firebase dynamick link 세팅

을 진행했다 이어서 이번편에서는 

1. ios, android 세팅

2 링크 연결 공유

를 목표로 잡고 진행함

 

A. Android

  • flutter. 앱에 firebase_dynamic_links 패키지를 설치 한다
flutter pub add firebase_dynamic_links
  • 프로젝트 폴더의 /android/app/src/main/AndroidManifest.xml 파일에 설정 값 작성
<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

deeplink 수신 방법과 동일 example.com 위치에는 Firebase Dynamic link 세팅 (1) 에서 작성한 domain을 넣어주면 된다 

 

B-1. ios xcode 사용

  • Xcode 앱을 연후 TARGETS 헤더에서 앱을 연다.
  • 서명 및 기능 페이지에서 팀이 등록되어 있고 프로비저닝 프로필이 설정되어 있는지 확인
  • 서명 및 기능 페이지에서 연결된 도메인을 사용 설정하고 연결된 도메인 목록에 다음을 추가
applinks:example.page.link

뒤 example.page.link 는 내가 설정한 도메인으로 등록 

  • 정보 페이지에서 프로젝트에 URL 유형을 추가합니다. URL 스키마 필드를 앱의 번들 ID로 설정
  • Firebase 프로젝트의 커스텀 도메인을 설정한 경우 FirebaseDynamicLinksCustomDomains 키를 사용하여 iOS 프로젝트의 Info.plist 파일에 동적 링크 URL 프리픽스를 추가
<?xml version="1.0" encoding="UTF-8"?>
http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
    <string>https://custom.domain.io/path1</string>
    <string>https://custom.domain.io/path2</string>
</array>

...other settings

</dict>
</plist>

B-2. ios 플루터 ( IDE ) 사용시

 

ios/Runner/Runner.entitlements 파일오픈 후 

    <?xml version="1.0" encoding="UTF-8"?>
    http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>applinks:example.app</string>
    </array>
</dict>
</plist>

아래 코드 입력 여기서 example.app은 설정한 도메인으로 변경 해주면 된다.

 

만약 도메인을 무료제공이 아닌 커스텀을 등록했다면 ios/Runner/Info.plist 아래에 이와같이 추가 

<key>FirebaseDynamicLinksCustomDomains</key>
<array>
   https://example.app/share
</array>

세팅이 완료 되었다면 

Future<String> share(String screenName, String id) async {
  String dynamicLinkPrefix = 'https://{도메인}/{prefix를 설정했을 경우 여기 세팅 }';
  final dynamicLinkParams = DynamicLinkParameters(
    uriPrefix: dynamicLinkPrefix,
    link: Uri.parse('$dynamicLinkPrefix/$screenName?id=$id'),
    androidParameters: const AndroidParameters(
      packageName: '앱의 패키지명',
      minimumVersion: 0,
    ),
    iosParameters: const IOSParameters(
      bundleId: '앱의 패키지명',
      minimumVersion: '0',
    ),
  );
  final dynamicLink =
      await FirebaseDynamicLinks.instance.buildShortLink(dynamicLinkParams);

  return dynamicLink.shortUrl.toString();
}

위와같은 함수를 세팅해준다  링크를 log, print로 찍어보면 생성된 링크가 나오는데 

해당 링크를 url 접속을 하면 안나오고 

모바일 기기에서 붙여넣기나 브라우저로 실행하면 된다.

반응형
반응형

새로 개발하는 앱에 , 컨텐츠 공유 기능이 필요하게 됐는데 이 기능을 위해선 

공유하기 -> 공유 -> 링크선택 순서로 진행 후 앱이 설치되어 있으면 앱을 연 후 공유된 컨텐츠로 이동 , 

위 방법 진행중 앱이 설치되어 있지 않으면 안드로이드 마켓, 아이폰 앱 스토어로 이동 후 다운받게 하는 링크가 필요 했다. 

 

링크 공유 후 해당 링크는 앱이 없으면 스토어에서 다운받게 유도를 시켜야 하는 기능이었는데. 

이 과정에서 Firebase Dynamic link 를 세팅해서 사용하기로 했다. 

 

하지만 2025.08.28일을 마지막으로 기존 링크들도 모두 서비스가 종료되는데. 

 

1. 웹페이지 오픈 후 웹에서 앱 설치여부 판단 후 없을경우 스토어 이동 있을경우 오픈 

2. Firebase Dynamic link  그대로 사용 

두 방법중 고민하는중 앱은 이벤트 성으로 종료일이 2025.08.25일까지 유지 가능성? 이 없을것 같아 그대로 사용하기로 한다.

 

Firebase Dynamic link 종료 예정 공지

세팅 진행 순서 ( mac os ) 

A. dynamic lick를 사용하기 위해 flutter app을 firebase에 등록하기  

 

      1. node 16.13.0 버전 이상을 필요로 하며 노드사용자가 아닐 경우 https://firebase.google.com/docs/cli?hl=ko#mac-linux-npm 를 사용

 

firebase-tools 설치

       2. android / ios 별 설치후  flutterfire_cli 설치 

           IOS : https://firebase.google.com/docs/flutter/setup?platform=ios&source=post_page-----ce41cb9baf2c--------------------------------&hl=ko 

 

Flutter 앱에 Firebase 추가

의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Flutter 앱에 Firebase 추가 plat_ios plat_android plat_web iOS+ Android 웹 기본 요건 아직 Flutter 앱이 없다면

firebase.google.com

    android: https://firebase.google.com/docs/flutter/setup?platform=android&source=post_page-----ce41cb9baf2c--------------------------------&hl=ko

 

Flutter 앱에 Firebase 추가

의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Flutter 앱에 Firebase 추가 plat_ios plat_android plat_web iOS+ Android 웹 기본 요건 아직 Flutter 앱이 없다면

firebase.google.com

  위 방법대로 설치. flutterfire command not found 오류가 난다면 아래 방법 으로 bin 등록 

  1. Run vim ~/.zshrc
  2. Press i
  3. Paste export PATH="$PATH":"$HOME/.pub-cache/bin"
  4. Press esc
  5. Type :wq! and press enter
  6. Restart the terminal

세팅이 완료되면 관련된 플러그인들을 사용 할 수 있다.

firebase 플러그인 목록

 

1. 위 화면에서 계속하기를 누르면 url 프리픽스 추가 팝업  계속하기 클릭

2. 프리픽스 추가를 누르면 기본으로 제공되는 도메인이 있고 , 커스텀 도메인을 사용 할 수 있다. (아래 커스텀 도메인 세팅 방법 공유 ) 

Firebase Dynamic link 도메인 세팅

도메인을 설정하고 앱 prefix를 정해주고 완료를 누르면 초기 세팅 완료

 

 

다음편은 Firebase Dynamic link 세팅(2)

 

반응형

+ Recent posts