Skip to content

Commit 9204b8f

Browse files
committed
fix(reg): Include explicitly specified fonts in info.plist for backward compatibilty
1 parent fb2bd15 commit 9204b8f

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

src/SourceGenerators/Uno.UI.Tasks/Assets/RetargetAssets.Fonts.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics;
44
using System.IO;
55
using System.Linq;
6+
using System.Xml;
67
using Microsoft.Build.Framework;
78
using Microsoft.Build.Utilities;
89
using Uno.UI.Tasks.Helpers;
@@ -31,10 +32,15 @@ public partial class RetargetAssets_v0
3132
</plist>
3233
""";
3334

34-
private ITaskItem[] GenerateFontPartialManifest(List<string> fontAssets)
35+
private ITaskItem[] GenerateFontPartialManifest(List<string> fontAssets, string iOSAppManifest)
3536
{
3637
if (TargetPlatform == "ios")
3738
{
39+
// For compatibility measures, get the fonts from the iOS app manifest
40+
// and merge them with the generated ones, so existing apps don't lose
41+
// explicitly specified ones.
42+
var existingFonts = EnumerateFontsFromPList(IosAppManifest);
43+
3844
var outputManifestFile = Path.Combine(IntermediateOutputPath, "FontsPartialInfo.plist");
3945

4046
using var writer = File.CreateText(outputManifestFile);
@@ -46,7 +52,7 @@ private ITaskItem[] GenerateFontPartialManifest(List<string> fontAssets)
4652
writer.WriteLine(" <key>UIAppFonts</key>");
4753
writer.WriteLine(" <array>");
4854

49-
foreach (var font in fontAssets)
55+
foreach (var font in fontAssets.Concat(existingFonts))
5056
{
5157
writer.WriteLine(" <string>" + font + "</string>");
5258
}
@@ -63,4 +69,17 @@ private ITaskItem[] GenerateFontPartialManifest(List<string> fontAssets)
6369
return Array.Empty<ITaskItem>();
6470
}
6571
}
72+
73+
private string[] EnumerateFontsFromPList(string iosAppManifest)
74+
{
75+
XmlDocument doc = new();
76+
doc.Load(iosAppManifest);
77+
78+
// Get the list of registered fonts in the info.plist
79+
return doc
80+
.SelectNodes("//key[text()='UIAppFonts']/following-sibling::array[1]/string")
81+
.OfType<XmlNode>()
82+
.Select(n => n.InnerText)
83+
.ToArray();
84+
}
6685
}

src/SourceGenerators/Uno.UI.Tasks/Assets/RetargetAssets.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public partial class RetargetAssets_v0 : Task
3131

3232
public string AndroidAssetsPrefix { get; set; }
3333

34+
public string IosAppManifest { get; set; }
35+
3436
[Required]
3537
public string DefaultLanguage { get; set; }
3638

@@ -169,7 +171,7 @@ private void ProcessContentItems(ITaskItem[] assets, Func<ResourceCandidate, str
169171
}
170172

171173
RetargetedAssets = retargetdAssets.ToArray();
172-
PartialAppManifests = GenerateFontPartialManifest(fontAssets);
174+
PartialAppManifests = GenerateFontPartialManifest(fontAssets, IosAppManifest);
173175
}
174176

175177

src/SourceGenerators/Uno.UI.Tasks/Content/Uno.UI.Tasks.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@
128128
IntermediateOutputPath="$(IntermediateOutputPath)"
129129
ContentItems="@(Content);@(_SourceItemsToCopyToOutputDirectory)"
130130
AndroidAssetsPrefix="$(MonoAndroidAssetsPrefix)"
131+
IosAppManifest="$(AppBundleManifest)"
131132
Condition="'$(XamarinProjectType)'!=''">
132133
<Output TaskParameter="Assets"
133134
ItemName="Assets" />

0 commit comments

Comments
 (0)