2009-09-21 11 views

risposta

28

La sintassi di superficie di un progetto Xcode è un "plist vecchio stile". Si può facilmente convertirlo in un plist XML con il comando

plutil -convert xml1 -o - myproj.xcodeproj/project.pbxproj 

notare che questo non è "reale XML" ma la struttura X plist Mac OS espressa nella sintassi XML; consiste quasi interamente di dizionari e array di coppie di valori chiave. Xcode leggerà la rappresentazione XML ma la convertirà in "plist vecchio stile" quando il progetto verrà aperto.

La struttura e il rapporto degli elementi nelle note seguono la struttura del progetto. Gli UUID vengono utilizzati per il riferimento incrociato di elementi tra il progetto e i relativi target e tra il progetto ei file utente nel wrapper del progetto.

La chiave "isa" identifica ogni tipo di oggetto. PBXProject contiene oggetti PBXFileReference, PBXGroup, PBXNativeTarget e PBXBuildConfiguration.

Gli obiettivi hanno oggetti PBXBuildPhase che contengono riferimenti incrociati ai riferimenti del file; BuildConfigurationLists che memorizzano le impostazioni di compilazione per le destinazioni e altre impostazioni di destinazione come il tipo e il nome di destinazione.

Le buildConfigurationList fanno riferimento a buildConfigurations, che a loro volta contengono dizionari di buildSettings.

Suggerirei di guardare prima il testo plist vecchio stile, poiché è molto più leggibile e contiene effettivamente commenti in linea per dirti cosa è cosa. Quindi puoi utilizzare gli strumenti XML per modificare o scrivere i file di progetto a tuo piacimento.

+0

Grazie per questa risposta. Questo è un bel modo di farmi iniziare. Sarò sicuro di farti sapere come va. –

+2

è reversibile? xml torna a pbxproj? – thndrkiss

+0

@thndrkiss Xcode leggerà felicemente qualsiasi formato dell'elenco (xml, Jason, ecc.) E tornerà al formato nativo al salvataggio. Se si utilizza ObjC/Swift forse non è necessario convertire in XML poiché è possibile leggere il file direttamente in un NSDictionary. –

21

ho finito per creare uno, ed è ospitato su GitHub qui:

https://github.com/jasperblues/XcodeEditor

Consente messa in vendita di intestazioni, file, l'aggiunta di file di origine , impostazione del file sorgente come membro di un target, aggiunta di immagini, creazione di gruppi, ecc.).

Funziona manipolando il contenuto del file project.pbxproj. Utilizzato in:

  • Meno doloroso: test funzionale automatizzato per applicazioni mobili. (Modifica: ora parte degli strumenti di Xamarin).
  • Level Helper: un framework RAD per lo sviluppo di giochi 2D su iOS & Android.
  • TextMate
  • Apportable
+0

+1 Molto interessante! Dovrò dare un'occhiata! –

3

provare questo: https://github.com/sap-production/XcodeProjectJavaAPI

Può leggere e scrivere qualsiasi file elenco di proprietà e contiene un modello semantico per leggere e modificare i file di progetto Xcode. Il modello semantico è in una fase iniziale ma può essere facilmente esteso.

Viene anche utilizzato pesantemente nel plug-in Xcode Maven di SAP, che verrà rilasciato questo mese.

2

C'è un bel pacchetto Python per fare questo. La documentazione non è eccezionale, ma il codice sorgente è abbastanza organizzato e puoi trovare ciò di cui hai bisogno.

https://github.com/kronenthaler/mod-pbxproj

-1

Per PHP (facilmente portato su qualsiasi lingua è necessario), scrittura molto di base solo:

function modifyPlistXCodeProject($file_path,$app_name,$bundle_identifier,$latest_version,$bundle_version) 
{ 
    $data = file_get_contents($file_path); 
    $changes = Array(); 
    $changes['PRODUCT_BUNDLE_IDENTIFIER'] = $bundle_identifier; 
    foreach ($changes as $key => $value){ 
     $data = oldStylePlistReplace($data,$key,$value); 
    } 
    file_put_contents($file_path, $data); 
} 

function oldStylePlistReplace($data,$key,$value){ 
    $e = explode($key,$data); 
    for ($i=1;$i<count($e);$i++){ 
     $row_i = $e[$i]; 
     $nextline_pos = stripos($row_i,"\n"); 
     $text_i = '= '.$value.';'.substr($row_i, $nextline_pos); 
     $e[$i] = $text_i; 
     //var_dump(substr($text_i,0,100));exit(); 
    } 
    return implode($key,$e); 
} 
Problemi correlati