`

自动检测版本及自动升级

 
阅读更多

自动检测版本及自动升级

本来直接找网络上的想马上用,哪知道编译都过去不。花了不少时间,终于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-->

 

分享到:
评论

相关推荐

    Android自动检测版本及自动升级

    在Android应用开发中,自动检测版本及自动升级是一项常见的功能,它能确保用户始终使用的是最新、最安全的软件版本。以下将详细讲解这个过程涉及的技术点和步骤: 1. **获取当前应用版本信息**: - 在...

    Android自动检测版本及自动升级.zip

    在Android应用开发中,自动检测版本和自动升级是提高用户体验和确保应用安全的重要功能。这一功能使得用户无需手动检查更新,而是由应用自动检测新版本并提示或直接进行升级。以下将详细介绍如何实现这一功能。 1. ...

    Android编程实现自动检测版本及自动升级的方法

    在Android应用开发中,自动检测版本及自动升级功能是一个重要的用户体验优化点,它能帮助用户及时获取应用的最新更新,确保应用的安全性和稳定性。以下是如何在Android编程中实现这一功能的详细步骤: 1. **获取...

    Android应用更新之自动检测版本及自动升级

    本文为大家分享了Android自动检测版本及自动升级的具体代码,供大家参考,具体内容如下 步骤: 1.检测当前版本的信息AndroidManifest.xml–&gt;manifest–&gt;[Android] 2.从服务器获取版本号(版本号存在于xml文件中)并...

    android7 以上版本自动更新app

    实现 android7、8 以上版本自动更新app 程序,仅供参考。

    PB程序自动升级,检测版本自动更新程序

    总结来说,"PB程序自动升级,检测版本自动更新程序"涉及到软件工程的持续集成和持续部署(CI/CD)概念,通过自动检测、下载和安装更新,确保用户始终拥有最新、最稳定的软件体验。同时,利用数据库存储版本信息和PBD...

    IOS应用版本自动检测

    在iOS应用开发中,版本自动检测是一项非常重要的功能,它能确保用户始终使用的是最新、最安全的应用版本。本文将详细解析"iOS应用版本自动检测"这一技术,并结合开源代码库iVersion进行深入探讨。 首先,理解版本...

    wpf 自动升级_WPF

    在Windows Presentation Foundation(WPF)应用程序开发中,自动升级功能是一项重要的需求,它允许用户无感知地、便捷地更新应用程序到最新版本。这个主题主要围绕如何在WPF应用中实现一个简单的自动升级机制。下面...

    C#版本的自动升级程序制作

    在IT行业中,自动升级程序是软件生命周期中不可或缺的一部分,它使得开发者可以轻松地将新功能、性能优化或安全修复推送给用户,而无需用户手动下载和安装新的版本。本篇文章将详细探讨如何使用C#语言制作一个自动...

    vc++自动升级程序

    对于VC++(Visual C++)应用程序来说,实现自动升级功能可以使用户保持软件的最新状态,而无需手动下载和安装新版本。本篇文章将深入探讨如何利用C++来构建一个自动升级程序。 首先,我们需要理解自动升级的基本...

    vc++ c++ c 软件自动升级程序源代码 在线自动升级功能 自动升级 源代码

    在线自动升级是指用户无需手动下载新版本的安装包,只需通过网络连接,软件就能自动检测并下载更新。这种功能通常依赖于后台服务,如HTTP或FTP服务器,来存储和分发新版本的软件。 4. **源代码实现**: 在VS2003...

    python+pyqt+软件远程自动检测升级新版本+FTP服务器

    在本实例中,我们主要探讨如何使用Python结合PyQt库构建一个软件远程自动检测升级功能,该功能通过FTP服务器检索并下载新版本的`.exe`安装包。以下将详细介绍涉及的技术点: 1. **Python**: Python是一种高级编程...

    .net winform自动升级

    在.NET WinForm应用程序开发中,实现自动升级功能是一项重要的任务,它能让用户无需手动下载安装新的版本,系统会自动检测并完成更新。本项目提供的代码示例深入展示了自动升级的具体实现,同时也涵盖了升级包自身的...

    delphi版的自动升级程序(自动更新软件)【全绿色的】

    标题中的“delphi版的自动升级程序(自动更新软件)【全绿色的】”指的是使用Delphi编程语言开发的一种无须安装,可直接运行的自动更新机制。这种机制允许软件在用户端进行自我检查和更新,确保软件始终处于最新状态...

    C#winfrom自动升级程序V1.0

    在软件开发中,为了确保用户始终使用最新版本,避免因旧版本存在的问题而影响用户体验,通常会设计自动升级功能。C# WinForm 自动升级程序V1.0是实现这一功能的一种解决方案。本文将详细介绍如何利用C#编程语言构建...

    xamarin App自动升级

    对于 Android 应用来说,实现自动升级功能是提高用户体验和确保应用始终处于最新状态的重要手段。本篇文章将深入探讨如何在 Xamarin 平台上为 Android 应用实现自动升级功能。 首先,我们要理解自动升级的基本流程...

    android app版本自动检测、更新

    在Android应用开发中,版本自动检测与更新是一个关键的特性,它确保用户能够及时获取到应用的最新功能和性能优化,同时修复可能存在的安全漏洞和已知问题。本篇文章将详细探讨这一主题,涵盖以下几个核心知识点: 1...

Global site tag (gtag.js) - Google Analytics