XCode-Capabilities-Push Notifications를 기본 ON 하는 방법
[사용도구]
Unity 5.6.7
Xcode 10.2.1
최근 iOS빌드에서 XCode-Capabilities-Push Notifications를 수동으로 ON 시켜야 되는 문제가 귀찮아서 자동으로 하는 방법을 찾아보고 정리해둠.
(유니티 5.x에서 되는 방법을 찾느라 이래저래 삽질을..)
[순서]
1) https://bitbucket.org/Unity-Technologies/xcodeapi 소스 다운로드.
2) 다운로드 받은 소스를 유니티 해당 프로젝트의 Editor 폴더 아래 추가
나의 경우는 ../Assets/Editor/XCodeApi 아래에 추가.
2-1) Xcode.Tests는 에러나서 제거 함.(2017 이후 버전 API를 사용하는 듯 함)
3) iOS PostProcessBuild 소스에 PBXCapabilityType.PushNotifications 추가(AddCapability)
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using System.Collections;
public class XCodeSettingsPostProcesser
{
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
{
// Stop processing if targe is NOT iOS
if (buildTarget != BuildTarget.iOS)
{
return;
}
/// Initialize PbxProject
var projectPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
PBXProject pbxProject = new PBXProject();
pbxProject.ReadFromFile(projectPath);
// Unity 2019 대응
#if UNITY_2019_3_OR_NEWER
//string targetGuid = pbxProject.GetUnityFrameworkTargetGuid();
string strMainTargetGuid = pbxProject.GetUnityMainTargetGuid();
string strFrameworkTargetGuid = pbxProject.GetUnityFrameworkTargetGuid();
#else
string targetGuid = pbxProject.TargetGuidByName("Unity-iPhone");
#endif
// Add push notifications as a capability on the target
pbxProject.AddCapability(targetGuid, UnityEditor.iOS.Xcode.Custom.PBXCapabilityType.PushNotifications);
// Apply settings
File.WriteAllText(projectPath, pbxProject.WriteToString());
}
}
3-1) 주의사항
기존 PBXProject는 UnityEditor.iOS.Xcode.PBXProject인데, 추가 된 플러그인을 사용하기 위해 UnityEditor.iOS.Xcode.Custom.PBXProject로 변경필요.
예1) UnityEditor.iOS.Xcode.PBXProject -> UnityEditor.iOS.Xcode.Custom.PBXProject
예2) UnityEditor.iOS.Xcode.PBXCapabilityType -> UnityEditor.iOS.Xcode.Custom.PBXCapabilityType
4) entitlements 생성을 위해 아래 클래스를 Editor 폴더에 추가
(entitlements 파일 내용을 스크립트 내부에 넣어서 생성해서 별도의 파일 추가를 안해도 돼서 편한 듯)
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;
using System.IO;
using UnityEditor.iOS.Xcode;
public class EntitlementsPostProcess
{
private const string entitlements = @"
<?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>aps-environment</key>
<string>development</string>
</dict>
</plist>";
[PostProcessBuild]
public static void OnPostProcess(BuildTarget buildTarget, string buildPath)
{
if (buildTarget != BuildTarget.iOS) return;
var file_name = "unity.entitlements";
var proj_path = PBXProject.GetPBXProjectPath(buildPath);
var proj = new PBXProject();
proj.ReadFromFile(proj_path);
// target_name = "Unity-iPhone"
var target_name = PBXProject.GetUnityTargetName();
var target_guid = proj.TargetGuidByName(target_name);
var dst = buildPath + "/" + target_name + "/" + file_name;
try
{
File.WriteAllText(dst, entitlements);
proj.AddFile(target_name + "/" + file_name, file_name);
proj.AddBuildProperty(target_guid, "CODE_SIGN_ENTITLEMENTS", target_name + "/" + file_name);
proj.WriteToFile(proj_path);
}
catch (IOException e)
{
Debug.LogWarning($"Could not copy entitlements. Probably already exists. ({e})");
}
}
}
[1) 참조] https://bitbucket.org/Unity-Technologies/xcodeapi
[3) 참조] https://qiita.com/fullcorder/items/b82c48022acd0b4ff957
[4) 참조] https://answers.unity.com/questions/1224123/enable-push-notification-in-xcode-project-by-defau.html
'Unity3D > Script' 카테고리의 다른 글
[펌] Is there an isPlaying() type function for Animator (0) | 2019.11.13 |
---|---|
[펌] PostProcessing iOS Activate Background Mode for Push Notifications (0) | 2019.06.04 |
[펌] Unity5のPostProcessBuildでXcode Capabilityの設定する方法 (0) | 2019.06.03 |
[펌] Enable Push Notification in XCode project by default? (0) | 2019.06.03 |
[펌] animation.sample() usage (0) | 2019.05.09 |