自动检测版本及自动升级

自动检测版本及自动升级

本来直接找网络上的想马上用,哪知道编译都过去不。花了不少时间,终于OK.

自己整理下。

 

1.为了实现功能单一分离,我用单独的一个类VersionCheck,实现版本检测

VersionCheck.h

//
//  VersionCheck.h
//
//  Created by chenhd on 2014.01.15
//

 

@interface VersionCheck: NSObject {

}

// Use to check the reachability of a particular host name.
+ (bool) CheckVerUpdate;

@end

 

//
//  VersionCheck.mm
//
//  Created by chenhd on 2014.01.15
//

#import "VersionCheck.h"
#import "Reachability.h"
#import "ASIFormDataRequest.h"
#import "GlobalFunc.h"

 

 


@implementation VersionCheck


//check version update, return true: need update;
//false: doesn't need update, continue
+ (bool)CheckVerUpdate
{
 bool bNeedUpdate = false;
    NSString *appVersion = @"";
   
    //
开启iphone网络开关
 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?id=725369561"];
    ASIFormDataRequest *versionRequest = [ASIFormDataRequest requestWithURL:url];
    [versionRequest setRequestMethod:@"GET"];
    //[versionRequest setDelegate:self];
    [versionRequest setTimeOutSeconds:150];
    [versionRequest addRequestHeader:@"Content-Type" value:@"application/json"];
    [versionRequest startSynchronous];

    //Response string of our REST call
    NSString* jsonResponseString = [versionRequest responseString];

    NSDictionary *loginAuthenticationResponse = [jsonResponseString objectFromJSONString];

    NSArray *configData = [loginAuthenticationResponse valueForKey:@"results"];

    for (id config in configData)
    {
        appVersion = [config valueForKey:@"version"];
    }
    string sLVer = CGlobalFunc::GetLocalVersionIOS();
    NSString* localVersion = [NSString stringWithUTF8String: sLVer.c_str()];
   
    int length = [appVersion length];
    NSLog(@"server version:[%@] length[%d], local version[%@]", appVersion, length, localVersion);

    //Check your version with the version in app store
    if (length > 0)
 {  
  //if server version large then local version, then need update
  float fLocalVersion = [localVersion floatValue];
  float fAppVersion = [appVersion floatValue];
  if ( fLocalVersion < fAppVersion)
  {
   bNeedUpdate = true;
  }
 }
 
 return bNeedUpdate;
}

@end
蓝色的字是我本地存放的版本信息,字符串类型,  "1.2""1.3" 这种格式

 

2.Application里调用

1main.h

#import
@interface TQDelegate : NSObject {
}

 

2main.m

#import "VersionCheck.h"

#define ALERT_TAG_PUSH 10
#define ALERT_TAG_UPDATE 11

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
 bool bNeedUpdate =[VersionCheck CheckVerUpdate];//doesn't need to update
 if (bNeedUpdate)
 {
   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Version"
               message:@"A new version of app is available to update"
                 delegate:self
              cancelButtonTitle:nil
              otherButtonTitles:@"Update", nil];
   alert.tag = ALERT_TAG_UPDATE;
   [alert show];
   [alert release];
 }
 else
 {
  TQDelegate_Init(application);
  [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 
 }

...

}

 


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    switch (alertView.tag) {
  case ALERT_TAG_UPDATE:
  {
   NSString *iTunesLink = @"itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=725369561&mt=8";
   [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

   exit(0);
  }
      
     default:
  break;
    }
}

 

3.加入ASIHTTPRequest

可以从https://github.com/pokeb/asi-http-request/zipball/master里下载

然后新建一个文件夹,把下面文件拉进来

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1029" type="#_x0000_t75" alt="说明: OS和安卓更新检测" href="http://photo.blog.sina.com.cn/showpic.html#blogid=a17b071c0101kvtt&amp;url=http://album.sina.com.cn/pic/002XlvfSty6FPX6CDS9c9" target="&quot;_blank&quot;" style='width:562pt;height:399pt;visibility:visible; mso-wrap-style:square' o:button="t"> <v:imagedata src="file://localhost/Users/apple/Library/Caches/TemporaryItems/msoclip/0clip_image001.jpg" o:title="OS和安卓更新检测"/> </v:shape><![endif]--><!--[if !vml]-->说明: OS和安卓更新检测<!--[endif]-->

 还有2个文件"Reachability.h""Reachability.mm"

 

4. 由于是在程序启动的时候检测,因此必须用application进行按钮点击的回调响应。这个问题花了很多时间才找出原因

5.测试更新的时候,本地版本要真实比APPSTORE的版本低

 

应用中打开app store的评论页面和下载页面

http://blog.csdn.net/smking/article/details/7642256

 

 

iPhone应用里直接打开app store 评论页面的方法:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=40461254"]];
复制代码
更换下id号就可以。


如果想要打开下载页面,把url改为
itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=40461254

更换下id号就可以。

 

直接跳:appstore “其实打开的是程序在App store上的主页面

itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=423525686

 

网页跳:这是表示在网页中嵌入下载链接

https://itunes.apple.com/cn/app/zhong-jin-cai-jing/id513779241?mt=8


统计后跳:下面这个,我没有试过

http://js5.eastmoney.com/tg.aspx?ID=198

 

 

===============================下面的有些问题,花了我不少时间修正========

网络上找的,粘贴出来。

 

ios软件更新 提示

1)       服务器接口,

通常的做法是在自己的服务器上记录最新版本号,从iOS客户端请求,与本地版本号比较,不同则提示更新。这种做法简单,缺点是需要单独的服务器支持。

 

2)       Appstore的接口?

不需要另外的服务器支持,方法最优

①      

        NSString *version = @"";

        NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?id="];

        versionRequest = [ASIFormDataRequest requestWithURL:url];

        [versionRequest setRequestMethod:@"GET"];

        [versionRequest setDelegate:self];

        [versionRequest setTimeOutSeconds:150];

        [versionRequest addRequestHeader:@"Content-Type" value:@"application/json"];

        [versionRequest startSynchronous];

 

        //Response string of our REST call

        NSString* jsonResponseString = [versionRequest responseString];

 

        NSDictionary *loginAuthenticationResponse = [jsonResponseString objectFromJSONString];

 

        NSArray *configData = [loginAuthenticationResponse valueForKey:@"results"];

 

        for (id config in configData)

        {

            version = [config valueForKey:@"version"];

        }

        //Check your version with the version in app store

        if (![version isEqualToString:[itsUserDefaults objectForKey:@"version"]])

        {

            ProAlertView *createUserResponseAlert = [[ProAlertView alloc] initWithTitle:@"New Version!!" message: @"A new version of app is available to download" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Download", nil];

        [createUserResponseAlert show];

        [createUserResponseAlert release];

        }

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    // the user clicked one of the OK/Cancel buttons

    if (buttonIndex == 1)

    {

        NSString *iTunesLink = @"itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=&mt=8";

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

    }

}

 

IOS如何调用WebService?

 http://blog.csdn.net/kangx6/article/details/7615847

 https://github.com/pokeb/asi-http-request/zipball/master

http://github.com/pokeb/asi-http-request/tarball/master

 http://blog.sina.com.cn/s/blog_a30ee5f701016yn3.html

 

iOS应用程序生命周期(前后台切换,应用的各种状态)详解

http://blog.csdn.net/totogo2010/article/details/8048652

 

To add ASIHTTPRequest, first download it. Once you have it downloaded, right click your PromoTest project entry in groups and files, select New Group, and name the new group ASIHTTPRequest. Then drag all of the files from the ASIHTTPRequest\Classes directory (ASIAuthenticationDialog.h and several others, butIMPORTANT! don’t add the subfolders such as ASIWebPageRequest, CloudFiles, S3, and Tests.) into the new ASIHTTPRequest group. Make sure “Copy items into destination group’s folder (if needed)” is selected, and click Finish.

Also repeat this for the two files in ASIHTTPRequest\External\Reachability, as these are dependencies of the project.

 

android版本升级提示

步骤:

1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName

2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

效果图:

   <!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1028" type="#_x0000_t75" alt="说明: OS和安卓更新检测" href="http://photo.blog.sina.com.cn/showpic.html#blogid=a17b071c0101kvtt&amp;url=http://album.sina.com.cn/pic/002XlvfSty6FNWHlDLj99" target="&quot;_blank&quot;" style='width:350pt;height:519pt;visibility:visible; mso-wrap-style:square' o:button="t"> <v:imagedata src="file://localhost/Users/apple/Library/Caches/TemporaryItems/msoclip/0clip_image003.jpg" o:title="OS和安卓更新检测"/> </v:shape><![endif]--><!--[if !vml]-->说明: OS和安卓更新检测<!--[endif]-->

<!--[if gte vml 1]><v:shape id="图片_x0020_3" o:spid="_x0000_i1027" type="#_x0000_t75" alt="说明: OS和安卓更新检测" href="http://photo.blog.sina.com.cn/showpic.html#blogid=a17b071c0101kvtt&amp;url=http://album.sina.com.cn/pic/002XlvfSty6FNWHCoBm6c" target="&quot;_blank&quot;" style='width:341pt;height:510pt;visibility:visible; mso-wrap-style:square' o:button="t"> <v:imagedata src="file://localhost/Users/apple/Library/Caches/TemporaryItems/msoclip/0clip_image005.jpg" o:title="OS和安卓更新检测"/> </v:shape><![endif]--><!--[if !vml]-->说明: OS和安卓更新检测<!--[endif]-->

<!--[if gte vml 1]><v:shape id="图片_x0020_4" o:spid="_x0000_i1026" type="#_x0000_t75" alt="说明: OS和安卓更新检测" href="http://photo.blog.sina.com.cn/showpic.html#blogid=a17b071c0101kvtt&amp;url=http://album.sina.com.cn/pic/002XlvfSty6FNWHFc8V41" target="&quot;_blank&quot;" style='width:334pt;height:467pt;visibility:visible; mso-wrap-style:square' o:button="t"> <v:imagedata src="file://localhost/Users/apple/Library/Caches/TemporaryItems/msoclip/0clip_image007.jpg" o:title="OS和安卓更新检测"/> </v:shape><![endif]--><!--[if !vml]-->说明: OS和安卓更新检测<!--[endif]-->

<!--[if gte vml 1]><v:shape id="图片_x0020_5" o:spid="_x0000_i1025" type="#_x0000_t75" alt="说明: OS和安卓更新检测" href="http://photo.blog.sina.com.cn/showpic.html#blogid=a17b071c0101kvtt&amp;url=http://album.sina.com.cn/pic/002XlvfSty6FNWHio1A62" target="&quot;_blank&quot;" style='width:319pt;height:474pt;visibility:visible; mso-wrap-style:square' o:button="t"> <v:imagedata src="file://localhost/Users/apple/Library/Caches/TemporaryItems/msoclip/0clip_image009.jpg" o:title="OS和安卓更新检测"/> </v:shape><![endif]--><!--[if !vml]-->说明: OS和安卓更新检测<!--[endif]-->

    

     

1. 获取当前程序的版本号

private String getVersionName() throws Exception{

      //获取packagemanager的实例

      PackageManager packageManager = getPackageManager();

      //getPackageName()是你当前类的包名,0代表是获取版本信息

      PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);

    return packInfo.versionName;

}

2.   获取服务器端的版本号

public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{

      XmlPullParser  parser = Xml.newPullParser(); 

      parser.setInput(is, "utf-8");//设置解析的数据源

      int type = parser.getEventType();

      UpdataInfo info = new UpdataInfo();//实体

      while(type != XmlPullParser.END_DOCUMENT ){

           switch (type) {

           case XmlPullParser.START_TAG:

               if("version".equals(parser.getName())){

                    info.setVersion(parser.nextText());  //获取版本号

               }else if ("url".equals(parser.getName())){

                    info.setUrl(parser.nextText());  //获取要升级的APK文件

               }else if ("description".equals(parser.getName())){

                    info.setDescription(parser.nextText());   //获取该文件的信息

               }

               break;

           }

           type = parser.next();

      }

      return info;

}

3.   从服务器下载apk

public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{

      //如果相等的话表示当前的sdcard挂载在手机上并且是可用的

      if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

           URL url = new URL(path);

           HttpURLConnection conn =  (HttpURLConnection) url.openConnection();

           conn.setConnectTimeout(5000);

           //获取到文件的大小

           pd.setMax(conn.getContentLength());

           InputStream is = conn.getInputStream();

           File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");

           FileOutputStream fos = new FileOutputStream(file);

           BufferedInputStream bis = new BufferedInputStream(is);

           byte[] buffer = new byte[1024];

           int len ;

           int total=0;

           while((len =bis.read(buffer))!=-1){

               fos.write(buffer, 0, len);

               total+= len;

               //获取当前下载量

               pd.setProgress(total);

           }

           fos.close();

           bis.close();

           is.close();

           return file;

      }

      else{

           return null;

      }

}

4.   匹配、下载、自动安装

public class CheckVersionTask implements Runnable{

 

      public void run() {

           try {

               //从资源文件获取服务器 地址

               String path = getResources().getString(R.string.serverurl);

               //包装成url的对象

               URL url = new URL(path);

               HttpURLConnection conn =  (HttpURLConnection) url.openConnection();

               conn.setConnectTimeout(5000);

               InputStream is =conn.getInputStream();

               info =  UpdataInfoParser.getUpdataInfo(is);

              

               if(info.getVersion().equals(versionname)){

                    Log.i(TAG,"版本号相同无需升级");

                    LoginMain();

               }else{

                    Log.i(TAG,"版本号不同 ,提示用户升级 ");

                    Message msg = new Message();

                    msg.what = UPDATA_CLIENT;

                    handler.sendMessage(msg);

               }

           } catch (Exception e) {

               // 待处理

               Message msg = new Message();

               msg.what = GET_UNDATAINFO_ERROR;

               handler.sendMessage(msg);

               e.printStackTrace();

           }

      }

}

Handler handler = new Handler(){

     

      @Override

      public void handleMessage(Message msg) {

           // TODO Auto-generated method stub

           super.handleMessage(msg);

           switch (msg.what) {

           case UPDATA_CLIENT:

               //对话框通知用户升级程序

               showUpdataDialog();

               break;

           case GET_UNDATAINFO_ERROR:

               //服务器超时

               Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();

               LoginMain();

               break;  

           case DOWN_ERROR:

               //下载apk失败

               Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();

               LoginMain();

               break;  

           }

      }

};

protected void showUpdataDialog() {

      AlertDialog.Builder builer = new Builder(this) ;

      builer.setTitle("版本升级");

      builer.setMessage(info.getDescription());

      //当点确定按钮时从服务器上下载 新的apk 然后安装

      builer.setPositiveButton("确定", new OnClickListener() {

      public void onClick(DialogInterface dialog, int which) {

               Log.i(TAG,"下载apk,更新");

               downLoadApk();

           }  

      });

      //当点取消按钮时进行登录

      builer.setNegativeButton("取消", new OnClickListener() {

           public void onClick(DialogInterface dialog, int which) {

               // TODO Auto-generated method stub

               LoginMain();

           }

      });

      AlertDialog dialog = builer.create();

      dialog.show();

}

protected void downLoadApk() {

      final ProgressDialog pd;    //进度条对话框

      pd = new  ProgressDialog(this);

      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

      pd.setMessage("正在下载更新");

      pd.show();

      new Thread(){

           @Override

           public void run() {

               try {

                    File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);

                    sleep(3000);

                    installApk(file);

                    pd.dismiss(); //结束掉进度条对话框

               } catch (Exception e) {

                    Message msg = new Message();

                    msg.what = DOWN_ERROR;

                    handler.sendMessage(msg);

                    e.printStackTrace();

               }

           }}.start();

}

//安装apk

protected void installApk(File file) {

      Intent intent = new Intent();

      //执行动作

      intent.setAction(Intent.ACTION_VIEW);

      //执行的数据类型

      intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

      startActivity(intent);

}

private void LoginMain(){

      Intent intent = new Intent(this,MainActivity.class);

      startActivity(intent);

      //结束掉当前的activity

      this.finish();

}

5.   Updatainfo

public class UpdataInfo {

private String version;

private String url;

private String description;

public String getVersion() {

      return version;

}

public void setVersion(String version) {

      this.version = version;

}

public String getUrl() {

      return url;

}

public void setUrl(String url) {

      this.url = url;

}

public String getDescription() {

      return description;

}

public void setDescription(String description) {

      this.description = description;

}

}

6.   update.xml

2.0

http://192.168.1.187:8080/mobilesafe.apk

检测到最新版本,请及时更新!

 

 

http://jon-lt.iteye.com/blog/1513076

<!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>10 pt</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> <w:UseFELayout/> </w:Compatibility> <w:NoLineBreaksAfter Lang="JA">$([{£¥·‘“〈《「『【〔〖〝﹙﹛﹝$(.[{£¥</w:NoLineBreaksAfter> <w:NoLineBreaksBefore Lang="JA">!%),.:;&gt;?]}¢¨°·ˇˉ―‖’”…‰′″›℃∶、。〃〉》」』】〕〗〞︶︺︾﹀﹄﹚﹜﹞!"%'),.:;?]`|}~¢</w:NoLineBreaksBefore> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="276"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:Cambria; mso-ascii-font-family:Cambria; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Cambria; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} </style> <![endif]--> <!--StartFragment--> <!--EndFragment-->

 

你可能感兴趣的:(版本)