<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>わタしの ブログ</title>
  <subtitle>watasi的博客</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://watasi.cn/"/>
  <updated>2017-08-11T10:55:08.097Z</updated>
  <id>http://watasi.cn/</id>
  
  <author>
    <name>わタし</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>使用Android Studio开发MUI插件入坑指南</title>
    <link href="http://watasi.cn/2017/08/11/%E4%BD%BF%E7%94%A8Android%20Studio%E5%BC%80%E5%8F%91MUI%E6%8F%92%E4%BB%B6%E5%85%A5%E5%9D%91%E6%8C%87%E5%8D%97/"/>
    <id>http://watasi.cn/2017/08/11/使用Android Studio开发MUI插件入坑指南/</id>
    <published>2017-08-11T10:15:43.597Z</published>
    <updated>2017-08-11T10:55:08.097Z</updated>
    
    <content type="html"><![CDATA[<p><strong>写在前面，该入坑指南是以<code>Mob</code>发送短信验证码为例，实现MUI第三方插件的开发，仅供参考。</strong></p>
<figure class="image-bubble">
                <div class="img-lightbox">
                    <div class="overlay"></div>
                    <img src="http://img-cdn-qiniu.dcloud.net.cn/uploads/article/20141017/6e2bd27ff777bed57750a5b3b6143a0f.png" alt="123" title="">
                </div>
                <div class="image-caption">123</div>
            </figure>
<blockquote>
<p>HTML5+ 基座扩展采用三层结构，JS层、PluginBridge层和Native层。 三层功能分别是：<br>JS层： 在Webview页面调用，触发Native层代码，获取执行结果。<br>PluginBridge层： 将JS层请求进行处理，触发Native层扩展插件代码。<br>Native层： 插件扩展的平台原生代码，负责执行业务逻辑并执行结果返回到请求页面。</p>
<h3 id="1-预备环境"><a href="#1-预备环境" class="headerlink" title="1. 预备环境"></a>1. 预备环境</h3><ul>
<li>AndroidStudio开发环境,要求安装Android4.0或以上（API 14）SDK</li>
<li>下载HBuilder离线打包Android版SDK（<a href="http://ask.dcloud.net.cn/article/103" target="_blank" rel="external">5+SDK下载</a>）</li>
</ul>
</blockquote>
<h4 id="1-1-离线SDK目录结构"><a href="#1-1-离线SDK目录结构" class="headerlink" title="1.1 离线SDK目录结构"></a>1.1 离线SDK目录结构</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">|-HBuilder-Hello			// 离线打包演示应用</div><div class="line">|-HBuilder-Integrate		// 5+ SDK 集成和插件开发示例</div><div class="line">|-SDK						// SDK库文件目录</div><div class="line">|-Feature-Android.xls		// Android平台各扩展Feature API对应的permission</div><div class="line">|-readme.txt				// 版本说明文件</div><div class="line">|-重要提示.txt</div></pre></td></tr></table></figure>
<h3 id="2-配置编译工程"><a href="#2-配置编译工程" class="headerlink" title="2. 配置编译工程"></a>2. 配置编译工程</h3><p>使用Android Studio创建一个新的Android项目</p>
<h4 id="2-1-导入jar包"><a href="#2-1-导入jar包" class="headerlink" title="2.1 导入jar包"></a>2.1 导入jar包</h4><ul>
<li><code>SDK/libs/</code>目录中选择需要导入的jar包，导入到<code>工程目录的libs</code>下。<br>根据<a href="http://ask.dcloud.net.cn/article/924" target="_blank" rel="external">官方文档</a>，至少需要添加<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">pdr.jar</div><div class="line">ui.jar</div><div class="line">nineoldandroids-2.4.0.jar</div><div class="line">my-imageloader.jar</div><div class="line">my-nineoldandroids-2.4.0.jar</div></pre></td></tr></table></figure>
</li>
</ul>
<blockquote>
<p>在<code>SDK/libs</code>目录下并没有找到<code>nineoldandroids-2.4.0.jar</code>，所以并没有导入<code>nineoldandroids-2.4.0.jar</code>。</p>
</blockquote>
<p>这里贴出我导入的jar包<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">// Mob</div><div class="line">MobCommons-2017.0607.1736.jar</div><div class="line">MobTools-2017.0607.1736.jar</div><div class="line">SMSSDK-3.0.0.aar</div><div class="line">SMSSDKGUI-3.0.0.aar</div><div class="line"></div><div class="line">// MUI</div><div class="line">my-imageloader.jar</div><div class="line">my-nineoldandroids-2.4.0.jar</div><div class="line">pdr.jar</div><div class="line">ui.jar</div></pre></td></tr></table></figure></p>
<p>添加成功后选中libs目录里的库文件，鼠标右键打开菜单，选择“Add As Library…”将填加到工程内的jar文件链接到工程里</p>
<h4 id="2-2-添加资源到工程中"><a href="#2-2-添加资源到工程中" class="headerlink" title="2.2 添加资源到工程中"></a>2.2 添加资源到工程中</h4><ul>
<li>打开工程目录的<code>res</code>文件夹，删除目录下已有的目录</li>
<li>拷贝<code>SDK/res</code>目录下的全部目录到工程的res目录下</li>
<li>在<code>app-&gt;src-&gt;main</code>目录下添加<code>assets</code>目录</li>
<li>拷贝<code>SDK/assets/</code>目录下的<code>data</code>目录和<code>res</code>目录到工程的目录下</li>
</ul>
<h3 id="3-修改原生工程的Androidmanifest-xml文件"><a href="#3-修改原生工程的Androidmanifest-xml文件" class="headerlink" title="3. 修改原生工程的Androidmanifest.xml文件"></a>3. 修改原生工程的Androidmanifest.xml文件</h3><h4 id="3-1-修改application节点"><a href="#3-1-修改application节点" class="headerlink" title="3.1 修改application节点"></a>3.1 修改application节点</h4><ul>
<li>修改android:icon属性值为@drawable/icon</li>
<li>删除android:theme属性</li>
<li>删除allowBackup属性</li>
<li>添加android:largeHeap=”true”</li>
<li>添加 android:name=”io.dcloud.application.DCloudApplication”</li>
<li>添加android:allowClearUserData=”true”</li>
</ul>
<p><strong><code>注意：</code></strong> <a href="#41-entryactivity">点击这里</a>查看<code>io.watasi.EntryActivity</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line">&lt;application</div><div class="line">        android:allowClearUserData=&quot;true&quot;</div><div class="line">        android:icon=&quot;@drawable/icon&quot;</div><div class="line">        android:label=&quot;@string/app_name&quot;</div><div class="line">        android:largeHeap=&quot;true&quot;</div><div class="line">        android:name=&quot;com.mob.MobApplication&quot;&gt;</div><div class="line">        &lt;activity</div><div class="line">			android:name=&quot;io.watasi.EntryActivity&quot;</div><div class="line">			android:configChanges=&quot;orientation|keyboardHidden|keyboard|navigation&quot;</div><div class="line">            android:label=&quot;@string/app_name&quot;</div><div class="line">            android:launchMode=&quot;singleTask&quot;</div><div class="line">            android:hardwareAccelerated=&quot;true&quot;</div><div class="line">            android:theme=&quot;@style/TranslucentTheme&quot;</div><div class="line">            android:screenOrientation=&quot;user&quot;</div><div class="line">            android:windowSoftInputMode=&quot;adjustResize&quot; &gt;</div><div class="line">            &lt;intent-filter&gt;</div><div class="line">                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;</div><div class="line"></div><div class="line">                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;</div><div class="line">            &lt;/intent-filter&gt;</div><div class="line">        &lt;/activity&gt;</div><div class="line"></div><div class="line">        &lt;activity</div><div class="line">            android:name=&quot;com.mob.tools.MobUIShell&quot;</div><div class="line">            android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar&quot;</div><div class="line">            android:configChanges=&quot;keyboardHidden|orientation|screenSize&quot;</div><div class="line">            android:windowSoftInputMode=&quot;stateHidden|adjustResize&quot;/&gt;</div><div class="line"></div><div class="line">        &lt;meta-data android:name=&quot;Mob-AppKey&quot; android:value=&quot;f8be3fe06a28&quot;/&gt;</div><div class="line">        &lt;meta-data android:name=&quot;Mob-AppSecret&quot; android:value=&quot;d8add527dce9a9ba67cb8003ca49b937&quot;/&gt;</div><div class="line"></div><div class="line"></div><div class="line">        &lt;service</div><div class="line">          android:name=&quot;io.dcloud.common.adapter.io.MiniServerService&quot;</div><div class="line">            android:exported=&quot;true&quot; /&gt;</div><div class="line"></div><div class="line">    &lt;/application&gt;</div></pre></td></tr></table></figure></p>
<h4 id="3-2-添加文件支持的屏幕旋转方向"><a href="#3-2-添加文件支持的屏幕旋转方向" class="headerlink" title="3.2 添加文件支持的屏幕旋转方向"></a>3.2 添加文件支持的屏幕旋转方向</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&lt;supports-screens</div><div class="line">        android:anyDensity=&quot;true&quot;</div><div class="line">        android:largeScreens=&quot;true&quot;</div><div class="line">        android:normalScreens=&quot;true&quot;</div><div class="line">        android:resizeable=&quot;true&quot;</div><div class="line">        android:smallScreens=&quot;true&quot; /&gt;</div></pre></td></tr></table></figure>
<h4 id="3-3-添加最低支持系统版本"><a href="#3-3-添加最低支持系统版本" class="headerlink" title="3.3 添加最低支持系统版本"></a>3.3 添加最低支持系统版本</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&lt;!--5 sdk支持的最低系统版本为8--&gt;</div><div class="line">&lt;uses-sdk android:minSdkVersion=&quot;8&quot; /&gt;</div></pre></td></tr></table></figure>
<h4 id="3-4-添加5-SDK必需引用的系统权限"><a href="#3-4-添加5-SDK必需引用的系统权限" class="headerlink" title="3.4 添加5+SDK必需引用的系统权限"></a>3.4 添加5+SDK必需引用的系统权限</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&lt;!-- HBuilder Runtime 基础权限   begin --&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;/&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.GET_TASKS&quot; /&gt;</div><div class="line">&lt;!-- Html5Plus runtime基础权限   end --&gt;</div></pre></td></tr></table></figure>
<h4 id="3-5-添加Mob必须的系统权限"><a href="#3-5-添加Mob必须的系统权限" class="headerlink" title="3.5 添加Mob必须的系统权限"></a>3.5 添加Mob必须的系统权限</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&lt;uses-permission android:name=&quot;android.permission.READ_CONTACTS&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.RECEIVE_SMS&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.READ_SMS&quot; /&gt;</div><div class="line">&lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&gt;</div></pre></td></tr></table></figure>
<h4 id="3-6-贴出整个Androidmanifest-xml文件"><a href="#3-6-贴出整个Androidmanifest-xml文件" class="headerlink" title="3.6 贴出整个Androidmanifest.xml文件"></a>3.6 贴出整个Androidmanifest.xml文件</h4><ul>
<li><code>android:versionCode</code>与<code>mainfest.json</code>下的<code>version-&gt;code</code>一致</li>
<li><code>android:versionName</code>与<code>mainfest.json</code>下的<code>version-&gt;name</code>一致<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div></pre></td><td class="code"><pre><div class="line">&lt;!--package=&quot;com.hyxk.ggmall.personal&quot;--&gt;</div><div class="line">&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;</div><div class="line">          android:versionCode=&quot;83&quot;      // 注意阅读上面</div><div class="line">          android:versionName=&quot;1.0.0&quot;   // 注意阅读上面</div><div class="line">          package=&quot;com.infozx.yaoqingba&quot;&gt;</div><div class="line"></div><div class="line">    &lt;supports-screens</div><div class="line">        android:anyDensity=&quot;true&quot;</div><div class="line">        android:largeScreens=&quot;true&quot;</div><div class="line">        android:normalScreens=&quot;true&quot;</div><div class="line">        android:resizeable=&quot;true&quot;</div><div class="line">        android:smallScreens=&quot;true&quot; /&gt;</div><div class="line"></div><div class="line">    &lt;uses-sdk android:minSdkVersion=&quot;8&quot; /&gt;</div><div class="line">    &lt;!-- HBuilder Runtime 基础权限   begin --&gt;</div><div class="line">    &lt;!-- 联网 --&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;</div><div class="line">    &lt;!-- 使用存储卡 --&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;</div><div class="line"></div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;/&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.GET_TASKS&quot; /&gt;</div><div class="line">    &lt;!-- Html5Plus runtime基础权限   end --&gt;</div><div class="line"></div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.READ_CONTACTS&quot; /&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot; /&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.RECEIVE_SMS&quot; /&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.READ_SMS&quot; /&gt;</div><div class="line">    &lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&gt;</div><div class="line"></div><div class="line">    &lt;application</div><div class="line">        android:allowClearUserData=&quot;true&quot;</div><div class="line">        android:icon=&quot;@drawable/icon&quot;</div><div class="line">        android:label=&quot;@string/app_name&quot;</div><div class="line">        android:largeHeap=&quot;true&quot;</div><div class="line">        android:name=&quot;com.mob.MobApplication&quot;&gt;</div><div class="line">        &lt;activity</div><div class="line">            android:name=&quot;io.watasi.EntryActivity&quot;</div><div class="line">            android:configChanges=&quot;orientation|keyboardHidden|keyboard|navigation&quot;</div><div class="line">            android:label=&quot;@string/app_name&quot;</div><div class="line">            android:launchMode=&quot;singleTask&quot;</div><div class="line">            android:hardwareAccelerated=&quot;true&quot;</div><div class="line">            android:theme=&quot;@style/TranslucentTheme&quot;</div><div class="line">            android:screenOrientation=&quot;user&quot;</div><div class="line">            android:windowSoftInputMode=&quot;adjustResize&quot; &gt;</div><div class="line">            &lt;intent-filter&gt;</div><div class="line">                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;</div><div class="line"></div><div class="line">                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;</div><div class="line">            &lt;/intent-filter&gt;</div><div class="line">        &lt;/activity&gt;</div><div class="line"></div><div class="line">        &lt;activity</div><div class="line">            android:name=&quot;com.mob.tools.MobUIShell&quot;</div><div class="line">            android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar&quot;</div><div class="line">            android:configChanges=&quot;keyboardHidden|orientation|screenSize&quot;</div><div class="line">            android:windowSoftInputMode=&quot;stateHidden|adjustResize&quot;/&gt;</div><div class="line"></div><div class="line">		&lt;!--配置Mob--&gt;</div><div class="line">        &lt;meta-data android:name=&quot;Mob-AppKey&quot; android:value=&quot;你的KEY&quot;/&gt;</div><div class="line">        &lt;meta-data android:name=&quot;Mob-AppSecret&quot; android:value=&quot;你的Secret&quot;/&gt;</div><div class="line"></div><div class="line"></div><div class="line">        &lt;service</div><div class="line">            android:name=&quot;io.dcloud.common.adapter.io.MiniServerService&quot;</div><div class="line">            android:exported=&quot;true&quot; /&gt;</div><div class="line"></div><div class="line">    &lt;/application&gt;</div><div class="line"></div><div class="line">&lt;/manifest&gt;</div></pre></td></tr></table></figure>
</li>
</ul>
<h3 id="4-修改工程源码"><a href="#4-修改工程源码" class="headerlink" title="4. 修改工程源码"></a>4. 修改工程源码</h3><h4 id="4-1-EntryActivity"><a href="#4-1-EntryActivity" class="headerlink" title="4.1 EntryActivity"></a>4.1 EntryActivity</h4><p>这里贴上整个activity的源码，其中有部分地方需要修改<br>将<code>appBasePath</code>变量改为<code>/apps/mainfest.json下的id</code><br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> io.watasi;</div><div class="line"></div><div class="line"><span class="keyword">import</span> android.app.Activity;</div><div class="line"><span class="keyword">import</span> android.content.Context;</div><div class="line"><span class="keyword">import</span> android.content.Intent;</div><div class="line"><span class="keyword">import</span> android.content.res.Configuration;</div><div class="line"><span class="keyword">import</span> android.os.Bundle;</div><div class="line"><span class="keyword">import</span> android.view.KeyEvent;</div><div class="line"><span class="keyword">import</span> android.view.Menu;</div><div class="line"><span class="keyword">import</span> android.view.View;</div><div class="line"><span class="keyword">import</span> android.view.ViewGroup;</div><div class="line"><span class="keyword">import</span> android.view.Window;</div><div class="line"><span class="keyword">import</span> android.widget.FrameLayout;</div><div class="line"></div><div class="line"><span class="keyword">import</span> io.dcloud.EntryProxy;</div><div class="line"><span class="keyword">import</span> io.dcloud.RInformation;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.IApp;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.ICore;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.IOnCreateSplashView;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.ISysEventListener;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.IWebview;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.IWebviewStateListener;</div><div class="line"><span class="keyword">import</span> io.dcloud.feature.internal.sdk.SDK;</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">EntryActivity</span> <span class="keyword">extends</span> <span class="title">Activity</span> </span>&#123;</div><div class="line"></div><div class="line">    <span class="keyword">boolean</span> doHardAcc = <span class="keyword">true</span>;</div><div class="line">    EntryProxy mEntryProxy = <span class="keyword">null</span>;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>&#123;</div><div class="line">        <span class="keyword">super</span>.onCreate(savedInstanceState);</div><div class="line">        requestWindowFeature(Window.FEATURE_NO_TITLE);</div><div class="line">        <span class="keyword">if</span> (mEntryProxy == <span class="keyword">null</span>) &#123;</div><div class="line">            FrameLayout f = <span class="keyword">new</span> FrameLayout(<span class="keyword">this</span>);</div><div class="line">            <span class="comment">// 创建5+内核运行事件监听</span></div><div class="line">            WebappModeListener wm = <span class="keyword">new</span> WebappModeListener(<span class="keyword">this</span>, f);</div><div class="line">            <span class="comment">// 初始化5+内核</span></div><div class="line">            mEntryProxy = EntryProxy.init(<span class="keyword">this</span>, wm);</div><div class="line">            <span class="comment">// 启动5+内核</span></div><div class="line">            mEntryProxy.onCreate(<span class="keyword">this</span>, savedInstanceState, SDK.IntegratedMode.WEBAPP, <span class="keyword">null</span>);</div><div class="line">            setContentView(f);</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onCreateOptionsMenu</span><span class="params">(Menu menu)</span> </span>&#123;</div><div class="line">        <span class="keyword">return</span> mEntryProxy.onActivityExecute(<span class="keyword">this</span>, ISysEventListener.SysEventType.onCreateOptionMenu, menu);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onPause</span><span class="params">()</span> </span>&#123;</div><div class="line">        <span class="keyword">super</span>.onPause();</div><div class="line">        mEntryProxy.onPause(<span class="keyword">this</span>);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onResume</span><span class="params">()</span> </span>&#123;</div><div class="line">        <span class="keyword">super</span>.onResume();</div><div class="line">        mEntryProxy.onResume(<span class="keyword">this</span>);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onNewIntent</span><span class="params">(Intent intent)</span> </span>&#123;</div><div class="line">        <span class="keyword">super</span>.onNewIntent(intent);</div><div class="line">        <span class="keyword">if</span> (intent.getFlags() != <span class="number">0x10600000</span>) &#123;<span class="comment">// 非点击icon调用activity时才调用newintent事件</span></div><div class="line">            mEntryProxy.onNewIntent(<span class="keyword">this</span>, intent);</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onDestroy</span><span class="params">()</span> </span>&#123;</div><div class="line">        <span class="keyword">super</span>.onDestroy();</div><div class="line">        mEntryProxy.onStop(<span class="keyword">this</span>);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onKeyDown</span><span class="params">(<span class="keyword">int</span> keyCode, KeyEvent event)</span> </span>&#123;</div><div class="line">        <span class="keyword">boolean</span> _ret = mEntryProxy.onActivityExecute(<span class="keyword">this</span>, ISysEventListener.SysEventType.onKeyDown, <span class="keyword">new</span> Object[] &#123; keyCode, event &#125;);</div><div class="line">        <span class="keyword">return</span> _ret ? _ret : <span class="keyword">super</span>.onKeyDown(keyCode, event);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onKeyUp</span><span class="params">(<span class="keyword">int</span> keyCode, KeyEvent event)</span> </span>&#123;</div><div class="line">        <span class="keyword">boolean</span> _ret = mEntryProxy.onActivityExecute(<span class="keyword">this</span>, ISysEventListener.SysEventType.onKeyUp, <span class="keyword">new</span> Object[] &#123; keyCode, event &#125;);</div><div class="line">        <span class="keyword">return</span> _ret ? _ret : <span class="keyword">super</span>.onKeyUp(keyCode, event);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onKeyLongPress</span><span class="params">(<span class="keyword">int</span> keyCode, KeyEvent event)</span> </span>&#123;</div><div class="line">        <span class="keyword">boolean</span> _ret = mEntryProxy.onActivityExecute(<span class="keyword">this</span>, ISysEventListener.SysEventType.onKeyLongPress, <span class="keyword">new</span> Object[] &#123; keyCode, event &#125;);</div><div class="line">        <span class="keyword">return</span> _ret ? _ret : <span class="keyword">super</span>.onKeyLongPress(keyCode, event);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onConfigurationChanged</span><span class="params">(Configuration newConfig)</span> </span>&#123;</div><div class="line">        <span class="keyword">try</span> &#123;</div><div class="line">            <span class="keyword">int</span> temp = <span class="keyword">this</span>.getResources().getConfiguration().orientation;</div><div class="line">            <span class="keyword">if</span> (mEntryProxy != <span class="keyword">null</span>) &#123;</div><div class="line">                mEntryProxy.onConfigurationChanged(<span class="keyword">this</span>, temp);</div><div class="line">            &#125;</div><div class="line">            <span class="keyword">super</span>.onConfigurationChanged(newConfig);</div><div class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</div><div class="line">            e.printStackTrace();</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onActivityResult</span><span class="params">(<span class="keyword">int</span> requestCode, <span class="keyword">int</span> resultCode, Intent data)</span> </span>&#123;</div><div class="line">        mEntryProxy.onActivityExecute(<span class="keyword">this</span>, ISysEventListener.SysEventType.onActivityResult, <span class="keyword">new</span> Object[] &#123; requestCode, resultCode, data &#125;);</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">WebappModeListener</span> <span class="keyword">implements</span> <span class="title">ICore</span>.<span class="title">ICoreStatusListener</span>, <span class="title">IOnCreateSplashView</span> </span>&#123;</div><div class="line">    Activity activity;</div><div class="line">    View splashView = <span class="keyword">null</span>;</div><div class="line">    ViewGroup rootView;</div><div class="line">    IApp app = <span class="keyword">null</span>;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="title">WebappModeListener</span><span class="params">(Activity activity, ViewGroup rootView)</span> </span>&#123;</div><div class="line">        <span class="keyword">this</span>.activity = activity;</div><div class="line">        <span class="keyword">this</span>.rootView = rootView;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="comment">/**</span></div><div class="line"><span class="comment">     * 5+内核初始化完成时触发</span></div><div class="line"><span class="comment">     * */</span></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCoreInitEnd</span><span class="params">(ICore coreHandler)</span> </span>&#123;</div><div class="line"></div><div class="line">        <span class="comment">// 表示Webapp的路径在 file:///android_asset/apps/HelloH5</span></div><div class="line">        String appBasePath = <span class="string">"/apps/H5512A60A"</span>;</div><div class="line"></div><div class="line"></div><div class="line">        <span class="comment">// 设置启动参数,可在页面中通过plus.runtime.arguments;方法获取到传入的参数</span></div><div class="line">        String args = <span class="string">"&#123;url:'http://www.baidu.com'&#125;"</span>;</div><div class="line"></div><div class="line">        <span class="comment">// 启动启动独立应用的5+ Webapp</span></div><div class="line">        app = SDK.startWebApp(activity, appBasePath, args, <span class="keyword">new</span> IWebviewStateListener() &#123;</div><div class="line">            <span class="comment">// 设置Webview事件监听，可在监监听内获取WebIvew加载内容的进度</span></div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> Object <span class="title">onCallBack</span><span class="params">(<span class="keyword">int</span> pType, Object pArgs)</span> </span>&#123;</div><div class="line">                <span class="keyword">switch</span> (pType) &#123;</div><div class="line">                    <span class="keyword">case</span> IWebviewStateListener.ON_WEBVIEW_READY:</div><div class="line">                        <span class="comment">// WebApp准备加载事件</span></div><div class="line">                        <span class="comment">// 准备完毕之后添加webview到显示父View中，</span></div><div class="line">                        <span class="comment">// 设置排版不显示状态，避免显示webview时html内容排版错乱问题</span></div><div class="line">                        View view = ((IWebview) pArgs).obtainApp().obtainWebAppRootView().obtainMainView();</div><div class="line">                        view.setVisibility(View.INVISIBLE);</div><div class="line"></div><div class="line">                        <span class="keyword">if</span>(view.getParent() != <span class="keyword">null</span>)&#123;</div><div class="line">                            ((ViewGroup)view.getParent()).removeView(view);</div><div class="line">                        &#125;</div><div class="line">                        rootView.addView(view, <span class="number">0</span>);</div><div class="line">                        <span class="keyword">break</span>;</div><div class="line">                    <span class="keyword">case</span> IWebviewStateListener.ON_PAGE_STARTED:</div><div class="line">                        <span class="comment">// 首页面开始加载事件</span></div><div class="line">                        <span class="keyword">break</span>;</div><div class="line">                    <span class="keyword">case</span> IWebviewStateListener.ON_PROGRESS_CHANGED:</div><div class="line">                        <span class="comment">// WebApp首页面加载进度变化事件</span></div><div class="line">                        <span class="keyword">break</span>;</div><div class="line">                    <span class="keyword">case</span> IWebviewStateListener.ON_PAGE_FINISHED:</div><div class="line">                        <span class="comment">// WebApp首页面加载完成事件</span></div><div class="line">                        <span class="comment">// 页面加载完毕，设置显示webview</span></div><div class="line">                        <span class="comment">// 如果不需要显示spalsh页面将此行代码移动至onCloseSplash事件内</span></div><div class="line">                        app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);</div><div class="line">                        <span class="keyword">break</span>;</div><div class="line">                &#125;</div><div class="line">                <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line">            &#125;</div><div class="line">        &#125;, <span class="keyword">this</span>);</div><div class="line"></div><div class="line">        app.setIAppStatusListener(<span class="keyword">new</span> IApp.IAppStatusListener() &#123;</div><div class="line">            <span class="comment">// 设置APP运行事件监听</span></div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onStop</span><span class="params">()</span> </span>&#123;</div><div class="line">                <span class="comment">// 应用运行停止时调用</span></div><div class="line">                rootView.removeView(app.obtainWebAppRootView().obtainMainView());</div><div class="line">                <span class="comment">// TODO Auto-generated method stub</span></div><div class="line">                <span class="keyword">return</span> <span class="keyword">false</span>;</div><div class="line">            &#125;</div><div class="line"></div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStart</span><span class="params">()</span> </span>&#123;</div><div class="line">                <span class="comment">// 独立应用启动时触发事件</span></div><div class="line">            &#125;</div><div class="line"></div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onPause</span><span class="params">(IApp arg0, IApp arg1)</span> </span>&#123;</div><div class="line">                <span class="comment">// WebApp暂停运行时触发事件</span></div><div class="line">            &#125;</div><div class="line"></div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> String <span class="title">onStoped</span><span class="params">(<span class="keyword">boolean</span> arg0, String arg1)</span> </span>&#123;</div><div class="line">                <span class="comment">// TODO Auto-generated method stub</span></div><div class="line">                <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line">            &#125;</div><div class="line">        &#125;);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCoreReady</span><span class="params">(ICore coreHandler)</span> </span>&#123;</div><div class="line">        <span class="comment">// 初始化5+ SDK，</span></div><div class="line">        <span class="comment">// 5+SDK的其他接口需要在SDK初始化后才能調用</span></div><div class="line">        SDK.initSDK(coreHandler);</div><div class="line">        <span class="comment">// 设置当前应用可使用的5+ API</span></div><div class="line">        SDK.requestAllFeature();</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onCoreStop</span><span class="params">()</span> </span>&#123;</div><div class="line">        <span class="comment">// 当返回false时候回关闭activity</span></div><div class="line">        <span class="keyword">return</span> <span class="keyword">false</span>;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="comment">// 在Widget集成时如果不需要显示splash页面可按照如下步骤操作</span></div><div class="line">    <span class="comment">// 1 删除onCreateSplash方法内的代码</span></div><div class="line">    <span class="comment">// 2 将5+mainView添加到rootview时将页面设置为不可见</span></div><div class="line">    <span class="comment">// 3 在onCloseSplash方法中将5+mainView设置为可见</span></div><div class="line">    <span class="comment">// 4 修改androidmanifest.xml文件 将SDK_WebApp的主题设置为透明</span></div><div class="line">    <span class="comment">// 注意！</span></div><div class="line">    <span class="comment">// 如果不显示splash页面会造成用户点击后页面短时间内会没有变化，</span></div><div class="line">    <span class="comment">// 可能会给用户造成程序没响应的错觉，</span></div><div class="line">    <span class="comment">// 所以开发者需要对5+内核启动到5+应用页面显示之间的这段事件进行处理</span></div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">onCreateSplash</span><span class="params">(Context pContextWrapper)</span> </span>&#123;</div><div class="line">        splashView = <span class="keyword">new</span> FrameLayout(activity);</div><div class="line">        splashView.setBackgroundResource(RInformation.DRAWABLE_SPLASH);</div><div class="line">        rootView.addView(splashView);</div><div class="line">        <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCloseSplash</span><span class="params">()</span> </span>&#123;</div><div class="line">        rootView.removeView(splashView);</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<h4 id="4-2-在java目录下添加io-dcloud包"><a href="#4-2-在java目录下添加io-dcloud包" class="headerlink" title="4.2 在java目录下添加io.dcloud包"></a>4.2 在java目录下添加io.dcloud包</h4><h4 id="4-3-拷贝SDK-src-io-dcloud-Rinfomation-java文件到工程的io-dcloud包下"><a href="#4-3-拷贝SDK-src-io-dcloud-Rinfomation-java文件到工程的io-dcloud包下" class="headerlink" title="4.3 拷贝SDK\src\io\dcloud\Rinfomation.java文件到工程的io.dcloud包下"></a>4.3 拷贝SDK<code>\src\io\dcloud\Rinfomation.java</code>文件到工程的io.dcloud包下</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> io.dcloud;</div><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 本文件是5+SDK使用的资源索引</span></div><div class="line"><span class="comment"> * 工程引入本文件的包名必须是“io.dcloud”</span></div><div class="line"><span class="comment"> * */</span></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">RInformation</span> <span class="keyword">extends</span> <span class="title">PdrR</span> </span>&#123;</div><div class="line">	<span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> VIEW_LAYOUT_SPLASH = <span class="number">0</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="5-添加Web应用资源到工程"><a href="#5-添加Web应用资源到工程" class="headerlink" title="5. 添加Web应用资源到工程"></a>5. 添加Web应用资源到工程</h3><blockquote>
<p>在<code>assets</code>目录下创建<code>apps/[appid]/www</code>目录，将web应用拷贝到www目录下，<code>[appid]</code>为Web应用<code>mainfest.json</code>文件id节点的内容。</p>
</blockquote>
<ul>
<li>修改<code>src/main/assets/data/dcloud_control.xml</code>文件，修改app节点的<code>appid</code>属性和<code>appver</code>属性的值。<code>appid</code>属性填写Web应用的<code>mainfest.json</code>文件的ID节点内容，appver属性填写<code>manifest.json</code>文件的<code>version</code>节点下的<code>name</code>节点的内容。</li>
</ul>
<h3 id="6-插件开发"><a href="#6-插件开发" class="headerlink" title="6. 插件开发"></a>6. 插件开发</h3><p>这里以发送短信验证码为例，创建<code>SendMsg.java</code><br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> io.watasi;</div><div class="line"></div><div class="line"><span class="keyword">import</span> android.content.Context;</div><div class="line"><span class="keyword">import</span> android.os.Bundle;</div><div class="line"><span class="keyword">import</span> android.util.Log;</div><div class="line"></div><div class="line"><span class="keyword">import</span> org.json.JSONArray;</div><div class="line"></div><div class="line"><span class="keyword">import</span> cn.smssdk.EventHandler;</div><div class="line"><span class="keyword">import</span> cn.smssdk.OnSendMessageHandler;</div><div class="line"><span class="keyword">import</span> cn.smssdk.SMSSDK;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.IWebview;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.DHInterface.StandardFeature;</div><div class="line"><span class="keyword">import</span> io.dcloud.common.util.JSUtil;</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SendMsg</span> <span class="keyword">extends</span> <span class="title">StandardFeature</span> </span>&#123;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStart</span><span class="params">(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs)</span> </span>&#123;</div><div class="line">        initSDK();</div><div class="line">    &#125;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">initSDK</span><span class="params">()</span> </span>&#123;</div><div class="line">        <span class="comment">// 创建EventHandler对象</span></div><div class="line">        EventHandler eventHandler = <span class="keyword">new</span> EventHandler() &#123;</div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterEvent</span><span class="params">(<span class="keyword">int</span> event, <span class="keyword">int</span> result, Object data)</span> </span>&#123;</div><div class="line">                <span class="keyword">if</span> (result == SMSSDK.RESULT_COMPLETE) &#123;</div><div class="line">                    <span class="comment">//回调完成</span></div><div class="line">                    <span class="keyword">if</span> (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) &#123;</div><div class="line">                        <span class="comment">//提交验证码成功</span></div><div class="line">                    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) &#123;</div><div class="line">                        <span class="comment">//获取验证码成功</span></div><div class="line">                    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) &#123;</div><div class="line">                        <span class="comment">//返回支持发送验证码的国家列表</span></div><div class="line">                    &#125;</div><div class="line">                &#125; <span class="keyword">else</span> &#123;</div><div class="line">                    ((Throwable) data).printStackTrace();</div><div class="line">                &#125;</div><div class="line">            &#125;</div><div class="line">        &#125;;</div><div class="line">        <span class="comment">// 注册监听器</span></div><div class="line">        SMSSDK.registerEventHandler(eventHandler);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">send</span><span class="params">(<span class="keyword">final</span> IWebview pWebview, JSONArray array)</span></span>&#123;</div><div class="line">        <span class="keyword">final</span> String CallBackID = array.optString(<span class="number">0</span>);</div><div class="line">        String tel = array.optString(<span class="number">1</span>);</div><div class="line">        </div><div class="line">        SMSSDK.getVerificationCode(<span class="string">"86"</span>, tel, <span class="keyword">new</span> OnSendMessageHandler() &#123;</div><div class="line">            <span class="meta">@Override</span></div><div class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">onSendMessage</span><span class="params">(String s, String s1)</span> </span>&#123;</div><div class="line">                JSUtil.execCallback(pWebview, CallBackID, <span class="string">"登录成功"</span>, JSUtil.OK, <span class="keyword">false</span>);</div><div class="line">                <span class="keyword">return</span> <span class="keyword">false</span>;</div><div class="line">            &#125;</div><div class="line">        &#125;);</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p><strong><code>注意：</code></strong>插件编写完成后，一定要在<code>assets/data/dcloud_properties.xml</code>文件中声明插件类别名和Native层扩展插件类的对应关系<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">&lt;properties&gt;</div><div class="line">	&lt;features&gt;</div><div class="line">		&lt;!--name为类名， value为类所在的路径--&gt;</div><div class="line">		&lt;feature name=&quot;SendMsg&quot; value=&quot;io.watasi.SendMsg&quot; /&gt;</div><div class="line">	&lt;/features&gt;	</div><div class="line"></div><div class="line">	&lt;services&gt;</div><div class="line">		&lt;service name=&quot;push&quot; value=&quot;io.dcloud.feature.aps.APSFeatureImpl&quot;/&gt;</div><div class="line">		&lt;service name=&quot;Statistic&quot; value=&quot;io.dcloud.feature.statistics.StatisticsBootImpl&quot;/&gt;</div><div class="line">		&lt;service name=&quot;Downloader&quot; value=&quot;io.dcloud.net.DownloaderBootImpl&quot;/&gt;</div><div class="line">	&lt;/services&gt;</div><div class="line">&lt;/properties&gt;</div></pre></td></tr></table></figure></p>
<h3 id="7-编写插件JS-API-amp-amp-调用JS-API"><a href="#7-编写插件JS-API-amp-amp-调用JS-API" class="headerlink" title="7. 编写插件JS API &amp;&amp; 调用JS API"></a>7. 编写插件JS API &amp;&amp; 调用JS API</h3><h4 id="7-1-编写API"><a href="#7-1-编写API" class="headerlink" title="7.1 编写API"></a>7.1 编写API</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">document</span>.addEventListener(<span class="string">"plusready"</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="comment">// 声明的JS“扩展插件别名”</span></div><div class="line">    <span class="keyword">var</span> _BARCODE = <span class="string">'SendMsg'</span>,    <span class="comment">// 与dcloud_properties.xml中声明插件类别名相同</span></div><div class="line">        B = <span class="built_in">window</span>.plus.bridge;</div><div class="line"></div><div class="line">    <span class="built_in">window</span>.plus.sendMsg = &#123;</div><div class="line">        send: <span class="function"><span class="keyword">function</span>(<span class="params">phone, successCallback, errorCallback</span>) </span>&#123;</div><div class="line">            <span class="keyword">var</span> success = <span class="keyword">typeof</span> successCallback !== <span class="string">'function'</span> ? <span class="literal">null</span> : <span class="function"><span class="keyword">function</span>(<span class="params">args</span>) </span>&#123;</div><div class="line">                successCallback(args);</div><div class="line">            &#125;;</div><div class="line">            <span class="keyword">var</span> fail = <span class="keyword">typeof</span> errorCallback !== <span class="string">'function'</span> ? <span class="literal">null</span> : <span class="function"><span class="keyword">function</span>(<span class="params">code</span>) </span>&#123;</div><div class="line">                errorCallback(code);</div><div class="line">            &#125;;</div><div class="line">            callbackID = B.callbackId(success, fail);</div><div class="line">            </div><div class="line">            <span class="comment">// 第二个参数与原生android实现的方法名相同</span></div><div class="line">            <span class="keyword">return</span> B.exec(_BARCODE, <span class="string">"send"</span>, [callbackID, phone]);</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">&#125;, <span class="literal">true</span>);</div></pre></td></tr></table></figure>
<h4 id="7-2-页面调用"><a href="#7-2-页面调用" class="headerlink" title="7.2 页面调用"></a>7.2 页面调用</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div></pre></td><td class="code"><pre><div class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></div><div class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></div><div class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"</span> /&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span><span class="tag">&lt;/<span class="name">title</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">"css/mui.min.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span>/&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">"text/css"</span>&gt;</span><span class="undefined"></span></div><div class="line"><span class="undefined">    	.mt20&#123;margin-top: 20px;&#125;</span></div><div class="line"><span class="undefined">    	.btn-wrapper&#123;padding: 0 15px;&#125;</span></div><div class="line"><span class="undefined">    	.btn-wrapper button &#123;padding: 10px 0;&#125;</span></div><div class="line"><span class="undefined">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></div><div class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></div><div class="line">	<span class="tag">&lt;<span class="name">header</span> <span class="attr">class</span>=<span class="string">"mui-bar mui-bar-nav"</span>&gt;</span></div><div class="line">	    <span class="tag">&lt;<span class="name">h1</span> <span class="attr">class</span>=<span class="string">"mui-title"</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></div><div class="line">	<span class="tag">&lt;/<span class="name">header</span>&gt;</span></div><div class="line">	<span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mui-content"</span>&gt;</span></div><div class="line">	    <span class="tag">&lt;<span class="name">form</span> <span class="attr">class</span>=<span class="string">"mui-input-group mt20"</span>&gt;</span></div><div class="line">	        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mui-input-row"</span>&gt;</span></div><div class="line">	            <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"tel"</span> <span class="attr">class</span>=<span class="string">"phone"</span> <span class="attr">class</span>=<span class="string">"mui-input-clear"</span> <span class="attr">placeholder</span>=<span class="string">"请输入手机号"</span>&gt;</span></div><div class="line">	        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></div><div class="line">	        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mui-input-row"</span>&gt;</span></div><div class="line">	            <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"number"</span> <span class="attr">class</span>=<span class="string">"code"</span> <span class="attr">class</span>=<span class="string">"mui-input-clear"</span> <span class="attr">placeholder</span>=<span class="string">"验证码"</span>&gt;</span></div><div class="line">	        <span class="tag">&lt;/<span class="name">div</span>&gt;</span>	        </div><div class="line">	    <span class="tag">&lt;/<span class="name">form</span>&gt;</span></div><div class="line">	    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"btn-wrapper"</span>&gt;</span></div><div class="line">	    	<span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">"sendCode"</span> <span class="attr">class</span>=<span class="string">"mui-btn mui-btn-block mui-btn-primary mt20"</span>&gt;</span>发送验证码<span class="tag">&lt;/<span class="name">button</span>&gt;</span></div><div class="line">	    	<span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"mui-btn mui-btn-block mui-btn-danger"</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></div><div class="line">	    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></div><div class="line">	<span class="tag">&lt;/<span class="name">div</span>&gt;</span></div><div class="line">	</div><div class="line">	<span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"js/mui.min.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line">	<span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"plugs/sendMsg.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line">	<span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span><span class="undefined"></span></div><div class="line"><span class="undefined">		mui.init();</span></div><div class="line"><span class="javascript">		<span class="built_in">document</span>.querySelector(<span class="string">"#sendCode"</span>).addEventListener(<span class="string">"tap"</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span></div><div class="line"><span class="javascript">			<span class="keyword">var</span> phone = <span class="built_in">document</span>.querySelector(<span class="string">".phone"</span>).value;</span></div><div class="line"><span class="javascript">			plus.sendMsg.send(phone, <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;&#125;, <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;&#125;) ;</span></div><div class="line"><span class="javascript">		&#125;, <span class="literal">false</span>);</span></div><div class="line"><span class="undefined">	</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></div></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;写在前面，该入坑指南是以&lt;code&gt;Mob&lt;/code&gt;发送短信验证码为例，实现MUI第三方插件的开发，仅供参考。&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;image-bubble&quot;&gt;
                &lt;div class=&quot;
    
    </summary>
    
    
      <category term="nodejs" scheme="http://watasi.cn/tags/nodejs/"/>
    
      <category term="iis" scheme="http://watasi.cn/tags/iis/"/>
    
  </entry>
  
  <entry>
    <title>基于MUI开发的一套模板</title>
    <link href="http://watasi.cn/2017/08/01/%E5%9F%BA%E4%BA%8EMUI%E5%BC%80%E5%8F%91%E7%9A%84%E4%B8%80%E5%A5%97%E6%A8%A1%E6%9D%BF/"/>
    <id>http://watasi.cn/2017/08/01/基于MUI开发的一套模板/</id>
    <published>2017-08-01T00:28:18.781Z</published>
    <updated>2017-08-01T00:52:17.451Z</updated>
    
    <content type="html"><![CDATA[<h2 id="项目介绍"><a href="#项目介绍" class="headerlink" title="项目介绍"></a>项目介绍</h2><p>公司准备用MUI框架，开发一套模板，方便于未来进行二次、三次开发。本人本着绝对服从领导指示的原则，参与了模板的开发，这里把项目开源一下。<br>该项目目前功能不是很完善(至少提交App Store被批为<code>无用的爱啪啪</code>)，后续会添加更多的功能。<br><a href="https://github.com/Jessom/MUI" target="_blank" rel="external">戳这里</a>查看项目源码。</p>
<h2 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line">|-default                 页面资源</div><div class="line">  |-css                   样式表</div><div class="line">    |-css                 sass编译后的css</div><div class="line">    |-sass                sass源码</div><div class="line">  |-iconfont              字体图标</div><div class="line">  |-images                图片资源</div><div class="line">  |-js                    页面js文件</div><div class="line">|-Public                  公共资源</div><div class="line">  |-css                   公共css</div><div class="line">  |-images                公共图片资源</div><div class="line">  |-js                    公共js文件</div><div class="line">  |-plugins               插件</div><div class="line">|-.project                HBuilder编辑器生成文件</div><div class="line">|-manifest.json           app配置文件</div><div class="line">|-abotut.html             关于我们</div><div class="line">|-detail.html             详情</div><div class="line">|-editor.html             编辑</div><div class="line">|-forget_password.html    找回密码</div><div class="line">|-home.html               主页</div><div class="line">|-index.html              入口</div><div class="line">|-login.html              登录</div><div class="line">|-personal.html           个人</div><div class="line">|-preview.html            预览</div><div class="line">|-publish.html            发布选项</div><div class="line">|-reg.html                注册</div><div class="line">|-release.html            发布</div><div class="line">|-setting.html            设置</div><div class="line">|-userinfo.html           个人信息</div></pre></td></tr></table></figure>
<h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><ol>
<li>主要用到的就是MUI</li>
<li>数据渲染的部分使用了vue1.0.28</li>
</ol>
<h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><p>[x] 注册<br>[x] 登录<br>[x] 发布文章<br>[x] 浏览文章</p>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;项目介绍&quot;&gt;&lt;a href=&quot;#项目介绍&quot; class=&quot;headerlink&quot; title=&quot;项目介绍&quot;&gt;&lt;/a&gt;项目介绍&lt;/h2&gt;&lt;p&gt;公司准备用MUI框架，开发一套模板，方便于未来进行二次、三次开发。本人本着绝对服从领导指示的原则，参与了模板的开发，这里把项
    
    </summary>
    
      <category term="mui" scheme="http://watasi.cn/categories/mui/"/>
    
    
  </entry>
  
  <entry>
    <title>iis7托管nodejs应用程序</title>
    <link href="http://watasi.cn/2017/07/29/iis7%E6%89%98%E7%AE%A1nodejs%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/"/>
    <id>http://watasi.cn/2017/07/29/iis7托管nodejs应用程序/</id>
    <published>2017-07-29T06:36:22.229Z</published>
    <updated>2017-07-31T00:43:13.541Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-参考资料"><a href="#1-参考资料" class="headerlink" title="1. 参考资料"></a>1. 参考资料</h1><p><a href="http://www.jb51.net/article/61569.htm" target="_blank" rel="external">http://www.jb51.net/article/61569.htm</a><br><a href="http://www.cnblogs.com/chenweixuan/p/5489343.html" target="_blank" rel="external">http://www.cnblogs.com/chenweixuan/p/5489343.html</a></p>
<h1 id="2-开始"><a href="#2-开始" class="headerlink" title="2. 开始"></a>2. 开始</h1><p><a href="https://nodejs.org/en/download/" target="_blank" rel="external">NodeJs</a><br><a href="https://www.iis.net/downloads/microsoft/url-rewrite" target="_blank" rel="external">URL Rewrite</a><br><a href="https://github.com/tjanczuk/iisnode" target="_blank" rel="external">iisnode</a><br><a href="https://github.com/azure/iisnode/releases/download/v0.2.21/iisnode-full-v0.2.21-x86.msi" target="_blank" rel="external">iisnode x86下载</a><br><a href="https://github.com/azure/iisnode/releases/download/v0.2.21/iisnode-full-v0.2.21-x64.msi" target="_blank" rel="external">iisnode x64下载</a></p>
<p>安装完成后，在IIS中创建站点，指向nodejs应用程序目录(这里以express项目为例)，<code>在nodejs应用程序中添加web.config文件</code>：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">&lt;configuration&gt;</div><div class="line">    &lt;system.webServer&gt;</div><div class="line">        &lt;handlers&gt;</div><div class="line">            &lt;add name=&quot;iisnode&quot; path=&quot;start.js&quot; verb=&quot;*&quot; modules=&quot;iisnode&quot; resourceType=&quot;Unspecified&quot; requireAccess=&quot;Script&quot; /&gt;</div><div class="line">        &lt;/handlers&gt;</div><div class="line">        &lt;rewrite&gt;</div><div class="line">            &lt;rules&gt;</div><div class="line">                &lt;rule name=&quot;all&quot;&gt;</div><div class="line">                    &lt;match url=&quot;/*&quot; /&gt;</div><div class="line">                    &lt;action type=&quot;Rewrite&quot; url=&quot;start.js&quot; /&gt;</div><div class="line">                &lt;/rule&gt;</div><div class="line">            &lt;/rules&gt;</div><div class="line">        &lt;/rewrite&gt;</div><div class="line">    &lt;/system.webServer&gt;</div><div class="line">&lt;/configuration&gt;</div></pre></td></tr></table></figure>
<p><strong>注意：</strong> <add name="iisnode" `path="start.js" `="" verb="*" modules="iisnode" resourcetype="Unspecified" requireaccess="Script">及<action type="Rewrite" `url="start.js" `=""></action></add></p>
<p>start.js文件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">#!/usr/bin/env node</div><div class="line">require(&apos;./bin/www&apos;);</div></pre></td></tr></table></figure>
]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-参考资料&quot;&gt;&lt;a href=&quot;#1-参考资料&quot; class=&quot;headerlink&quot; title=&quot;1. 参考资料&quot;&gt;&lt;/a&gt;1. 参考资料&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.jb51.net/article/61569.htm&quot; targ
    
    </summary>
    
    
      <category term="nodejs" scheme="http://watasi.cn/tags/nodejs/"/>
    
      <category term="iis" scheme="http://watasi.cn/tags/iis/"/>
    
  </entry>
  
  <entry>
    <title>mui监测IOS版本更新</title>
    <link href="http://watasi.cn/2017/07/29/mui%E7%9B%91%E6%B5%8BIOS%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0/"/>
    <id>http://watasi.cn/2017/07/29/mui监测IOS版本更新/</id>
    <published>2017-07-29T05:57:23.316Z</published>
    <updated>2017-07-29T05:59:24.499Z</updated>
    
    <content type="html"><![CDATA[<p>使用<code>mui</code>开发混合app，上架app stroe后，监测app store是否有更新，并提示用户跳转app store更新应用。<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> ver;    <span class="comment">// 用于保存当前应用版本</span></div><div class="line"></div><div class="line">mui.plusReady(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;         </div><div class="line">     plus.runtime.getProperty(plus.runtime.appid, <span class="function"><span class="keyword">function</span>(<span class="params">inf</span>) </span>&#123;</div><div class="line">         ver = inf.version;        <span class="comment">// 当前应用版本</span></div><div class="line">         <span class="keyword">var</span> ua = navigator.userAgent.toLowerCase();</div><div class="line">         <span class="keyword">if</span>(<span class="regexp">/iphone|ipad|ipod/</span>.test(ua)) &#123;    <span class="comment">// iphone</span></div><div class="line">             mui.ajax(&#123;</div><div class="line">                 url: <span class="string">'http://itunes.apple.com/lookup?id=1166765111'</span>,</div><div class="line">                 type: <span class="string">"GET"</span>,</div><div class="line">                 dataType: <span class="string">"json"</span>,</div><div class="line">                 data: &#123;</div><div class="line">                     id: <span class="number">1166765111</span></div><div class="line">                 &#125;,</div><div class="line">                 contentType:<span class="string">'application/x-www-form-urlencoded;charset=UTF-8'</span>,</div><div class="line">                 success: <span class="function"><span class="keyword">function</span>(<span class="params">res</span>)</span>&#123;</div><div class="line">                     <span class="comment">//console.log(JSON.stringify(res));</span></div><div class="line">                     <span class="keyword">var</span> version = res.results[<span class="number">0</span>].version;</div><div class="line">                     <span class="keyword">if</span>(version &gt; ver) &#123;</div><div class="line">                         mui.alert(res.results[<span class="number">0</span>].releaseNotes, <span class="string">"版本更新"</span>, <span class="string">"确定"</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">                             <span class="keyword">var</span> url = <span class="string">'itms-apps://itunes.apple.com/us/app/id1166765111'</span>;</div><div class="line">                             plus.runtime.openURL(url);</div><div class="line">                         &#125;)</div><div class="line">                     &#125;</div><div class="line">                 &#125;</div><div class="line">             &#125;)</div><div class="line">         &#125;</div><div class="line">    &#125;);</div><div class="line"></div><div class="line">&#125;);</div></pre></td></tr></table></figure></p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;使用&lt;code&gt;mui&lt;/code&gt;开发混合app，上架app stroe后，监测app store是否有更新，并提示用户跳转app store更新应用。&lt;br&gt;&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td clas
    
    </summary>
    
    
      <category term="mui" scheme="http://watasi.cn/tags/mui/"/>
    
  </entry>
  
  <entry>
    <title>Nodejs使用request以流的形式转发图片</title>
    <link href="http://watasi.cn/2017/07/29/Nodejs%E4%BD%BF%E7%94%A8request%E4%BB%A5%E6%B5%81%E7%9A%84%E5%BD%A2%E5%BC%8F%E8%BD%AC%E5%8F%91%E5%9B%BE%E7%89%87/"/>
    <id>http://watasi.cn/2017/07/29/Nodejs使用request以流的形式转发图片/</id>
    <published>2017-07-29T02:55:12.404Z</published>
    <updated>2017-07-29T05:51:26.283Z</updated>
    
    <content type="html"><![CDATA[<p>做项目的时候，需要用Nodejs做代理转发，服务器那边要求图片以<code>流</code>的方式上传，这里记录一下Nodejs以<code>流</code>的形式读取本地图片并上传。</p>
<h2 id="1-安装依赖"><a href="#1-安装依赖" class="headerlink" title="1. 安装依赖"></a>1. 安装依赖</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">npm install request md5</div></pre></td></tr></table></figure>
<h2 id="2-需要模块"><a href="#2-需要模块" class="headerlink" title="2. 需要模块"></a>2. 需要模块</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">"fs"</span>);</div><div class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">"path"</span>);</div><div class="line"><span class="keyword">const</span> request = <span class="built_in">require</span>(<span class="string">"request"</span>);</div><div class="line"><span class="keyword">const</span> md5 = <span class="built_in">require</span>(<span class="string">"md5"</span>);</div></pre></td></tr></table></figure>
<h2 id="3-具体操作"><a href="#3-具体操作" class="headerlink" title="3. 具体操作"></a>3. 具体操作</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 获取前台穿过来到图片base64信息</span></div><div class="line"><span class="keyword">let</span> img = req.body.img;</div><div class="line"></div><div class="line"><span class="comment">// 去掉base64头部</span></div><div class="line"><span class="keyword">let</span> base64Data = img.replace(<span class="regexp">/^data:image\/\w+;base64,/</span>, <span class="string">""</span>);</div><div class="line"></div><div class="line"><span class="comment">// 转换成二进制</span></div><div class="line"><span class="keyword">let</span> buffer = <span class="keyword">new</span> Buffer(base64Data, <span class="string">"base64"</span>);</div><div class="line"></div><div class="line"><span class="comment">// 生成图片md5值</span></div><div class="line"><span class="keyword">let</span> md5Data = md5(buffer);</div><div class="line"></div><div class="line"><span class="comment">// 保存图片</span></div><div class="line">fs.writeFile(path.join(__dirname+<span class="string">"/../uploads"</span>, <span class="string">`<span class="subst">$&#123;md5Data&#125;</span>.jpg`</span>), buffer, (err) =&gt; &#123;</div><div class="line">	<span class="keyword">if</span>(err) &#123;</div><div class="line">		<span class="built_in">console</span>.log(err);</div><div class="line">		<span class="keyword">return</span>;</div><div class="line">   &#125;</div><div class="line"></div><div class="line">   <span class="comment">// 读取图片</span></div><div class="line">   fs.createReadStream(path.join(__dirname+<span class="string">`/../uploads/<span class="subst">$&#123;md5Data&#125;</span>.jpg`</span>)).pipe(request(&#123;</div><div class="line">		url: url,</div><div class="line">      method: <span class="string">"POST"</span>,</div><div class="line">      headers: &#123; <span class="string">"Content-Type"</span>: <span class="string">"application/json"</span> &#125;</div><div class="line">      ...</div><div class="line">   &#125;, (error, response, body) =&gt; &#123;</div><div class="line">		<span class="built_in">console</span>.log(body);</div><div class="line">   &#125;));</div><div class="line">&#125;)</div></pre></td></tr></table></figure>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;做项目的时候，需要用Nodejs做代理转发，服务器那边要求图片以&lt;code&gt;流&lt;/code&gt;的方式上传，这里记录一下Nodejs以&lt;code&gt;流&lt;/code&gt;的形式读取本地图片并上传。&lt;/p&gt;
&lt;h2 id=&quot;1-安装依赖&quot;&gt;&lt;a href=&quot;#1-安装依赖&quot; class=
    
    </summary>
    
    
      <category term="nodejs" scheme="http://watasi.cn/tags/nodejs/"/>
    
  </entry>
  
</feed>
