*/ class PlistParser { const IS_SELF_PARSER = false; const PREG_INFO_PLIST = "/^Payload.*?\.app\/Info.plist$/"; private $xml; private $plist; public function openFromIpa($ipaFile, $preg) { $zip = new ZipArchive; if ($zip->open($ipaFile) === true) { $index = -1; for( $i = 0; $i < $zip->numFiles; $i++ ){ $stat = $zip->statIndex($i); if (preg_match($preg, $stat['name'], $matches)) { $index = $stat['index']; } } $content = $zip->getFromIndex($index); $zip->close(); if ($content){ if (self::IS_SELF_PARSER) { $xml = new \DOMDocument(); $xml->loadXML($content); $this->xml = $xml; } else { $plist = new CFPropertyList(); $plist->parseBinary($content); $this->plist = $plist; } return true; } } return false; } public function open($xmlFile) { $xml = new \DOMDocument(); $xml->load($xmlFile); $this->xml = $xml; return true; } public function getResult() { if (self::IS_SELF_PARSER) { $plistTag = $this->xml->getElementsByTagName('plist'); $dict = $plistTag->item(0)->childNodes->item(1); return $this->parseDictNode($dict); } else { return $this->plist->toArray(); } } public function parseDictNode($parentNode) { $lastKey = ''; $dict = []; foreach ($parentNode->childNodes as $node) { if ($node instanceof \DOMElement) { if ($node->nodeName == 'key') { $lastKey = $node->textContent; } else { if ($node->nodeName == 'dict') { $dict[$lastKey] = $this->parseDictNode($node); } elseif ($node->nodeName == 'array') { $dict[$lastKey] = $this->parseArrayNode($node); } elseif($node->nodeName == 'true') { $dict[$lastKey] = true; } elseif($node->nodeName == 'false') { $dict[$lastKey] = false; } else { $dict[$lastKey] = $node->textContent; } } } } return $dict; } public function parseArrayNode($parentNode) { $list = []; foreach ($parentNode->childNodes as $node) { if ($node instanceof \DOMElement) { if ($node->nodeName == 'dict') { $list[] = $this->parseDictNode($node); } elseif ($node->nodeName == 'array') { $list[] = $this->parseArrayNode($node); } elseif($node->nodeName == 'true') { $list[] = true; } elseif($node->nodeName == 'false') { $list[] = false; } else { $list[] = $node->textContent; } } } return $list; } }