upsertEntitlement function

Future<void> upsertEntitlement({
  1. required String key,
  2. required XmlNode valueNode,
})

Implementation

Future<void> upsertEntitlement({
  required String key,
  required XmlNode valueNode,
}) async {
  final file = File('ios/Runner/Runner.entitlements');

  if (!file.existsSync()) return;

  final document = XmlDocument.parse(await file.readAsString());
  final dict = document.findAllElements('dict').first;

  final children = dict.children;

  XmlElement? existingKey;
  for (var node in children) {
    if (node is XmlElement && node.name.local == 'key' && node.innerText == key) {
      existingKey = node;
      break;
    }
  }

  if (existingKey != null) {
    print('$key already exists → updating');

    final index = children.indexOf(existingKey);

    if (index + 1 < children.length) {
      children.removeAt(index + 1);
    }

    children.insert(index + 1, valueNode);
  } else {
    print('Adding $key');

    dict.children.add(XmlElement(XmlName('key'), [], [XmlText(key)]));
    dict.children.add(valueNode);
  }

  await file.writeAsString(document.toXmlString(pretty: true));
}