KI-AGENT: Multi-File-Upload für iOS Share Target absichern

This commit is contained in:
2026-08-08 22:41:58 +02:00
parent ca91de2284
commit 5dae5b6aa5
2 changed files with 99 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
const fs = require('node:fs');
const path = require('node:path');
const { withXcodeProject } = require('@expo/config-plugins');
const SHARE_EXTENSION_DIRECTORY = 'InFEDEOhochladen';
function replaceOnce(source, search, replacement, label) {
if (!source.includes(search)) {
throw new Error(`Multi-File-Patch konnte ${label} nicht finden.`);
}
return source.replace(search, replacement);
}
module.exports = function withShareIntentMultifile(config) {
return withXcodeProject(config, async (modConfig) => {
const controllerPath = path.join(
modConfig.modRequest.platformProjectRoot,
SHARE_EXTENSION_DIRECTORY,
'ShareViewController.swift'
);
let source = fs.readFileSync(controllerPath, 'utf8');
source = replaceOnce(
source,
' var sharedText: [String] = []\n',
' var sharedText: [String] = []\n var processedMediaAttachmentCount = 0\n',
'den Attachment-Zähler'
);
const imageCompletion = ` // If this is the last item, save imagesData in userDefaults and redirect to host app
if index == (content.attachments?.count)! - 1 {
let userDefaults = UserDefaults(suiteName: self.hostAppGroupIdentifier)
userDefaults?.set(self.toData(data: self.sharedMedia), forKey: self.sharedKey)
userDefaults?.synchronize()
self.redirectToHostApp(type: .media)
}`;
source = replaceOnce(
source,
imageCompletion,
' self.finishMediaAttachment(content: content, type: .media)',
'den Abschluss der Bildverarbeitung'
);
source = replaceOnce(
source,
imageCompletion,
' self.finishMediaAttachment(content: content, type: .media)',
'den Abschluss der Videoverarbeitung'
);
const fileCompletion = ` if index == (content.attachments?.count)! - 1 {
let userDefaults = UserDefaults(suiteName: self.hostAppGroupIdentifier)
userDefaults?.set(self.toData(data: self.sharedMedia), forKey: self.sharedKey)
userDefaults?.synchronize()
self.redirectToHostApp(type: .file)
}`;
source = replaceOnce(
source,
fileCompletion,
' self.finishMediaAttachment(content: content, type: .file)',
'den Abschluss der Dateiverarbeitung'
);
const redirectMethod = ' private func redirectToHostApp(type: RedirectType) {';
const completionMethod = ` private func finishMediaAttachment(content: NSExtensionItem, type: RedirectType) {
processedMediaAttachmentCount += 1
let expectedMediaAttachmentCount = content.attachments?.filter { attachment in
attachment.hasItemConformingToTypeIdentifier(imageContentType)
|| attachment.hasItemConformingToTypeIdentifier(videoContentType)
|| attachment.hasItemConformingToTypeIdentifier(vcardContentType)
|| attachment.hasItemConformingToTypeIdentifier(fileURLType)
|| attachment.hasItemConformingToTypeIdentifier(pkpassContentType)
|| attachment.hasItemConformingToTypeIdentifier(pdfContentType)
}.count ?? 0
guard processedMediaAttachmentCount == expectedMediaAttachmentCount else { return }
let userDefaults = UserDefaults(suiteName: hostAppGroupIdentifier)
userDefaults?.set(toData(data: sharedMedia), forKey: sharedKey)
userDefaults?.synchronize()
redirectToHostApp(type: type)
}
`;
source = replaceOnce(
source,
redirectMethod,
completionMethod + redirectMethod,
'die Weiterleitungsmethode'
);
fs.writeFileSync(controllerPath, source);
return modConfig;
});
};