dynamic type으로 빌드된 framework를 사용하려고 하는 경우 일반 iOS 프로젝트에서는 General탭의 Embedded Framework에 추가하여 별 문제없이 사용하였는데, Unity에서 빌드한 프로젝트에는 General이 없다.


이 경우 Targets에서 Build Phases탭에서 + 버튼을 눌러 'New Copy Files Phases'를 선택하여 Destination을 Frameworks로 선택하고, 사용할 라이브러리를 추가해주면 별다른 문제 없이 사용가능 하지만 '자동으로 알아서 편하게'  추가하고 싶은 경우 아래 본문을 참고하면 된다.


1. https://bitbucket.org/Unity-Technologies/xcodeapi에 들어가서 다운 받는다.


2. PBXprojects.cs에 아래 내용을 추가한다.


 

    1. public void AddDynamicFrameworkToProject(string targetGuid, string frameworkPathInProject)
    2. {
    3. var fileGuid = FindFileGuidByProjectPath(frameworkPathInProject);
    4. if (fileGuid == null)
    5. {
    6. Debug.LogError("Framework not found: " + frameworkPathInProject);
    7. return;
    8. }
    9. // add file reference as embed framework
    10. PBXBuildFileData embedFrameworkFileData = PBXBuildFileData.CreateFromFile(fileGuid, false, "");
    11. BuildFilesAdd(targetGuid, embedFrameworkFileData);
    12. // add "Embed Frameworks" section
    13. // TODO: check if exists
    14. PBXCopyFilesBuildPhaseData embedFrameworksSection = PBXCopyFilesBuildPhaseData.Create("Embed Frameworks", "", "10");
    15. embedFrameworksSection.files.AddGUID(embedFrameworkFileData.guid);
    16. m_Data.copyFiles.AddEntry(embedFrameworksSection);
    17. // add "Embed Frameworks" section to "Build phases"
    18. PBXNativeTargetData target = nativeTargets[targetGuid];
    19. target.phases.AddGUID(embedFrameworksSection.guid);
    20. }


3. postprocess용 스크립트를 하나 생성하여 아래와 같이 수정한다.


 

  1. [PostProcessBuild]
  2. public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
  3. {
  4. if (buildTarget == BuildTarget.iOS)
  5. {
  6. string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
  7. PBXProject pbxProject = new PBXProject();
  8. pbxProject.ReadFromFile(projectPath);
  9. string target = pbxProject.TargetGuidByName("Unity-iPhone");
  10. // pbxProject.SetBuildProperty(target, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
  11. pbxProject.SetBuildProperty(target, "LD_RUNPATH_SEARCH_PATHS", "$(inherited) @executable_path/Frameworks");
  12. AddDynamicFrameworks(ref pbxProject, target);
  13. pbxProject.WriteToFile(projectPath);
  14. string contents = File.ReadAllText(projectPath);
  15. // Enable CodeSignOnCopy for the framework
  16. contents = Regex.Replace(contents,
  17. "(?<=Embed Frameworks)(?:.*)(\\/\\* EXAMPLE\\.framework \\*\\/)(?=; };)",
  18. m => m.Value.Replace("/* HondaProxy.framework */",
  19. "/* EXAMPLE.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }"));
  20. File.WriteAllText(projectPath, contents);
  21. }
  22. }
  23. static void AddDynamicFrameworks(ref PBXProject project, string target)
  24. {
  25. const string defaultLocationInProj = "Frameworks/Plugins/iOS";
  26. const string coreFrameworkName = "EXAMPLE.framework";
  27. string relativeCoreFrameworkPath = Path.Combine(defaultLocationInProj, coreFrameworkName);
  28. project.AddDynamicFrameworkToProject(target, relativeCoreFrameworkPath);
  29. Debug.Log("Dynamic Frameworks added to Embedded binaries.");
  30. }



단점으로 Add 함수를 사용하여 여러개의 framework를 추가하는 경우 Build Phases에 덕지덕지 프레임 워크가 붙는 것을 볼 수 있어 약간의 수정이 필요하다.


'EXAMPLE' 이라고 써있는 부분을 자신의 프레임 워크 이름으로 수정하여 사용하면 된다. 


주의사항으로는 EXAMPLE만 바꿔서 사용하면 됨, namespace 충돌이 일어날 수 있으니 Custom.UnityEditor.iOS.Xcode 등으로 변경하여 사용할 것.


본문 : http://answers.unity3d.com/questions/1074471/is-it-possible-to-use-the-xcode-manipulation-api-t.html

+ Recent posts