{"id":255,"date":"2021-12-01T17:01:56","date_gmt":"2021-12-01T09:01:56","guid":{"rendered":"https:\/\/fugary.com\/?p=255"},"modified":"2021-12-02T16:42:38","modified_gmt":"2021-12-02T08:42:38","slug":"%e6%90%ad%e5%bb%bacode-push-server%e7%83%ad%e6%9b%b4%e6%96%b0cordova%e9%a1%b9%e7%9b%ae","status":"publish","type":"post","link":"https:\/\/fugary.com\/?p=255","title":{"rendered":"\u642d\u5efacode-push-server\u70ed\u66f4\u65b0Cordova\u9879\u76ee"},"content":{"rendered":"<h3>\u80cc\u666f<\/h3>\n<p>\u76ee\u524d\u5fae\u8f6f\u7684appcenter\u5df2\u7ecf\u4e0d\u518d\u63d0\u4f9bCordova\u7684code-push\u670d\u52a1\uff0c\u53ea\u80fd\u81ea\u5df1\u642d\u5efa\u670d\u52a1\u5668\u4e86\uff1a<\/p>\n<p>Cordova\u4e0d\u518d\u652f\u6301\uff1a<a href=\"https:\/\/devblogs.microsoft.com\/appcenter\/announcing-apache-cordova-retirement\/\">https:\/\/devblogs.microsoft.com\/appcenter\/announcing-apache-cordova-retirement\/<\/a><\/p>\n<p><code>Github<\/code>\u4e0a\u6709\u4e2a\u5f00\u6e90\u7248\u672c\uff0c\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/lisong\/code-push-server\">https:\/\/github.com\/lisong\/code-push-server<\/a><\/p>\n<p><strong>\u6ce8\u610f\uff0c\u8fd9\u4e2a\u4ed3\u5e932019\u5e74\u540e\u5c31\u6ca1\u66f4\u65b0\u4e86\uff0c\u53ea\u80fd\u4f7f\u7528\u6bd4\u8f83\u8001\u7684code-push\u7248\u672c<\/strong><\/p>\n<h3>\u4e0b\u8f7d\u5b89\u88c5<\/h3>\n<p>\u9700\u8981<code>Nodejs<\/code>\u73af\u5883\uff0c\u4ee5\u53ca<code>MySQL<\/code>\uff0c\u6700\u597d\u518d\u6709<code>Redis<\/code>\u548c<code>Nginx<\/code><\/p>\n<h4>\u5b89\u88c5Node\u73af\u5883<\/h4>\n<pre><code class=\"language-sh\"># \u4e0b\u8f7d\nwget https:\/\/nodejs.org\/dist\/v16.13.0\/node-v16.13.0-linux-x64.tar.xz\nsudo mkdir -p \/usr\/local\/lib\/nodejs\n# \u89e3\u538b\nsudo tar -xJvf node-v16.13.0-linux-x64.tar.xz -C \/usr\/local\/lib\/nodejs<\/code><\/pre>\n<p>\u914d\u7f6e\u73af\u5883\u53d8\u91cfpath<\/p>\n<pre><code class=\"language-sh\">vi .bash_profile\n#\u6dfb\u52a0\u4e00\u884c\nexport PATH=\/usr\/local\/lib\/nodejs\/node-v16.13.0-linux-x64\/bin:$PATH\n# \u5237\u65b0\nsource .bash_profile\n# \u6d4b\u8bd5\nnode -v\n# \u8f93\u51fa\uff1av16.13.0<\/code><\/pre>\n<h4>\u4ece\u4ed3\u5e93\u4e0b\u8f7d<\/h4>\n<p>\u4e0b\u8f7d code-push-server \u4ed3\u5e93<\/p>\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/lisong\/code-push-server.git\ncd code-push-server\n# \u5b89\u88c5\u4f9d\u8d56\nnpm install<\/code><\/pre>\n<h3>\u914d\u7f6ecode-push-server<\/h3>\n<p>\u9700\u8981\u914d\u7f6e\u6570\u636e\u5e93\u4ee5\u53ca\u6587\u4ef6\u5b58\u50a8\u8def\u5f84\uff0c<code>code-push-server<\/code>\u652f\u6301\u5f88\u591a\u79cd\u5bf9\u8c61\u5b58\u50a8\uff0c\u672c\u5730\u76f4\u63a5\u4f7f\u7528\u672c\u5730\u6587\u4ef6\u5b58\u50a8\u5373\u53ef\uff0cSTORAGE_TYPE=local<\/p>\n<h4>\u914d\u7f6econfig.js<\/h4>\n<p>\u627e\u5230config\/config.js\u914d\u7f6e\u6570\u636e\u5e93\u548c\u672c\u5730\u5b58\u50a8\u8def\u5f84<\/p>\n<h5>\u914d\u7f6e\u6570\u636e\u5e93<\/h5>\n<pre><code class=\"language-js\">\/\/ config\/config.js\ndb: {\n    username: process.env.RDS_USERNAME || &quot;root&quot;,\n    password: process.env.RDS_PASSWORD || &quot;xxxxx&quot;,\n    database: process.env.DATA_BASE || &quot;codepush&quot;,\n    host: process.env.RDS_HOST || &quot;127.0.0.1&quot;,\n    port: process.env.RDS_PORT || 3306,\n    dialect: &quot;mysql&quot;,\n    logging: false,\n    operatorsAliases: false,\n}<\/code><\/pre>\n<h5>\u914d\u7f6e\u672c\u5730\u5b58\u50a8<\/h5>\n<p>\u914d\u7f6e\u672c\u5730\u5b58\u50a8storageDir\u548cdataDir\uff0c\u5148\u628a\u76f8\u5173\u76ee\u5f55\u5efa\u597d\uff0c\u4e0d\u7136\u4f1a\u62a5\u9519\u3002<\/p>\n<pre><code class=\"language-sh\">mkdir -p \/root\/codepush\/storage \/root\/codepush\/data<\/code><\/pre>\n<p><strong>\u6ce8\u610f\uff1adownloadUrl\u6bd4\u8f83\u91cd\u8981\uff0capp\u8bbf\u95ee\u7684\u65f6\u5019\u9700\u8981\u914d\u7f6e\u6210\u53ef\u4ee5\u8bbf\u95ee\u7684\u5916\u7f51\u5730\u5740\u3002<\/strong><\/p>\n<pre><code class=\"language-js\">\/\/ \u914d\u7f6e\u672c\u5730\u5730\u5740\nlocal: {\n    storageDir: process.env.STORAGE_DIR || &quot;\/root\/codepush\/storage&quot;,\n    downloadUrl: process.env.LOCAL_DOWNLOAD_URL || &quot;http:\/\/codepush.xxxx.com\/download&quot;,\n    public: &#039;\/download&#039;\n},\ncommon: {\n    \/*\n     * tryLoginTimes is control login error times to avoid force attack.\n     * if value is 0, no limit for login auth, it may not safe for account. when it&#039;s a number, it means you can\n     * try that times today. but it need config redis server.\n     *\/\n    tryLoginTimes: 0,\n    \/\/ CodePush Web(https:\/\/github.com\/lisong\/code-push-web) login address.\n    \/\/codePushWebUrl: &quot;http:\/\/127.0.0.1:3001\/login&quot;,\n    \/\/ create patch updates&#039;s number. default value is 3\n    diffNums: 3,\n    \/\/ data dir for caclulate diff files. it&#039;s optimization.\n    dataDir: process.env.DATA_DIR || &#039;\/root\/codepush\/data&#039;,\n    \/\/ storageType which is your binary package files store. options value is (&quot;local&quot; | &quot;qiniu&quot; | &quot;s3&quot;| &quot;oss&quot; || &quot;tencentcloud&quot;)\n    storageType: process.env.STORAGE_TYPE || &quot;local&quot;,\n    \/\/ options value is (true | false), when it&#039;s true, it will cache updateCheck results in redis.\n    updateCheckCache: false,\n    \/\/ options value is (true | false), when it&#039;s true, it will cache rollout results in redis\n    rolloutClientUniqueIdCache: false,\n  }<\/code><\/pre>\n<h5>\u914d\u7f6eJwt\u5bc6\u7801<\/h5>\n<p>\u751f\u6210tokenSecret\uff0c\u914d\u7f6ejwt\uff0c\u968f\u673a\u4ea7\u751f\u4e00\u4e2a\u5c31\u53ef\u4ee5<\/p>\n<p><a href=\"https:\/\/www.grc.com\/passwords.htm\">https:\/\/www.grc.com\/passwords.htm<\/a><\/p>\n<pre><code class=\"language-js\">jwt: {\n    \/\/ Recommended: 63 random alpha-numeric characters\n    \/\/ Generate using: https:\/\/www.grc.com\/passwords.htm\n    tokenSecret: process.env.TOKEN_SECRET ||&#039;6GGSdSsY27vD6L0iIZUbuVjUnTjLuyxp3HEyCy9s85P085syYkOa8aAnGWefY3p&#039;\n  },<\/code><\/pre>\n<h4>\u521d\u59cb\u5316\u6570\u636e\u5e93<\/h4>\n<p>\u65b0\u5efa\u597d\u6570\u636e\u5e93\u4e4b\u540e\uff0c\u53ef\u4ee5\u6267\u884csql\u4e0b\u9762\u7684\u6587\u4ef6<\/p>\n<p><code>sql\/codepush-*.sql<\/code>\uff0c\u4e0d\u8fc7\u4e00\u822c\u7528\u547d\u4ee4\u521d\u59cb\u5316\u6570\u636e<\/p>\n<pre><code class=\"language-sh\">.\/bin\/db init --dbhost 127.0.0.1 --dbuser root --dbpassword &#039;yourPWD&#039;<\/code><\/pre>\n<h3>\u542f\u52a8code-push-server<\/h3>\n<h4>\u542f\u52a8code-push-server<\/h4>\n<p>\u8fd0\u884c\u547d\u4ee4\uff1a<\/p>\n<pre><code class=\"language-sh\">#\u540e\u53f0\u8fd0\u884c\nnohup .\/bin\/www &amp;\n# \u5982\u679c\u9000\u51fashellj\u505c\u6b62\u6267\u884c\uff0c\u53ef\u4ee5\u4f7f\u7528setsid\uff0c\u5728\u65b0\u4f1a\u8bdd\u4e2d\u6267\u884c\nsetsid .\/bin\/www &amp;\n#[2021-12-01T13:40:44.397] [INFO] startup - Listening on port 3000\ncurl localhost:3000\n# &lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;CodePushServer&lt;\/title&gt;...<\/code><\/pre>\n<h4>\u914d\u7f6enginx\u8bbf\u95ee<\/h4>\n<p>\u524d\u63d0\u5df2\u7ecf\u6709nginx\u670d\u52a1\u5668\u4e86\uff0c\u9700\u8981\u5728nginx\u7684\u914d\u7f6e\u6587\u4ef6\u626b\u63cf\u8def\u5f84\u4e0b\u589e\u52a0\u4e00\u4e2acodepush.conf<\/p>\n<pre><code>server {\n   server_name codepush.xxxx.com;\n   location \/ {\n     proxy_pass http:\/\/127.0.0.1:3000\/;\n   }\n}<\/code><\/pre>\n<pre><code class=\"language-sh\"># \u91cd\u542f\u670d\u52a1\nnginx -s reload<\/code><\/pre>\n<h3>code-push\u5ba2\u6237\u7aef\u8bbf\u95ee<\/h3>\n<h4>\u5b89\u88c5\u4f7f\u7528code-push-cli<\/h4>\n<p>\u9700\u8981\u964d\u7ea7\u4f7f\u7528code-push-cli\uff0c\u6700\u65b0\u76843.0.0\u4e0d\u517c\u5bb9\uff08\u8fc1\u79fb\u5230\u5fae\u8f6fappcenter\u4e86\uff09\uff0c\u9ed8\u8ba4\u8d26\u6237\u5bc6\u7801\uff1a<code>admin\/123456<\/code><\/p>\n<p>\u8df3\u8f6c\u5230\uff1a<a href=\"http:\/\/codepush.xxxx.com\/auth\/login?hostname=xxxxx\">http:\/\/codepush.xxxx.com\/auth\/login?hostname=xxxxx<\/a><\/p>\n<pre><code class=\"language-shell\">npm i code-push-cli@2.1.9 -g\ncode-push login http:\/\/codepush.xxxx.com\n# Successfully logged-in. Your session file was written to C:\\Users\\gary.fu\\AppData\\Local\\.code-push.config. You can run the code-push logout command at any time to delete this file and terminate your session.<\/code><\/pre>\n<p>\u767b\u5f55\uff1a<\/p>\n<p><div class='fancybox-wrapper' data-fancybox='post-images' href='https:\/\/git.mengqingpo.com:8888\/fugary\/blogpic1\/-\/raw\/master\/images\/20211201143723.png'><img src=\"https:\/\/git.mengqingpo.com:8888\/fugary\/blogpic1\/-\/raw\/master\/images\/20211201143723.png\" alt=\"\" \/><\/div><\/p>\n<p>\u767b\u5f55\u6210\u529f\u540e\u590d\u5236Token\uff0c\u586b\u5165\u547d\u4ee4\u884c\u63d0\u793a\u4e2d\u3002<\/p>\n<p><div class='fancybox-wrapper' data-fancybox='post-images' href='https:\/\/git.mengqingpo.com:8888\/fugary\/blogpic1\/-\/raw\/master\/images\/20211201143726.png'><img src=\"https:\/\/git.mengqingpo.com:8888\/fugary\/blogpic1\/-\/raw\/master\/images\/20211201143726.png\" alt=\"2\" \/><\/div><\/p>\n<h4>\u521b\u5efaapp<\/h4>\n<p>\u767b\u5f55\u6210\u529f\u4e4b\u540e\uff1a<\/p>\n<pre><code class=\"language-shell\"># \u521b\u5efa\u5e94\u7528\ncode-push app add ConnectApp Android Cordova\ncode-push app add ConnectAppIOS iOS Cordova\n# \u67e5\u770b\u5217\u8868\ncode-push app list\n# \u67e5\u770bkeys\ncode-push deployment list ConnectApp --displayKeys<\/code><\/pre>\n<h3>Codova\u4e2d\u4f7f\u7528<\/h3>\n<h4>\u914d\u7f6ecordova\u63d2\u4ef6<\/h4>\n<p>\u9700\u8981\u5b89\u88c5cordova-plugin-code-push\u63d2\u4ef6\u3002<\/p>\n<p>\u914d\u7f6econfig.xml<\/p>\n<pre><code class=\"language-xml\">&lt;platform name=&quot;android&quot;&gt;\n    &lt;!--Production\u751f\u4ea7\u73af\u5883--&gt;\n    &lt;preference name=&quot;CodePushDeploymentKey&quot; value=&quot;Pni_8l4_HHxGEm5d0x31vWxb8xxxxxxxxxx&quot; \/&gt;\n    &lt;preference name=&quot;CodePushServerURL&quot; value=&quot;http:\/\/codepush.xxxxx.com&quot; \/&gt;\n&lt;\/platform&gt;\n&lt;platform name=&quot;ios&quot;&gt;\n    &lt;!--Production\u751f\u4ea7\u73af\u5883--&gt;\n    &lt;preference name=&quot;CodePushDeploymentKey&quot; value=&quot;Pni_8l4_HHxGEm5d0x31vWxbxxxxxxxxxxxxx&quot; \/&gt;\n    &lt;preference name=&quot;CodePushServerURL&quot; value=&quot;http:\/\/codepush.xxxxx.com&quot; \/&gt;\n&lt;\/platform&gt;<\/code><\/pre>\n<h4>\u53d1\u5e03Release<\/h4>\n<p>\u4f7f\u7528code-push\u53d1\u5e03\u547d\u4ee4\uff0cAndroid\u548ciOS\u9700\u8981\u5206\u5f00\u4e24\u4e2a\u53d1\u5e03\uff1a<\/p>\n<pre><code class=\"language-shell\">code-push release-cordova ConnectApp Android -d Production --description &quot;new android release&quot;\ncode-push release-cordova ConnectAppIOS iOS -d Production --description &quot;new ios release&quot;<\/code><\/pre>\n<h4>App\u4e2d\u8c03\u7528<\/h4>\n<p>\u5728Cordova\u7684App\u4e2d\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-js\">if (window.cordova &amp;&amp; window.codePush) {\n     window.codePush.sync() \/\/ \u9ed8\u8ba4ON_NEXT_RESTART\u5b89\u88c5\n}<\/code><\/pre>\n<h3>\u8d26\u6237\u7ba1\u7406<\/h3>\n<p>\u9ed8\u8ba4\u8d26\u6237\u662fadmin\uff0c\u53ef\u4ee5\u4fee\u6539\u5bc6\u7801\u4f7f\u7528\uff0c\u4e5f\u53ef\u4ee5\u6ce8\u518c\u65b0\u8d26\u53f7<\/p>\n<h4>\u4fee\u6539\u9ed8\u8ba4\u5bc6\u7801<\/h4>\n<p>\u4f7f\u7528curl\u547d\u4ee4\u4fee\u6539\u5bc6\u7801\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528code-push-web\u5ba2\u6237\u7aef\uff0c\u6ce8\u610f\u9700\u8981\u4f7f\u7528\u767b\u5f55\u83b7\u53d6\u7684Token\u3002<\/p>\n<pre><code class=\"language-sh\">curl -X PATCH -H &quot;Authorization: Bearer ${token}&quot; -H &quot;Accept: application\/json&quot; -H &quot;Content-Type:application\/json&quot; -d &#039;{&quot;oldPassword&quot;:&quot;123456&quot;,&quot;newPassword&quot;:&quot;654321&quot;}&#039; http:\/\/127.0.0.1:3000\/users\/password \n# \u54cd\u5e94{&quot;status&quot;:&quot;OK&quot;}\u8868\u793a\u6210\u529f\u4e86\uff0c\u53ef\u4ee5\u4f7f\u7528\u65b0\u5bc6\u7801\u767b\u5f55<\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u5728\u542f\u52a8code-push-web\u4e4b\u540e\u56fe\u5f62\u754c\u9762\u4e2d\u4fee\u6539\u5bc6\u7801\u3002<\/p>\n<h4>\u6ce8\u518c\u8d26\u53f7<\/h4>\n<p>\u6ce8\u518c\u8d26\u53f7\u4f3c\u4e4e\u53ea\u80fd\u7528code-push-web\u5ba2\u6237\u7aef\u64cd\u4f5c\uff0c\u547d\u4ee4\u884c\u4f3c\u4e4e\u6ca1\u6709\u6548\u679c\uff0c\u5728\u81ea\u5df1\u672c\u5730\u542f\u52a8\u5ba2\u6237\u7aef\u5373\u53ef<\/p>\n<p><strong>\u6ce8\u610f\uff1a\u6ce8\u518c\u9700\u8981\u53d1\u9001\u6fc0\u6d3b\u90ae\u4ef6\uff0ccode-push-server\u9700\u8981\u914d\u7f6e\u4e86smtp\u76f8\u5173\u914d\u7f6e\uff1a<\/strong><\/p>\n<pre><code class=\"language-js\">smtpConfig:{\n    host: &quot;smtp.163.com&quot;,\n    port: 465,\n    secure: true,\n    auth: {\n      user: &quot;&quot;,\n      pass: &quot;&quot;\n    }\n  },<\/code><\/pre>\n<h5>\u4e0b\u8f7dcode-push-web<\/h5>\n<p>\u4e0b\u8f7d\u5ba2\u6237\u7aef\uff1a<\/p>\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/lisong\/code-push-web.git\ncd code-push-web\nnpm install<\/code><\/pre>\n<h5>\u4fee\u6539\u914d\u7f6e\u5e76\u542f\u52a8<\/h5>\n<p>\u4fee\u6539src\/config.js\u6587\u4ef6<\/p>\n<pre><code class=\"language-js\">export const common = {\n  api: {\n    URL: &#039;http:\/\/codepush.xxx.com&#039;, \/\/ production code-push-server address\n    devURL: &#039;http:\/\/codepush.xxx.com&#039;, \/\/ development code-push-server address\n  },\n};<\/code><\/pre>\n<p>\u542f\u52a8\uff1a<\/p>\n<pre><code class=\"language-sh\">npm start\n# http:\/\/localhost:3000<\/code><\/pre>\n<p>\u5269\u4e0b\u7684\u90fd\u662f\u56fe\u5f62\u754c\u9762\u64cd\u4f5c\uff0c\u8fd9\u91cc\u4e0d\u518d\u622a\u56fe\u4e86\u3002<\/p>\n<h3>\u914d\u7f6e\u81ea\u52a8\u91cd\u542f<\/h3>\n<p>code-push-server\u4f3c\u4e4e\u4e0d\u662f\u5f88\u7a33\u5b9a\uff0c\u5bb9\u6613\u5d29\u6e83\uff0c\u53ef\u4ee5\u4f7f\u7528pm2\u7ba1\u7406\u8d77\u6765\uff0c\u81ea\u52a8\u91cd\u542f<\/p>\n<p>\u4e0b\u8f7dpm2<\/p>\n<pre><code class=\"language-sh\">npm install -g pm2\n# \u542f\u52a8\npm2 start .\/bin\/www --watch<\/code><\/pre>\n<p>\u67e5\u770b\u72b6\u6001<\/p>\n<pre><code class=\"language-sh\">pm2 status\n##################\n\u250c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 id \u2502 name               \u2502 mode     \u2502 \u21ba    \u2502 status    \u2502 cpu      \u2502 memory   \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 0  \u2502 www                \u2502 fork     \u2502 32   \u2502 online    \u2502 0%       \u2502 70.6mb   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<p>pm2\u7684\u6587\u6863\u5730\u5740\uff1a<a href=\"https:\/\/pm2.keymetrics.io\/docs\/usage\/quick-start\/\">https:\/\/pm2.keymetrics.io\/docs\/usage\/quick-start\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u80cc\u666f \u76ee\u524d\u5fae\u8f6f\u7684appcenter\u5df2\u7ecf\u4e0d\u518d\u63d0\u4f9bCordova\u7684code-push\u670d\u52a1\uff0c\u53ea\u80fd\u81ea\u5df1\u642d\u5efa\u670d\u52a1\u5668\u4e86\uff1a  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6,4],"tags":[],"_links":{"self":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/255"}],"collection":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=255"}],"version-history":[{"count":2,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/255\/revisions"}],"predecessor-version":[{"id":257,"href":"https:\/\/fugary.com\/index.php?rest_route=\/wp\/v2\/posts\/255\/revisions\/257"}],"wp:attachment":[{"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fugary.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}