블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
03-29 00:00

AppIconChangerUnity
https://github.com/kyubuns/AppIconChangerUnity

Change the app icon dynamically in Unity
Support for new icon formats in Xcode13
-> This means that A/B Test on AppStore is also supported.


- iOS only, require iOS 10.3 or later



## Instructions
- Import by PackageManager `https://github.com/kyubuns/AppIconChangerUnity.git?path=Assets/AppIconChanger`
- (Optional) You can import a demo scene on PackageManager.




## Quickstart

- Create `AppIconChanger > AlternateIcon` from the context menu




- Set the name and icon





- The following methods are available




## Tips


### What is the best size for the app icon?

When the Type of `AlternateIcon` is set to Auto Generate, the icon will be automatically resized at build time, so there is nothing to worry about. (The maximum size is 1024px.)
If you want to control it in detail, you can change the Type to Manual.





## Requirements
- Unity 2020.3 or higher.
- Xcode 13 or higher.



## License
MIT License (see LICENSE)

 

 

[출처] https://forum.unity.com/threads/appiconchangerunity-change-the-app-icon-dynamically-in-unity-ios-only.1245787/

 

AppIconChangerUnity - Change the app icon dynamically in Unity (iOS only)

AppIconChangerUnity https://github.com/kyubuns/AppIconChangerUnity Change the app icon dynamically in Unity Support for new icon formats in Xcode13 ->...

forum.unity.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.36f1

Xcode 15.3

----

 

[결론] 

Privacy Manifest 관련 대응 버전은 Unity 2023.2.13, 2022.3.21, 2021.3.36 이라고 한다.(메이저 버전별 해당 버전이후로 업데이트 필요)

위에 적힌 버전 이상 설치 돼 있으면, iOS 빌드를 할 때 알아서 PrivacyInfo.xcprivacy를 생성해 준다고 한다.

Unity 2021.3.36f1으로 iOS 빌드했는데, PrivacyInfo.xcprivacy도 추가돼있고, 내용도 제대로 들어있는 걸 확인했다.(필요한 거 확인해서 알아서 넣어준다고 어디선가 적힌걸 본 것 같은데..)

Unity 2021.3.36f1으로 iOS 빌드하면 PrivacyInfo.xcprivacy가 자동 생성된다.

 

쉽게 해결하려면 엔진 버전업 하자.

 

SDK 등 Third Party 플러그인들은 해당 Third Party에서 업데이트 대응해줘야 되는거니 내가 뭔가 할 건 없는 것 같다.

 

P.s. 

수동으로 작업하려면 PolicyInfo.xcprivacy 파일을 생성해서 수정하고, ../Assets/Plugins 폴더에 파일을 넣어두면 된다는데..

버전업하면 자동으로 처리되는데 굳이 수작업 할 일이 있을까 싶다.

 

[참조] https://forum.unity.com/threads/apple-privacy-manifest-updates-for-unity-engine.1529026/

 

Official - Apple privacy manifest updates for Unity Engine

Introduction At WWDC 2023 Apple announced a number of additions to its privacy program, including the introduction of Privacy Manifests. Since then,...

forum.unity.com

 

----

[링크1] [Unity] Apple Privacy Manifest 대응

 

[Unity] Apple Privacy Manifest 대응

안녕하세요. Apple이 공개한 Privacy Manifest를 반드시 포함해야 하는 SDK 목록 중에 UnityFramework가 있었고 이번에 Unity에서 공식적인 입장과 가이드를 공개했어요. https://forum.unity.com/threads/apple-privacy-man

phillip5094.tistory.com

 

[링크2] 개인정보 보호 매니페스트 및 서명을 필요로 하는 SDK

 

개인정보 보호 매니페스트 및 서명을 필요로 하는 SDK

안녕하세요. 이전에 Privacy manifest에 대해서 공부했는데요. [WWDC23] Get started with privacy manifests 안녕하세요. 이번엔 WWDC23 'Get started with privacy manifests' 세션을 보고 내용 정리해 볼게요. #개요 앱 사용

phillip5094.tistory.com

 

 

[참조] 【Xcode/iOS】Privacy Manifests에 대응하는 방법! PrivacyInfo.xcprivacy란?

 

Webエンジニア学習部屋

駆け出しwebエンジニアのあめの学習記録webサイトです。WordPressなどのCMSを使わずに自分でHTMLファイルやphpファイルを作成しサーバーにアップしています。プログラミングで悩んだポイントや

appdev-room.com

 

 

 

 

반응형
Posted by blueasa
, |

Unity 2021.3.35f1

GoogleMobileAds 8.7.0

----

 

 

GDPR 동의 로직 추가하고 iOS 검수 넣었더니 리젝 됐다.

사유는 대충 정리하면,

GDPR 팝업에서 '거부'를 했는데, 같은 이슈인 'IDFA(AppTrackingTransparency)' 동의 여부를 다시 묻는 건 문제다.

라는 말이었습니다.

 

이전엔 GoogleMobileAds에서 제대로 처리안해줘서 같은 이슈 (아래 링크 참고) 가 있었던 것 같은데, 현재 최신 버전에서는 수정된걸로 보인다.

[참고] https://groups.google.com/g/google-admob-ads-sdk/c/huUa7eyMTEE

 

URGENT: Apple App Rejected - UMP SDK Using both GDPR & IDFA/ATT Causing Rejection

Hi Justin, thank you for the update and for your work to get this resolved! Unfortunately, the "short term recommendation" provided would be a significant ad revenue impact, and so it is not viable. We do need to call requestConsentInfoUpdate to get the I

groups.google.com

 

아무튼,

나의 경우는 GDPR은 GoogleMobileAds를 사용하고, IDFA 관련은 다른 SDK에서 처리하고 있어서 유기적으로 제어되지 않고 있었다.

 

GoogleMobileAds-UMP를 확인해보니,

IDFA(App Tracking Transparency) 관련 처리도 GoogleMobileAds에서 같이해주면 GDPR과 IDFA(ATT) 동의를 알아서 유기적으로 처리해준다.

 

GDPR 로직을 추가하고, IDFA 관련 Admob 설정을 추가(소스 로직 추가는 없음)하고, 테스트 해보니 아래와 같은 형태로 진행된다.

(로직상으로는 GDPR 관련 체크 로직만 있다. GDPR 체크 후에 필요하면 IDFA 로직을 알아서 타는 것 같다.)

 

GDPR 관련 설정은 아래 링크를 참고하자.

[링크] [GoogleMobileAds] Unity-Google-UMP-Check(GDPR)

 

[GoogleMobileAds] Unity-Google-UMP-Check(GDPR)

2024년 1월 16일까지(참조:https://support.google.com/admob/answer/14189727?hl=ko) Admob을 사용하려면 유저에게 GDPR 동의를 받으라고 하는 것 같다. 그래서 Google에서 관련 SDK를 내놓은게 UMP(User Messaging Platform) SDK

blueasa.tistory.com

 

[GDPR/IDFA 활성화 시, 진행 Flow]

1) EEA(European Economic Area, 유럽 경제 지역) 경우

    1-1) GDPR 팝업 Open

            1-1-1) GDPR 동의 시 -> ATT 동의 팝업 Open

            1-1-2) GDPR 비동의 시 -> ATT 동의 팝업 Skip(뜨지 않음)

 

2) EEA(European Economic Area, 유럽 경제 지역)가 아닌 경우

    2-1) IDFA 메시지 (안내) 팝업 Open

    2-2) ATT(App Tracking Transparency) 동의 팝업 Open

 

애플 검수 과정에서 요구하는 사항인 GDPR을 거부했을 때, IDFA 동의 팝업이 뜨지 않아야 된다는 조건에 만족하고 있다.

 

[결론]

GoogleMobileAds-UMP로 GDPR과 IDFA를 처리하면 심플하게 유기적으로 처리 가능하다.

적극 활용하자.

 

 

[참조] https://docs.adxcorp.kr/appendix/ump-user-messaging-platform#2.-idfa

 

UMP (User Messaging Platform) - ADX Library

IDFA 메시지 작성은 선택사항이지만, GDPR 메시지 사용 설정을 할 경우, IDFA 메시지 작성도 같이 작성하십시오. 애드몹 UMP의 GDPR 동의 화면이 보이는 상태에서, 프로그래밍 방식으로 수동으로 ATT (AP

docs.adxcorp.kr

[참조] https://docs.adxcorp.kr/ios/supporting-ios-14/app-tracking-transparency

 

App Tracking Transparency - ADX Library

애드몹 UMP (User Messaging Platform)의 IDFA 메시지 기능 활성화 시, 특별한 프로그래밍 코딩을 하지 않아도, UMP 내부에서 자동으로 ATT 동의 알림 요청 기능을 수행하므로, 이 단계(Step4)와 다음 단계 (Step

docs.adxcorp.kr

 

반응형
Posted by blueasa
, |

 

[iOS] https://www.eyes.co.kr/mohae/mohae_view/547

 

아이즈모바일

아이폰 쓰는 사람 중에 인앱 광고 특히 게임 같은 거 할 때 저처럼 인앱 광고 많이 나와서 하기 싫은 사람들 있을 거예요 저는 아이가 좋아하는 무한의 계단이나 애니팡하는데 두세 판마다 인앱

www.eyes.co.kr

 

[Android] https://m.enuri.com/knowcom/detail.jsp?kbno=1335653&bbsname=nuri 

 

안드로이드폰 광고차단 꿀팁(옆동네발) - 에누리 쇼핑지식 자유게시판

에누리 자유게시판 - [안드로이드9버전 부터 가능] '설정 - 연결 - 기타연결설정' 들어가시면 프라이빗 DNS (혹은 비공개 DNS)가 있습니다. 여기에 'dns.adguard.com' 추가하시면

m.enuri.com

 

 
반응형
Posted by blueasa
, |

[링크] https://github.com/agens-no/iMessageStickerUnity

 

GitHub - agens-no/iMessageStickerUnity: An iMessage Sticker plugin for Unity3d that adds a Sticker extension target to an xCode

An iMessage Sticker plugin for Unity3d that adds a Sticker extension target to an xCode project created by Unity3d - GitHub - agens-no/iMessageStickerUnity: An iMessage Sticker plugin for Unity3d t...

github.com

 

 

반응형
Posted by blueasa
, |

[Crash 내용]

com.apple.root.default-qos SIGABRT ABORT 0x00000001e01bf4c4

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

 

오랜만에 iOS 빌드하는 프로젝트에서 빌드는 잘되는데 실행하니 일부 아이폰에서 위와 같은 크래시레포트를 뱉으면서 앱이 죽는다.

찾아보니 권한을 사용하려는데 Privacy Description이 없어서 죽는 것 같다.

이번에 내 경우는 NSUserTrackingUsageDescription 였는데,

어떤 Privacy Description이 없어서 크래시가 나는지는 본인이 체크하고 추가해줘야 될 것 같다.

 

 

[참조]

https://walkthinksleep.tistory.com/entry/Crashed-comapplerootdefaultqos-%EC%9D%B4%EC%8A%88

 

iOS, Crashed: com.apple.root.default-qos 이슈

crashed 1 times in __TCCAccessRequest_block_invoke.85! 라고 연락(?)이 왔고,Crashed: com.apple.root.default-qos 라고 Fabric이 얘기해줬다. 구글링을 해보면 주로 privacy에 관련된 내용이 생길때 나타나는 에러 같았다.

walkthinksleep.tistory.com

 

반응형
Posted by blueasa
, |

[링크] https://cjh94.tistory.com/3

 

[ios]codesign이 변경하려고 합니다. 허용하려면 관리자 이름 및 암호를 입력하십시오.

새로운 프로젝트와 키체인을 받아서 작업 완료 후에 TestFlight에 올리려고 하니 발생했던 상황 빌드 파일마다 암호를 요청하고 보통 이런 경우 해결 방법은 비밀번호를 누르고. 허용이 아닌 항상

cjh94.tistory.com

 

 

반응형
Posted by blueasa
, |

Unity 2021.3.16f1

Xcode 14.2

Firebase 10.4.0

----

 

[빌드 에러]

pod install output:



Analyzing dependencies

[!] CocoaPods could not find compatible versions for pod "GTMSessionFetcher/Core":

  In Podfile:

    Firebase/Auth (= 10.6.0) was resolved to 10.6.0, which depends on

      FirebaseAuth (~> 10.6.0) was resolved to 10.6.0, which depends on

        GTMSessionFetcher/Core (< 4.0, >= 2.1)



    GoogleSignIn (= 6.0.2) was resolved to 6.0.2, which depends on

      GTMAppAuth (~> 1.0) was resolved to 1.3.1, which depends on

        GTMSessionFetcher/Core (< 3.0, >= 1.5)



    GoogleSignIn (= 6.0.2) was resolved to 6.0.2, which depends on

      GTMSessionFetcher/Core (~> 1.1)

 

Firebase 10.6.0이 업데이트 돼서 다시 한 번 iOS 빌드를 시도해 봤는데 여전히 에러가 난다.

(참조 : https://blueasa.tistory.com/2706)

 

[XCode] [!] Cocoapods could not find compatible versions for pod "GTMSessionFetcher/Core"

Unity 2021.3.16f1 Xcode 14.2 Firebase 10.4.0 ---- [빌드에러] pod install output: Analyzing dependencies [!] CocoaPods could not find compatible versions for pod "GTMSessionFetcher/Core": In Podfile: Firebase/Auth (= 10.4.0) was resolved to 10.4.0, whic

blueasa.tistory.com

 

그래도 다시 이리저리 검색해보다보니 해결했다는 글이 아래와 같이 있다.

UnayOzan commented on Feb 5
Fixed this error with changing the version in "GoogleSignIn.podspec.json" file.

Firebase/Auth (= 10.4.0) was resolved to 10.4.0, which depends on
FirebaseAuth (~> 10.4.0) was resolved to 10.4.0, which depends on
GTMSessionFetcher/Core (< 4.0, >= 2.1)

GoogleSignIn (~> **5.0.2**) was resolved to **5.0.2**, which depends on
  GTMSessionFetcher/Core (~> **1.1**)
I found the file in {user}.cocoapods/repos/cocoapods/Specs and then just search for "GoogleSignIn.podspec.json".
Find the folder with the same version with the error, in my case 5.0.2.
And then change its dependencies with the version 7.0.0 or something that works with the other packages.
In my project the solution was this;

 "dependencies": {
    "AppAuth": [
      "~> 1.5"
    ],
    "GTMAppAuth": [
      ">= 1.3",
      "< 3.0"
    ],
    "GTMSessionFetcher/Core": [
      ">= 1.1",
      "< 4.0"
    ]
After that I exited Xcode, deintagrated pods, cleaned cache and installed it again.
Everything works fine now.

[링크] https://github.com/firebase/firebase-unity-sdk/issues/621

 

[Bug] FirebaseAuth and GoogleSignIn iOS Build failure · Issue #621 · firebase/firebase-unity-sdk

[REQUIRED] Please fill in the following fields: Unity editor version: 2021.3.17f1 Firebase Unity SDK version: 10.4.0 Source you installed the SDK: .unitypackage Problematic Firebase Component: Auth...

github.com

 

글을 보면 아래와 같은 내용이 있다.

And then change its dependencies with the version 7.0.0 or something that works with the other packages.
In my project the solution was this;

에러도 나와 거의 같아서 확인해보니 GoogleSignIn 버전이 현재 6.0.2여서 GTMSessionFetcher/Core (~> 1.1)를 지원하는데,

설치한 FirebaseAuth 10.6.0은 GTMSessionFetcher/Core (< 4.0, >= 2.1)을 사용하고 있어서

GTMSessionFetcher/Core 버전이 서로 호환이 안되는 것 같다.

 

위 링크의 내용대로

GoogleSignIn 버전을 7.0.0(2023-03-27 기준 최신) 버전으로 변경하고 빌드를 다시해보니 깔끔하게 빌드가 잘 된다.

 

[추가]

빌드는 잘 되는데 회사 플랫폼에서 사용하는 GoogleSignIn이 6.0.2여서 7.0.0으로 올리면서 API 호환이 안돼서 로그인 시도할 때 Crash가 나면서 앱이 강제종료 된다.

6.2.4
  2.x 버전을 허용하도록 GTMSessionFetcher 종속 항목을 업데이트했습니다. (#207)

GoogleSignIn에서 해당 빌드 오류 이슈를 해결한 버전은 6.2.4여서 6.2.4로 버전을 내렸다.

나처럼 다른 이슈로 7.0.0으로 못올리는 사람은 6.2.4로 한 번 시도해 보면 좋을 것 같다.

 

[GoogleSignIn 버전 참조] https://developers.google.com/identity/sign-in/ios/release?hl=ko

 

Google 로그인 iOS 및 macOS SDK 출시 노트  |  Authentication  |  Google Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 Google 로그인 iOS 및 macOS SDK 출시 노트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분

developers.google.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.16f1

Xcode 14.2

Firebase 10.4.0

 

----

[빌드에러]

pod install output:



Analyzing dependencies

[!] CocoaPods could not find compatible versions for pod "GTMSessionFetcher/Core":

  In Podfile:

    Firebase/Auth (= 10.4.0) was resolved to 10.4.0, which depends on

      FirebaseAuth (~> 10.4.0) was resolved to 10.4.0, which depends on

        GTMSessionFetcher/Core (< 4.0, >= 2.1)

 

최근 Firebase 10.x 버전이 Xcode 14.x 버전에서 위와 같은 오류를 내면서 빌드가 제대로 되지 않는 문제가 있어서 이리저리 알아보니 구글에서 확인하고 수정중이라고 하는 것 같다.

[참조] https://github.com/firebase/firebase-ios-sdk/issues/10359

 

GTMSessionFetcher/Core dependency conflict between Firebase/Auth and GoogleMLKit/LanguageID with Firebase 10.0.0 · Issue #10359

Description Attempting a pod update causes Firebase/Analytics and Auth to be downgraded from 9.6.0 to 3.6.0, and GoogleUtilities from 7.8.0 to 1.3.2 leading to a compile error related to a GoogleUt...

github.com

 

수정 전까지 대안으로 아래와 같이 Podfile에서 FirebaseAuth 버전을 내리라고 설명하고 있다.

유니티를 사용중이라서 Podfile을 만지는건 애매하고, Firebase의 AuthDependencies.xml 파일에서 수정해보기로 했다.

 

<iosPod name="Firebase/Auth" version="10.4.0" minTargetSdk="8.0"></iosPod>

위의 내용을 아래와 같이 수정했다.

<iosPod name="Firebase/Auth" version="~> 9.6.0" minTargetSdk="8.0"></iosPod>

 

그래서 FirebaseAuth는 사라졌는데..

 

Messaging 쪽 에러가 다시 나오면서 빌드 실패.

[에러메시지]

pod install output:



Analyzing dependencies

[!] CocoaPods could not find compatible versions for pod "Firebase/Messaging":

  In Podfile:

    Firebase/Messaging (= 10.4.0)



None of your spec sources contain a spec satisfying the dependency: `Firebase/Messaging (= 10.4.0)`.

 

[결론]

그냥 고쳐질 때까지 Firebase 9.6.0을 써야 될 것 같다..

 

 

반응형
Posted by blueasa
, |

Unity 2021.3.14f1

현재(2022-12-11) 기준 Xcode PostProcessBuild 파일

using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using System.Collections;

namespace blueasa
{
    public class XcodeSettingsPostProcessor
    {

#if UNITY_2019_3_OR_NEWER
        // FixPodFile 사용법 참조
        // https://github.com/googlesamples/unity-jar-resolver/issues/405 : Str4tos 댓글
        [PostProcessBuild(45)]//must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50)
        private static void FixPodFile(BuildTarget buildTarget, string buildPath)
        {
            /// Stop processing if target is NOT iOS
            if (buildTarget != BuildTarget.iOS)
                return;

            using (StreamWriter sw = File.AppendText(buildPath + "/Podfile"))
            {
                // [Error 대응] (Xcode 14): Signing for "GoogleSignIn-GoogleSignIn" requires a development team.
                // [해결방법 참조] https://github.com/CocoaPods/CocoaPods/issues/11402 : JosephPoplar 댓글
                sw.WriteLine("\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    if target.respond_to?(:product_type) and target.product_type == \"com.apple.product-type.bundle\"\n      target.build_configurations.each do |config|\n        config.build_settings['CODE_SIGN_IDENTITY'] = \"\"\n        #prevent resource bundle from reading image nil\n        config.build_settings.delete('PRODUCT_BUNDLE_IDENTIFIER')\n      end\n    end\n  end\nend");

                /// ex
                //sw.WriteLine("\ntarget 'Unity-iPhone' do\nend");
            }
        }
#endif

        [PostProcessBuild]
        public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
        {

            /// Stop processing if target is NOT iOS
            if (buildTarget != BuildTarget.iOS)
                return;

            /// Initialize PbxProject
            var projectPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
            //var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
            PBXProject pbxProject = new PBXProject();
            pbxProject.ReadFromFile(projectPath);
            // Unity 2019 대응[blueasa / 2020-12-22]
#if UNITY_2019_3_OR_NEWER
            //string targetGuid = pbxProject.GetUnityFrameworkTargetGuid();
            string strMainTargetGuid = pbxProject.GetUnityMainTargetGuid();
            string strFrameworkTargetGuid = pbxProject.GetUnityFrameworkTargetGuid();
#else
            string strMainTargetGuid = pbxProject.TargetGuidByName("Unity-iPhone");
#endif

            /// Sample of adding build property
            //pbxProject.AddBuildProperty(strMainTargetGuid, "OTHER_LDFLAGS", "-all_load");

            /// Sample of setting build property
            //pbxProject.SetBuildProperty(strMainTargetGuid, "ENABLE_BITCODE", "NO");
            //pbxProject.SetBuildProperty(strMainTargetGuid, "EMBEDDED_CONTENT_CONTAINS_SWIFT", "YES");
            //pbxProject.SetBuildProperty(strMainTargetGuid, "CODE_SIGNING_ALLOWED", "NO");

            /// Sample of update build property
            //pbxProject.UpdateBuildProperty(strMainTargetGuid, "OTHER_LDFLAGS", new string[] { "-ObjC" }, new string[] { "-weak_framework" });

            /// ITMS-90206. ITMS-90427 에러 대응[blueasa / 2022-11-17]
            // Set FrameworkTargetGuid : NO
            foreach (var targetGuid in new[] { strMainTargetGuid, pbxProject.GetUnityFrameworkTargetGuid() })
            {
                pbxProject.SetBuildProperty(targetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO");
            }
            // Set MainTargetGuid : YES
            pbxProject.SetBuildProperty(strMainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");

            // [에러 처리] Undefined symbol: _vDSP_vclip, _vDSP_vsadd, _vvexpf, _vDSP_sve, _vdsp_mmul, _vDSP_maxv, _vDSP__dotpr, vDSP_vsdiv
            pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "Accelerate.framework", true);

            /// Sample of adding REQUIRED framwrok
            // Facebook SDK
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "FBAEMKit.framework", true);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "FBSDKCoreKit.framework", true);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "FBSDKCoreKit_Basics.framework", true);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "FBSDKLoginKit.framework", true);

            // Facebook Audience Network
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "FBAudienceNetwork.framework", true);

            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "CoreData.framework", false);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "Security.framework", false);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "CoreData.framework", false);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "libsqlite3.0.tbd", false);
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "AdSupport.framework", false); // for AppsFlyer
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "iAd.framework", false);       // for AppsFlyer

            /// Sample of adding OPTIONAL framework
            //pbxProject.AddFrameworkToProject(strFrameworkTargetGuid, "SafariServices.framework", true);

            /// Sample of setting compile flags
            //var guid = pbxProject.FindFileGuidByProjectPath("Classes/UI/Keyboard.mm");
            //var flags = pbxProject.GetCompileFlagsForFile(strMainTargetGuid, guid);
            //flags.Add("-fno-objc-arc");
            //pbxProject.SetCompileFlagsForFile(strMainTargetGuid, guid, flags);

#if !UNITY_2019_3_OR_NEWER
            // Add push notifications as a capability on the target
            pbxProject.AddCapability(targetGuid, UnityEditor.iOS.Xcode.PBXCapabilityType.PushNotifications);
#endif
            // Apply settings
            File.WriteAllText(projectPath, pbxProject.WriteToString());

#if UNITY_2019_3_OR_NEWER
            // 필요한 Capability 추가
            ProjectCapabilityManager projCapability = new ProjectCapabilityManager(projectPath, "Unity-iPhone/mmk.entitlements", "Unity-iPhone");
            projCapability.AddPushNotifications(false);		// Push Notifications
            projCapability.AddInAppPurchase();				// IAP
            projCapability.AddSignInWithApple();    		// Apple 로그인(FirebaseAuth용)
            projCapability.WriteToFile();
#endif
            /////////////////////////////////////////////////////////////////////////////////

            /// Samlpe of editing Info.plist
            var plistPath = System.IO.Path.Combine(pathToBuiltProject, "Info.plist");
            var plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            /// Add string integer
            //plist.root.SetInteger("FYBVideoPlayerOptionCloseButtonDelay", -1);  // Fyber

            /// Add boolean setting
            plist.root.SetBoolean("ITSAppUsesNonExemptEncryption", false);  // 수출 규정 관련 문서가 누락됨 경고 메세지 대처법
            plist.root.SetBoolean("FacebookAutoLogAppEventsEnabled", false);  // Facebook 자동 로그인 비활성화
            //plist.root.SetBoolean("FIREBASE_ANALYTICS_COLLECTION_ENABLED", true);  // FA

            /// Add string setting
            // [Fix] Unity2020.3.26f1에서 수정됨[blueasa / 2022-01-18]
            // [iOS15 + Unity2020.3.22f1 이슈] Force Dark Mode(Automatic/Light/Dark) - Appearance
            // [참조] https://stackoverflow.com/questions/70239569/unity-shader-glitches-according-to-the-dark-mode-on-ios-15
            //plist.root.SetString("UIUserInterfaceStyle", "Dark");

            // [iOS15+] AppsFlyer - SKAdNetwork 포스트백 적용[blueasa / 2022-02-17]
            plist.root.SetString("NSAdvertisingAttributionReportEndpoint", "https://appsflyer-skadnetwork.com/");

            /// Privacy
            //plist.root.SetString("NSCalendarsUsageDescription", "Some ad content may access calendar");
            //plist.root.SetString("NSCameraUsageDescription", "Every play requires access to the Camera library");
            plist.root.SetString("NSPhotoLibraryUsageDescription", "Every play requires access to the photo library"); // ITMS-90683
            // for Bluetooth [blueasa/2020-04-28]
            //plist.root.SetString("NSBluetoothAlwaysUsageDescription", "App would like to use your bluetooth for communication purposes");
            //plist.root.SetString("NSBluetoothPeripheralUsageDescription", "App would like to use your bluetooth for communication purposes");

            #region SKAdNetwork IDs
            // SKAdNetwork IDs integration(for iOS14+)
            // https://blueasa.tistory.com/2482
            var arraySKAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems");
            // for Admob(Google)
            // https://developers.google.com/admob/ios/ios14#skadnetwork
            var dictSKAdNetworkIdentifier_Admob = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Admob.SetString("SKAdNetworkIdentifier", "cstr6suwn9.skadnetwork"); // Admob
            // for FAN
            // https://developers.facebook.com/docs/audience-network/guides/SKAdNetwork
            var dictSKAdNetworkIdentifier_FAN_1 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_FAN_1.SetString("SKAdNetworkIdentifier", "v9wttpbfk9.skadnetwork"); // FAN 1
            var dictSKAdNetworkIdentifier_FAN_2 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_FAN_2.SetString("SKAdNetworkIdentifier", "n38lu8286q.skadnetwork"); // FAN 2
            // for UnityAds
            // https://unityads.unity3d.com/help/ios/skadnetwork-ids?fbclid=IwAR3T6BWG6-SIdWipZaB-PEtUQhg1DAnU_kQ22iiSv4Z5Q6nItq2edtpIIkM
            // https://skan.mz.unity3d.com/v2/partner/skadnetworks.plist.xml?_ga=2.140049011.1591405619.1607905486-1813266944.1603773122
            var dictSKAdNetworkIdentifier_Unity_1 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Unity_1.SetString("SKAdNetworkIdentifier", "4DZT52R2T5.skadnetwork"); // Unity Technologies 1
            var dictSKAdNetworkIdentifier_Unity_2 = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Unity_2.SetString("SKAdNetworkIdentifier", "bvpn9ufa9b.skadnetwork"); // Unity Technologies 2
            var dictSKAdNetworkIdentifier_Mintegral = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Mintegral.SetString("SKAdNetworkIdentifier", "KBD757YWX3.skadnetwork"); // Mintegral
            var dictSKAdNetworkIdentifier_CriteoSA = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_CriteoSA.SetString("SKAdNetworkIdentifier", "9RD848Q2BZ.skadnetwork"); // Criteo SA (Manage.com)
            var dictSKAdNetworkIdentifier_mkhoj = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_mkhoj.SetString("SKAdNetworkIdentifier", "WZMMZ9FP6W.skadnetwork"); // mkhoj Solutions Private Limited
            var dictSKAdNetworkIdentifier_Snap = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Snap.SetString("SKAdNetworkIdentifier", "424M5254LK.skadnetwork"); // Snap Inc.
            var dictSKAdNetworkIdentifier_Cheetah = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Cheetah.SetString("SKAdNetworkIdentifier", "24t9a8vw3c.skadnetwork"); // Cheetah Medialink
            var dictSKAdNetworkIdentifier_Appier = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Appier.SetString("SKAdNetworkIdentifier", "v72qych5uu.skadnetwork"); // Appier Inc.
            var dictSKAdNetworkIdentifier_Liftoff = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Liftoff.SetString("SKAdNetworkIdentifier", "7UG5ZH24HU.skadnetwork"); // Liftoff Mobile, Inc.
            var dictSKAdNetworkIdentifier_Beeswax = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Beeswax.SetString("SKAdNetworkIdentifier", "c6k4g5qg8m.skadnetwork"); // Beeswax
            var dictSKAdNetworkIdentifier_Adikteev = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Adikteev.SetString("SKAdNetworkIdentifier", "ydx93a7ass.skadnetwork"); // Adikteev SA
            var dictSKAdNetworkIdentifier_Realtime = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Realtime.SetString("SKAdNetworkIdentifier", "4468km3ulz.skadnetwork"); // Realtime Technologies GmbH
            var dictSKAdNetworkIdentifier_Remerge = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Remerge.SetString("SKAdNetworkIdentifier", "2U9PT9HC89.skadnetwork"); // Remerge GmbH
            var dictSKAdNetworkIdentifier_CriteoCorp = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_CriteoCorp.SetString("SKAdNetworkIdentifier", "hs6bdukanm.skadnetwork"); // Criteo Corp
            var dictSKAdNetworkIdentifier_Aarki = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Aarki.SetString("SKAdNetworkIdentifier", "4FZDC2EVR5.skadnetwork"); // Aarki, Inc.
            //var dictSKAdNetworkIdentifier_Google = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Google.SetString("SKAdNetworkIdentifier", "cstr6suwn9.skadnetwork"); // Google LLC(Admob)
            var dictSKAdNetworkIdentifier_YouAppi = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_YouAppi.SetString("SKAdNetworkIdentifier", "3RD42EKR43.skadnetwork"); // YouAppi Inc
            var dictSKAdNetworkIdentifier_LifeStreet = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_LifeStreet.SetString("SKAdNetworkIdentifier", "t38b2kh725.skadnetwork"); // LifeStreet Corporation
            var dictSKAdNetworkIdentifier_SPOTAD = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_SPOTAD.SetString("SKAdNetworkIdentifier", "f73kdq92p3.skadnetwork"); // SPOTAD LTD
            var dictSKAdNetworkIdentifier_BYTEMOD_Global = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_BYTEMOD_Global.SetString("SKAdNetworkIdentifier", "22mmun2rn5.skadnetwork"); // BYTEMOD PTE. LTD-global
            var dictSKAdNetworkIdentifier_DATASEAT = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_DATASEAT.SetString("SKAdNetworkIdentifier", "M8DBW4SV7C.skadnetwork"); // DATASEAT LTD
            var dictSKAdNetworkIdentifier_Kidoz = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Kidoz.SetString("SKAdNetworkIdentifier", "v79kvwwj4g.skadnetwork"); // Kidoz Ltd.
            var dictSKAdNetworkIdentifier_Sabio = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Sabio.SetString("SKAdNetworkIdentifier", "GLQZH8VGBY.skadnetwork"); // Sabio Mobile Inc.
            var dictSKAdNetworkIdentifier_Moloco = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Moloco.SetString("SKAdNetworkIdentifier", "9T245VHMPL.skadnetwork"); // Moloco, Inc
            var dictSKAdNetworkIdentifier_Bidmachine = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Bidmachine.SetString("SKAdNetworkIdentifier", "wg4vff78zm.skadnetwork"); // Bidmachine
            var dictSKAdNetworkIdentifier_BYTEMOD_CN = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_BYTEMOD_CN.SetString("SKAdNetworkIdentifier", "238da6jt44.skadnetwork"); // BYTEMOD PTE. LTD-CN
            var dictSKAdNetworkIdentifier_Apptimus = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Apptimus.SetString("SKAdNetworkIdentifier", "lr83yxwka7.skadnetwork"); // Apptimus LTD
            var dictSKAdNetworkIdentifier_Centro = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Centro.SetString("SKAdNetworkIdentifier", "3sh42y64q3.skadnetwork"); // Centro Inc.
            var dictSKAdNetworkIdentifier_UNICORN = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_UNICORN.SetString("SKAdNetworkIdentifier", "578prtvx9j.skadnetwork"); // UNICORN Inc.
            var dictSKAdNetworkIdentifier_REVX = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_REVX.SetString("SKAdNetworkIdentifier", "5a6flpkh64.skadnetwork"); // REVX TECHNOLOGY PRIVATE LIMITED
            var dictSKAdNetworkIdentifier_RTBHouse = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_RTBHouse.SetString("SKAdNetworkIdentifier", "8s468mfl3y.skadnetwork"); // RTBHouse Pte LTD
            var dictSKAdNetworkIdentifier_CrossInstall = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_CrossInstall.SetString("SKAdNetworkIdentifier", "prcb7njmu6.skadnetwork"); // CrossInstall
            var dictSKAdNetworkIdentifier_Maiden = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Maiden.SetString("SKAdNetworkIdentifier", "zmvfpc5aq8.skadnetwork"); // Maiden Marketing Pvt Ltd.
            var dictSKAdNetworkIdentifier_AdColony = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_AdColony.SetString("SKAdNetworkIdentifier", "4PFYVQ9L8R.skadnetwork"); // AdColony, Inc.
            var dictSKAdNetworkIdentifier_Spyke = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Spyke.SetString("SKAdNetworkIdentifier", "44n7hlldy6.skadnetwork"); // Spyke Media GmbH
            var dictSKAdNetworkIdentifier_LoopMe = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_LoopMe.SetString("SKAdNetworkIdentifier", "5lm9lj6jb7.skadnetwork"); // LoopMe Ltd
            var dictSKAdNetworkIdentifier_Smadex = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Smadex.SetString("SKAdNetworkIdentifier", "ppxm28t8ap.skadnetwork"); // Smadex SL
            var dictSKAdNetworkIdentifier_ADTIMING = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_ADTIMING.SetString("SKAdNetworkIdentifier", "488r3q3dtq.skadnetwork"); // ADTIMING TECHNOLOGY PTE. LTD.
            var dictSKAdNetworkIdentifier_Jampp = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Jampp.SetString("SKAdNetworkIdentifier", "YCLNXRL5PM.skadnetwork"); // Jampp LTD
            var dictSKAdNetworkIdentifier_PubNative = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_PubNative.SetString("SKAdNetworkIdentifier", "TL55SBB4FM.skadnetwork"); // PubNative GMBH
            var dictSKAdNetworkIdentifier_Chartboost = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Chartboost.SetString("SKAdNetworkIdentifier", "F38H382JLK.skadnetwork"); // Chartboost, Inc.
            var dictSKAdNetworkIdentifier_ScaleMonk = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_ScaleMonk.SetString("SKAdNetworkIdentifier", "av6w8kgt66.skadnetwork"); // ScaleMonk Inc.
            var dictSKAdNetworkIdentifier_Persona = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Persona.SetString("SKAdNetworkIdentifier", "44jx6755aq.skadnetwork"); // Persona.ly LTD
            var dictSKAdNetworkIdentifier_Triapodi = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Triapodi.SetString("SKAdNetworkIdentifier", "mlmmfzh3r3.skadnetwork"); // Triapodi Ltd.
            // for Vungle
            // https://support.vungle.com/hc/en-us/articles/360002925791-Integrate-Vungle-SDK-for-iOS#3-add-the-%E2%80%9C-objc%E2%80%9D-linker-flag-0-9
            // https://vungle.com/skadnetworkids.xml
            var dictSKAdNetworkIdentifier_Vungle = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_Vungle.SetString("SKAdNetworkIdentifier", "GTA9LK7P23.skadnetwork"); // Vungle
            //var dictSKAdNetworkIdentifier_Adikteev = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Adikteev.SetString("SKAdNetworkIdentifier", "ydx93a7ass.skadnetwork"); // Adikteev  
            //var dictSKAdNetworkIdentifier_Aarki = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Aarki.SetString("SKAdNetworkIdentifier", "4FZDC2EVR5.skadnetwork"); // Aarki
            //var dictSKAdNetworkIdentifier_AdColony = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_AdColony.SetString("SKAdNetworkIdentifier", "4PFYVQ9L8R.skadnetwork"); // AdColony
            //var dictSKAdNetworkIdentifier_Appier = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Appier.SetString("SKAdNetworkIdentifier", "v72qych5uu.skadnetwork"); // Appier
            //var dictSKAdNetworkIdentifier_Appreciate = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Appreciate.SetString("SKAdNetworkIdentifier", "mlmmfzh3r3.skadnetwork"); // Appreciate
            //var dictSKAdNetworkIdentifier_Beeswax = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Beeswax.SetString("SKAdNetworkIdentifier", "c6k4g5qg8m.skadnetwork"); // Beeswax
            //var dictSKAdNetworkIdentifier_Jampp = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Jampp.SetString("SKAdNetworkIdentifier", "YCLNXRL5PM.skadnetwork"); // Jampp
            //var dictSKAdNetworkIdentifier_LoopMe = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_LoopMe.SetString("SKAdNetworkIdentifier", "5lm9lj6jb7.skadnetwork"); // LoopMe
            var dictSKAdNetworkIdentifier_MyTarget = arraySKAdNetworkItems.AddDict();
            dictSKAdNetworkIdentifier_MyTarget.SetString("SKAdNetworkIdentifier", "n9x2a789qt.skadnetwork"); // MyTarget
            //var dictSKAdNetworkIdentifier_Pubnative = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Pubnative.SetString("SKAdNetworkIdentifier", "TL55SBB4FM.skadnetwork"); // Pubnative
            //var dictSKAdNetworkIdentifier_Remerge = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Remerge.SetString("SKAdNetworkIdentifier", "2U9PT9HC89.skadnetwork"); // Remerge
            //var dictSKAdNetworkIdentifier_RTBHouse = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_RTBHouse.SetString("SKAdNetworkIdentifier", "8s468mfl3y.skadnetwork"); // RTB House
            //var dictSKAdNetworkIdentifier_Sabio = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Sabio.SetString("SKAdNetworkIdentifier", "GLQZH8VGBY.skadnetwork"); // Sabio
            //var dictSKAdNetworkIdentifier_Webeye = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_Webeye.SetString("SKAdNetworkIdentifier", "22mmun2rn5.skadnetwork"); // Webeye
            //var dictSKAdNetworkIdentifier_YouAppi = arraySKAdNetworkItems.AddDict();
            //dictSKAdNetworkIdentifier_YouAppi.SetString("SKAdNetworkIdentifier", "3RD42EKR43.skadnetwork"); // YouAppi
#endregion

            /// Add URL Scheme
            //var array = plist.root.CreateArray("CFBundleURLTypes");
            //var urlDict = array.AddDict();
            //urlDict.SetString("CFBundleURLName", "hogehogeName");
            //var urlInnerArray = urlDict.CreateArray("CFBundleURLSchemes");
            //urlInnerArray.AddString("hogehogeValue");

            /// Localizations [blueasa / 2018-03-28]
            // need Language Code(ref:https://ko.wikipedia.org/wiki/ISO_639)
            var arrayLocalizations = plist.root.CreateArray("CFBundleLocalizations");
            arrayLocalizations.AddString("en");         // 영어
            arrayLocalizations.AddString("ko");         // 한국어
            
            // [Temp] 사용전까지 주석처리[blueasa / 2022-11-16]
            //arrayLocalizations.AddString("zh_CN");      // 중국어(간체) : 중국
            //arrayLocalizations.AddString("zh_TW");      // 중국어(번체) : 대만
            //arrayLocalizations.AddString("ja");         // 일본어
            //arrayLocalizations.AddString("vi");         // 베트남어
            //arrayLocalizations.AddString("es");         // 스페인어
            //arrayLocalizations.AddString("it");         // 이탈리아어
            //arrayLocalizations.AddString("id");         // 인도네시아어
            //arrayLocalizations.AddString("th");         // 태국어
            //arrayLocalizations.AddString("pt");         // 포르투갈어
            //arrayLocalizations.AddString("hi");         // 힌디어


            //arrayLocalizations.AddString("de");       // 독일어
            //arrayLocalizations.AddString("zh");       // 중국어

            /// Apply editing settings to Info.plist
            plist.WriteToFile(plistPath);

        }
    }
}
반응형
Posted by blueasa
, |