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에 아래 내용을 추가한다.
public void AddDynamicFrameworkToProject(string targetGuid, string frameworkPathInProject) { var fileGuid = FindFileGuidByProjectPath(frameworkPathInProject); if (fileGuid == null) { Debug.LogError("Framework not found: " + frameworkPathInProject); return; } // add file reference as embed framework PBXBuildFileData embedFrameworkFileData = PBXBuildFileData.CreateFromFile(fileGuid, false, ""); BuildFilesAdd(targetGuid, embedFrameworkFileData); // add "Embed Frameworks" section // TODO: check if exists PBXCopyFilesBuildPhaseData embedFrameworksSection = PBXCopyFilesBuildPhaseData.Create("Embed Frameworks", "", "10"); embedFrameworksSection.files.AddGUID(embedFrameworkFileData.guid); m_Data.copyFiles.AddEntry(embedFrameworksSection); // add "Embed Frameworks" section to "Build phases" PBXNativeTargetData target = nativeTargets[targetGuid]; target.phases.AddGUID(embedFrameworksSection.guid); }
|
3. postprocess용 스크립트를 하나 생성하여 아래와 같이 수정한다.
[PostProcessBuild] public static void OnPostProcessBuild(BuildTarget buildTarget, string path) { if (buildTarget == BuildTarget.iOS) { string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj"; PBXProject pbxProject = new PBXProject(); pbxProject.ReadFromFile(projectPath); string target = pbxProject.TargetGuidByName("Unity-iPhone"); // pbxProject.SetBuildProperty(target, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); pbxProject.SetBuildProperty(target, "LD_RUNPATH_SEARCH_PATHS", "$(inherited) @executable_path/Frameworks"); AddDynamicFrameworks(ref pbxProject, target); pbxProject.WriteToFile(projectPath); string contents = File.ReadAllText(projectPath); // Enable CodeSignOnCopy for the framework contents = Regex.Replace(contents, "(?<=Embed Frameworks)(?:.*)(\\/\\* EXAMPLE\\.framework \\*\\/)(?=; };)", m => m.Value.Replace("/* HondaProxy.framework */", "/* EXAMPLE.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }")); File.WriteAllText(projectPath, contents); } } static void AddDynamicFrameworks(ref PBXProject project, string target) { const string defaultLocationInProj = "Frameworks/Plugins/iOS"; const string coreFrameworkName = "EXAMPLE.framework"; string relativeCoreFrameworkPath = Path.Combine(defaultLocationInProj, coreFrameworkName); project.AddDynamicFrameworkToProject(target, relativeCoreFrameworkPath); Debug.Log("Dynamic Frameworks added to Embedded binaries."); }
|
단점으로 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