Ich habe ein benutzerdefiniertes Asset-Bundle in einem von mir bewerteten iOS-Projekt gesehen, daher weiß ich zumindest, dass es möglich ist.
Mein Problem ist, dass ich einen CATiledLayer mit etwa 22.000 Kacheln für ein bestimmtes Bild verwende und das Kompilieren sehr lange dauert (eine halbe Stunde Clean Build, 5-10 Minuten für das normale Build). Ich möchte also alle Bilder aufnehmen und ein benutzerdefiniertes Bundle erstellen, um es portabel zu machen und hoffentlich nicht jedes Mal in das App-Bundle neu zu kompilieren.
Wie gehe ich vor? Ich habe die Dokumente durchgesehen, konnte jedoch keine Erklärung dazu finden, wie das Bundle erstellt wird.
Die Antwort ist dumm einfach
Erstellen Sie einen Ordner im Finder, fügen Sie Dateien hinzu und benennen Sie ihn in Bündelname.bundle um
in Xcode ziehen - Erfolg!
verwenden Sie für den Zugriff das Formular PathToMainBundle + "/ bundlename.bundle".
So erstellen Sie ein Bundle
.bundle
lautet (z. B. "Neuer Ordner" -> "BundleName.bundle").PS: Sie können jederzeit mit der rechten Maustaste auf den Ordner klicken und auf "Paketinhalt anzeigen" klicken, um Dateien hinzuzufügen, zu entfernen oder zu ändern.
So fügen Sie das Bundle zu Xcode hinzu
So verwenden Sie das Bundle
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *resource = [bundle pathForResource:@"fileName" ofType:@"fileType"];
(Ersetzen Sie BundleName
, fileName
und fileType
durch entsprechende Namen.)
Zwei weitere hilfreiche Ratschläge:
Um den Inhalt des Bundles in XCode anzuzeigen, müssen Sie seinen Typ im Dienstprogramm "Datei-Inspektor" auf "Anwendungs-Bundle" setzen. Sie können immer noch nicht über XCode kopieren. Sie müssen Terminal verwenden, aber XCode aktualisiert es sofort.
Zweitens, um Ressourcen im Bundle zu nutzen, hier ein hilfreicher Ausschnitt ...
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"AquarianHarp" ofType:@"bundle"];
NSString *imageName = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"trebleclef2" ofType:@"png"];
UIImage *myImage = [[UIImage alloc] initWithContentsOfFile:imageName];
Wie in meinem Kommentar oben erwähnt, müssen Sie das Bundle nicht wirklich laden (Sie können es nicht ausführen, da es nicht ausführbar ist) und ofType
muss mit dem Fall Ihrer tatsächlichen Datei übereinstimmen, damit es auf dem Gerät funktioniert. Im Simulator funktioniert es so oder so, also lasst euch nicht von diesem roten Hering täuschen!
Schließlich müssen Sie Ihre Ressourcen nicht im Unterordner "Resources" im Bundle ablegen. Es scheint, dass Sie ein beliebiges Layout verwenden können, es kann jedoch unbekannte Auswirkungen auf die Leistung geben.
So habe ich das gemacht: In XCode eine neue Datei erstellen Ressource | Einstellungspaket. Wählen Sie dann im Finder das Bundle aus, wählen Sie Paketinhalt anzeigen und fügen Sie beliebige Bilddateien hinzu.
Dann verweisen Sie im Code auf ein Bild auf diese Weise:
NSString *imgName = @"bundlename.bundle/my-image.png";
UIImage *myImage = [UIImage imageNamed:imgName];
Meine Hinweise zum Bündeln und Lesen von Dateien in einem XCode-Projekt
print(Bundle.main.resourcePath!+"/temp.bundle/test.txt")
Ausgabe: /Users/James/Library/Developer/Xcode/DerivedData/GitSyncMac-heiwpdjbtaxzhiclikjotucjguqu/Build/Products/Debug/GitSyncMacApp.app/Contes/Resources/temp.bundle./print(content(Bundle.main.resourcePath!+"/temp.bundle/test.txt"))// testing✌️
static func content(_ path:String)->String?{
do {
let content = try String(contentsOfFile:path, encoding:String.Encoding.utf8) as String//encoding: NSUTF8StringEncoding
return content
} catch {
return nil
}
}
Hier sind die Schritte zum Erstellen eines Assets oder Ressourcenpakets (z. B. FrameworkResources.bundle
). Dies ist überraschenderweise nicht offensichtlich. Dies ist besonders nützlich, wenn Sie statische Frameworks erstellen.
SDKROOT
) in "iOS".