getGameSourceUrl($gameSource)); if ($zipGameSource) { while ($zipEntry = zip_read($zipGameSource)) { if (preg_match("/^Payload.*?\.app/", zip_entry_name($zipEntry), $matches)) { $preUrl = $matches[0]; break; } } zip_close($zipGameSource); } $configUrl = $preUrl . '/_CodeSignature/TXChannel'; } return $configUrl; } public function getGameSourceUrl($gameSource) { if (empty($gameSource)) { return ''; } $path = ''; if($gameSource['file_type'] == 1){ $path = './Uploads/SourcePack/'; }else{ $path = './Uploads/Ios/original/'; } $fileUrl = $path . $gameSource['file_name']; return ROOTTT . ltrim($fileUrl, './'); } public function packChannelInfo($zipFile, $distFile, array $packData) { $zip = new \ZipArchive(); if ($zip->open($zipFile, \ZipArchive::CREATE)) { $zip->addFromString($distFile, json_encode($packData)); $zip->close(); return true; } return false; } /** * 原包打包 */ public function sourcePack($gameSource, $game) { $relativeUrl = $gameSource['file_url']; $localPath = ROOTTT . ltrim($relativeUrl, './'); $packData = [ 'game_id' => $game['id'], 'game_name' => $game['game_name'], 'game_appid' => $game['game_appid'], 'promote_id' => 0, 'promote_account' => '自然注册', 'source_version' => $gameSource['source_version'], ]; $originalUrl = ''; if ($game['sdk_version'] == 2) { $oldLocalPath = $localPath; $localPath = str_replace('Uploads/SourcePack', 'Uploads/Ios/original', $oldLocalPath); $originalUrl = $relativeUrl; copy($oldLocalPath, $localPath); } $channelConfigFile = $this->getChannelConfigFile($gameSource); $status = $this->packChannelInfo($localPath, $channelConfigFile, $packData); if (!$status) { return [ 'status' => false, 'message' => '打包失败,原包加入信息失败!', ]; } $distFilePath = 'SourcePack/' . $gameSource['file_name']; $result = $this->uploadPackage($localPath, $distFilePath); $fileUrl = ''; if ($result['status']) { $fileUrl = $result['data']['url']; $fileUrl = $fileUrl == '@' ? $relativeUrl : $fileUrl; } else { return [ 'status' => false, 'message' => '打包失败,上传OSS失败!' . $result['message'], ]; } $plistUrl = ''; $orgPlistUrl = ''; if ($game['sdk_version'] == 2) { $params = [ 'domain' => '', 'packageName' => $gameSource['bao_name'], 'gameId' => $game['id'], 'promoteId' => 0, 'packageUrl' => $fileUrl, 'gameIcon' => '', 'type' => 'pack' ]; $result = $this->createPlist($params); if ($result['status']) { $plistUrl = $result['data']['path']; } else { return [ 'status' => false, 'message' => '打包失败,生成plist文件失败!' . $result['message'], ]; } $params['type'] = 'org'; $result = $this->createPlist($params); if ($result['status']) { $orgPlistUrl = $result['data']['path']; } else { return [ 'status' => false, 'message' => '打包失败,生成原包plist文件失败!' . $result['message'], ]; } } return [ 'status' => true, 'message' => '打包成功!', 'data' => [ 'plistUrl' => $plistUrl, 'orgPlistUrl' => $orgPlistUrl, 'fileUrl' => $fileUrl, 'originalUrl' => $originalUrl, ] ]; } /** * 渠道打包 */ public function channelPack($gameSource, $game, $apply, $launchCount = 0) { $gameSourceUrl = $this->getGameSourceUrl($gameSource); if ($gameSource == null || !file_exists($gameSourceUrl)) { M('apply', 'tab_')->where(['id' => $apply['id']])->setField('enable_status', -1); } /* 检测是否存在投放申请,存在则更改投放申请信息,否则进行渠道打包 */ if ($launchCount > 0) { M('apply', 'tab_')->where(['id' => $apply['id']])->setField('enable_status', 3); $launchData = ['launch_packge' => 2, 'launch_down_url'=>'' , 'launch_plist_url'=>'']; M('apply_launch', 'tab_')->where(['apply_id' => $apply['id'], 'launch_packge'=>['in', [0, 2, 3]]])->save($launchData); } $savePath = ''; $fileName = 'game_package' . $apply['game_id'] . '-' . $apply['promote_id']; if ($apply['sdk_version'] == 1) { $fileName .= '.apk'; $savePath = 'Uploads/GamePack/' . $fileName; } else { $fileName .= '.ipa'; $savePath = 'Uploads/IosGamePack/' . $fileName; } $relativePath = './' . $savePath; $localPath = ROOTTT . $savePath; copy($gameSourceUrl, $localPath); $packData = [ 'game_id' => $apply['game_id'], 'game_name' => $apply['game_name'], 'game_appid' => $game['game_appid'], 'promote_id' => $apply['promote_id'], 'promote_account' => $apply['promote_account'], 'source_version' => $gameSource['source_version'], ]; $channelConfigFile = $this->getChannelConfigFile($gameSource); $status = $this->packChannelInfo($localPath, $channelConfigFile, $packData); if (!$status) { return [ 'status' => false, 'message' => '打包失败,加入渠道信息失败!', ]; } $distFilePath = 'GamePack/' . $fileName; $result = $this->uploadPackage($localPath, $distFilePath, false); if ($result['status']) { $packageUrl = $result['data']['url']; $packageUrl = $packageUrl == '@' ? $relativePath : $packageUrl; } else { return [ 'status' => false, 'message' => '打包失败,上传OSS失败!' . $result['message'], ]; } $plistInfo = ['game_id' => $apply['game_id'], 'promote_id' => $apply['promote_id']]; $plistUrl = ''; if ($apply['sdk_version'] == 2) { $params = [ 'domain' => '', 'packageName' => $gameSource['bao_name'], 'gameId' => $game['id'], 'promoteId' => $apply['promote_id'], 'packageUrl' => $packageUrl, 'gameIcon' => '', 'type' => 'pack' ]; $result = $this->createPlist($params); if ($result['status']) { $plistUrl = $result['data']['path']; } else { return [ 'status' => false, 'message' => '打包失败,生成plist文件失败!' . $result['message'], ]; } } $applyService = new ApplyService(); $applyService->updateAfterPack($apply, $packageUrl, $plistUrl); return [ 'status' => true, 'message' => '打包成功!', 'data' => [ 'plistUrl' => $plistUrl, ] ]; } public function uploadPackage($localFilePath, $distFilePath, $isDeleteLocal = false) { if (get_tool_status('oss_storage') == 1) { $ossService = new OssService(); $result = $ossService->upload($localFilePath, $distFilePath); if ($isDeleteLocal && file_exists($localFilePath)) { @unlink($localFilePath); } return $result; } else { // 不上传OSS等第三方服务器 return [ 'status' => true, 'message' => '上传成功', 'data' => [ 'url' => '@' ], ]; } } //生成游戏渠道plist文件 public function createPlist($params) { $domain = $params['domain'] ?? ''; $packageName = $params['packageName'] ?? ''; $gameId = $params['gameId'] ?? 0; $promoteId = $params['promoteId'] ?? 0; $packageUrl = $params['packageUrl'] ?? ''; $platformId = $params['platformId'] ?? 0; $position = $params['position'] ?? 0; $gameIcon = $params['gameIcon'] ?? ''; $type = $params['type'] ?? ''; if ($gameId == 0) { return [ 'status' => false, 'message' => '游戏ID错误', ]; } if ($type == '' || !in_array($type, ['org', 'pack'])) { return [ 'status' => false, 'message' => '类型错误', ]; } $xml = new \DOMDocument(); $xml->load(ROOTTT . 'Uploads/Plist/testdemo.Plist'); $online = $xml->getElementsByTagName('dict'); //查找节点 $elements = $online->item(1)->getElementsByTagName('string'); //第二个节点下所有string foreach ($elements as $element) { switch ($element->textContent) { case 'ipa_url': if (preg_match("/http/", $packageUrl)) { $element->nodeValue = $packageUrl; } else { $element->nodeValue = "https://" . $domain . ltrim($packageUrl, '.'); } break; case 'icon': if (preg_match("/http/", $gameIcon)) { $element->nodeValue = $gameIcon; } else { $element->nodeValue = "https://" . $domain . $gameIcon; } break; case 'com.dell': $element->nodeValue = $packageName; break; case '1.0.0': $element->nodeValue = false; break; case 'mchdemo': $element->nodeValue = false; break; } } $fileName = ''; if ($type == 'pack') { if ($promoteId == 0) { $fileName = 'Uploads/SourcePlist/'. $gameId . '.Plist'; } elseif ($platformId > 0) { $fileName = 'Uploads/GamePlist/'. $gameId . '-' . $promoteId . '-' . $platformId . '-' .$position . '.Plist'; } else { $fileName = 'Uploads/GamePlist/'. $gameId . '-' . $promoteId . '.Plist'; } } elseif ($type == 'org') { $fileName = 'Uploads/OrgSourcePlist/'. $gameId . '.Plist'; } $xml->save('./' . $fileName); return [ 'status' => true, 'message' => '生成成功', 'data' => [ 'path' => './' . $fileName ] ]; } }