精华内容
下载资源
问答
  • 自动更新时间软件

    热门讨论 2012-02-09 10:43:04
    开机自动联网更新时间,后台影藏运行,无毒无插件
  • 用VC++实现的软件自动更新模块 Updater.exe源码。主程序从服务器下载配置文件后对比本地配置文件,有新版本则打开Updater.exe进行自动更新,可以显示需要下载的文件列表,文件大小,文件下载状态等。CSDN我找了,...
  • c#软件自动更新源码

    热门讨论 2012-10-19 16:58:06
    自己项目中用到的自动更新的程序,C#,.NET FRAMEWORK2.0,更新文件为ZIP压缩文件,软件检测到更新后可下载文件并解压,替换
  • 这是综合网上的相关代码做了简化和测试,以保证完全可用。 1、配置好更新文件的web服务器,例如IIS...TODO 生成xml工具来不及做成自动更新版本了(根据datetime和size判断),有兴趣的朋友可继续完善。 2018.1.22
  • 1.Android 8.0以后无法下载到SDK中 问题原因:文件的存储权限原因导致的 动态申请sdk存储权限:Android 6.0以后都是需要动态申请权限的,注意即使动态申请了权限也要在AndroidManifest.xml申请一下,因为需要兼容...

    因为Android系统版本的不同踩了不少坑,在此记录。

    1.Android 8.0以后无法下载到SDK中

    问题原因: 文件的存储权限原因导致的

    1. 动态申请sdk存储权限:Android 6.0以后都是需要动态申请权限的,注意即使动态申请了权限也要在AndroidManifest.xml申请一下,因为需要兼容低版本,低版本中没有动态申请权限一说。
    2. Android 7.0以后又对存储权限加了限制应用私有目录被限制访问 
    •  私有文件的文件权限不应再由所有者放宽,使用MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE将抛出异常 
    • 向应用外传递file://URI会出发FileUriExposedException

    解决方法:

       问题一:判断版本,动态申请权限

     //----------------------------------------动态申请权限-------------------------------
     private void sdkPermission() {
            if(Build.VERSION.SDK_INT>Build.VERSION_CODES.M) {//高于6.0版本,动态申请权限
                if (ContextCompat.checkSelfPermission(context, "android.permission.WRITE_EXTERNAL_STORAGE") != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 111);
                } else {
                    downloadApk();
                }
            }
            else {
                downloadApk();//低于6.0版本,直接下载apk
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            switch (requestCode) {
                case 111:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //权限已经都通过了,可以下载apk到SDk中了
                        downloadApk();
                    } else {
                       // 没有申请权限
                        showPermissionDialog();
                    }
                    break;
                default:
            }
        }

       问题二:7.0以后使用FileProvider访问sdk私有文件

    FileProvider:   

         当targetSdkVersion>=24时,会存在上述问题,可能涉及到的场景有:拍照,程序安装等。 
         同时,官方在v4包(api=22开始)中引入FileProvider类用于程序间私有文件的共享。该类继承自ContentProvider,使用时需  要在清单文件中注册

    • 第一步   注册:在清单文件中通过标签注册,参考代码对属性进行说明:

      注意:当自定义类继承FileProvider时,需要更改name属性值为该类的相对路径。

    <manifest>
        ...
        <application>
            ...
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.mydomain.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                  android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/file_paths" />
            </provider>
            ...
        </application>
    </manifest>

       说明:meta_data中的

                     name:为固定值android.support.FILE_PROVIDER_PATHS 

                     resource:所对应的xml文件路径

    • 第二步  resource对应的xml文件编写:作用设置可访问的共享文件 

          FileProvide只能对在paths中声明了的文件夹下的文件生成uri。

         下例子就是声明私有文件目录下images/下的文件可以临时访问(文件在res/xml/目录下),下面时一个简单的样式:

        1.创建xml:res/xml/file_paths

    2.file_paths.xml中添加代码:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths xmlns:android="http://schemas.android.com/apk/res/android">
           <files-path name="my_images" path="images/"/>
           <files-path name="my_docs" path="docs/"/>
      </paths>
    </resources>

    因为的子标签可以有多种,这里对所有进行说明:

    子标签中属性说明:

    • 第三步  FileProvider的使用:

    1、通过路径生成要分享的File对象。

    2、使用FileProvider生成临时访问uri (FileProvide.getUriForFile()).

    3、客户端可以使用uri通过ContentResolver.openFileDescriptor获取到一个ParcelFileDescriptor 

    案例:

    File imagePath = new File(Context.getFilesDir(), "images");
    File newFile = new File(imagePath, "default_image.jpg");
    Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
    
    //改代码生成的uri为:content://com.mydomain.fileprovider/my_images/default_image.jpg

    临时权限的授予方式 

    1. 使用Context.grantUriPermission(package,Uri,mode_flags)方法,使用想要的模式。这个方法通过mode_flags方法授予客户  端package的临时权限,有两个取值,FLAG_GRANT_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSOIN。该方式允许后,可通过revokeUriPermission终止,或者手机重启后 
    2. 通过Intent 
    • 通过Intent的setData()方法将该uri放入Intent中
    • 可以为Intent设置flag,设置一个或两个, FLAG_GRANT_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSOIN
    • 将Intent发送给其他app,大部分情况,通过setResult()来做 这种方法获取的权限,当接收的Activity在栈中一直活跃时都会保留,当activity栈finish时,权限会自动移除。被允许的activity所在的app的其他组件也会被允许该权限。

    案例代码:

    • 步骤一:在AndroidManifest.xml中的application注册FileProvider的清单文件
     //临时访问文件的注册
            <provider
                android:authorities="${applicationId}.android7.fileprovider"
                android:name="android.support.v4.content.FileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
                ></provider>
    • 步骤二:res中创建xml包,添加file_paths.xml,在file_paths.xml中添加如下文件
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <external-path path="Android/data/com.example.socket.phonesafe/"        name="files_root" />
            <external-path path="." name="external_storage_root" />
        </paths>
    </resources>
    • 步骤三:代码中使用
    private void installApk(File file) {
            Uri uri=null;
            try {
                Intent intent=new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//为intent 设置特殊的标志,会覆盖 intent 已经设置的所有标志。
                if(Build.VERSION.SDK_INT>=24){//7.0 以上版本利用FileProvider进行访问私有文件
                    uri=FileProvider.getUriForFile(content,content.getPackageName() + ".android7.fileprovider",file);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//为intent 添加特殊的标志,不会覆盖,只会追加。
                }
                else {
                    //直接访问文件
                    uri=Uri.fromFile(file);
                    intent.setAction(Intent.ACTION_VIEW);
                }
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
                startActivity(intent);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

     

    2.下载成功了没有跳出应用安装界面

    原因:

    Android 8.0的系统中,“未知来源应用权限”的开关被移除掉了,取而代之的是未知来源应用的管理列表,如果你想要安装某个被自己所信任的开发者的app,则需要在每一次都手动授权“安装未知应用”的许可。设置页面如下图:(在华为Android 8.0中,打开该设置页面:设置列表—>安全与隐私—>更多安全设置—>安装未知应用)

    如图所示*,若某个应用选择的是“不允许”,那么假设app手动升级的时候,就无法成功跳转到安装页面进行正常的App升级流程了,此时需要手动去授权才行,但是很多用户并不知道需要这么设置。

    解决方法:

       安装软件前,先监测是否许可了此软件的“安装未知应用”,如果没有允许就跳转到设置页面,然后用户手动允许一下,如果允许了,就可以直接安装应用了。

     

    步骤一:在AndroidManifest.xml文件中,添加REQUEST_INSTALL_PACKAGES权限

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

    步骤二:判断版本号、是否允许安装此未知应用

               if(Build.VERSION.SDK_INT>Build.VERSION_CODES.O){
                        installAllowed=content.getPackageManager().canRequestPackageInstalls();//是否允许安装包
                        if(installAllowed){
                            installApk(file);//允许,安装
                        }else {
                            //跳转到设置页面,设置成允许安装
                            Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + content.getPackageName()));
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            content.startActivity(intent);
                            installApk(file);
                            return;
                        }
    
                    }
                    //版本低于8.0
                    else {
                        installApk(file);
                    }
    //安装apk
        private void installApk(File file) {
            Uri uri=null;
            try {
                Intent intent=new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//为intent 设置特殊的标志,会覆盖 intent 已经设置的所有标志。
                if(Build.VERSION.SDK_INT>=24){//7.0 以上版本利用FileProvider进行访问私有文件
                    uri=FileProvider.getUriForFile(content,content.getPackageName() + ".android7.fileprovider",file);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//为intent 添加特殊的标志,不会覆盖,只会追加。
                }
                else {
                    //直接访问文件
                    uri=Uri.fromFile(file);
                    intent.setAction(Intent.ACTION_VIEW);
                }
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
                startActivity(intent);
            } catch (Exception e) {
                e.printStackTrace();
            }

    百度网盘源码:https://pan.baidu.com/s/1gKly1Syobmj1MkainAwOkw

     密码:9lj5

    注解:版本信息和要升级的apk存放在自己tomcat服务器中的webapps—ROOT中,然后开启tomcat,代码中就可以直接访问下载了。

    参考:https://blog.csdn.net/chen_white/article/details/72819814

    https://www.jianshu.com/p/e05f35fbb569

     

    注:如果你的gradle版本和我的不一样导致下载的代码不能运行,可看我另一篇代码可以解决这个问题https://blog.csdn.net/na2609613672/article/details/89086952

    展开全文
  • android实现软件自动更新

    热门讨论 2011-09-22 14:36:23
    android手机软件时常更新,又不能让用户每次上官网下载,实现自动更新,可以让用户自己选择自动更新。而且可以直接在手机上直接下载更新。
  • 随着 iOS 14.5 的发布,iOS 14 的软件更新使命基本完成,再无休止的刷版本号已无意义。除非有新的产品发布需要配套的软件更新,那么就安静等待 iOS 15.0 吧。友情提示:建议使用 DFU 更新,特别是一些相对老旧的机型...

    适用于 iOS、iPadOS 和 watchOS,即 iPhone、iPad 和 Apple Watch 通用。

    请访问原文链接:https://sysin.org/blog/disable-ios-update/,查看最新版。原创作品,转载请保留出处。

    作者:gc(at)sysin.org,主页:www.sysin.org

    2021.05.04,iOS 14.5.1 发布,出现了严重的降速门事件,切勿随意更新!遗憾的是,5 月 11 日,Apple 关闭了 iOS 14.5 验证,已经无法升级到 14.5。

    2021.04.27,iOS 14.5 发布时,配置描述文件已经过期,但是仍然可以使用。

    随着 iOS 14.5 的发布,iOS 14 的软件更新使命基本完成,再无休止的刷版本号已无意义。除非有新的产品发布需要配套的软件更新,那么就安静等待 iOS 15.0 吧。友情提示:建议使用 DFU 更新,特别是一些相对老旧的机型,强烈建议通过 DFU 更新 ipsw,而不要使用 OTA 在线更新。

    参看:使用 “恢复模式” 或 “DFU 模式” 来更新和恢复 iOS 固件

    配置描述文件可适用于 iOS 12、13、14 及其对应的 iPadOS 12、13、14 和 watchOS 5、6、7。

    2020.09.17:描述文件可用于 iOS 14.0,iPadOS 14.0 和 watchOS 7.0。

    apple

    1. 关闭自动更新

    ”设置“ ⚙️ > ”通用“ > ”软件更新“,确保自动更新已经关闭。

    2. 使用配置描述文件

    什么是配置描述文件?

    配置描述文件是一个 XML 文件(以 .mobileconfig 结尾),其中包含将设置和授权信息载入到 Apple 设备的有效负载。它会自动配置设置、帐户、访问限制和凭证。这些文件可通过 MDM 解决方案或 Apple Configurator 2 创建,也可手动创建。

    由于配置描述文件可被加密和签名,因此您可以将其限制用于特定的 Apple 设备,并阻止除拥有用户名和密码外的任何人更改其中的设置。您还可以将配置描述文件标记为被锁定到设备。

    下载描述文件

    描述文件下载地址:

    手机或者 iPad 上用 safari 浏览器打开上面两个网址中的任意一个:

    根据提示安装即可。安装完毕重启设备(如有提示)。如果您有 Apple Watch,会提示选择将描述文件安装到当前设备还是 Apple Watch 上。

    屏蔽原理:下载的是 “tvOS Beta Software Profile” 描述文件,作用是让 Apple 服务器将 iPhone、iPad 或者 Watch 识别为 Apple TV,从而不推送 iOS 的更新。

    删除描述文件

    如果需要继续接收软件更新,在 “设置” ⚙️ > “通用” > “描述文件” (或者为”描述文件与设备管理“)中可查看您所安装的描述文件。点击描述文件即可查看详细信息或者移除。

    安装过期的描述文件

    当前描述文件过期,其实仍然可以使用特定方法安装:

    (1) “设置” ⚙️ > “通用” > “时间与日期”,关闭 “自动设置”,点按下面显示的日期,修改为过期之前的时间(现在上述网站描述文件 2020.02.01 过期,这里可以修改为 2020 年 1 月任意日期)。注意:按 < > 调整年份和月份后,再点按一下日期才能生效;

    ios-update-01

    (2) 用 safari 浏览器访问 https://ibeta.me/,网站提示”您的时钟设置不正确“,点击下方 ”显示详细信息“,再点击 “访问此网站”,网站可以正常打开,点击”屏蔽 OTA 更新” 根据提示下载描述文件;

    ios-update-02

    (3) “设置” ⚙️ 直接可以看到描述文件,或者 “设置” ⚙️ > “通用” > “描述文件”,点击 “安装”,安装完毕提示 “重新启动”,点击 “重新启动”;

    (4) 启动后,“设置” ⚙️ > “通用” > “时间与日期”,打开 “自动设置”;

    (5) “设置” ⚙️ > “通用” > “软件更新”,此时出现 “iOS 已是最新版本”,大功告成!更新标记(红点数字 1)也自动消失!

    ios-update-03

    (6) 上述 “软件更新” 若有报错,需要重新启动即可正常,因为调整时间导致。“设置” ⚙️ > “通用” > “关机”,然后在按电源按钮开机。

    3. 通过网络屏蔽

    该方法效果稍差,网络环境通常无法控制,Apple 官方提供的地址也有变数,仅供参考。

    在上述描述文件有效的情况下直接安装描述文件可以有效的屏蔽更新。如果现在没有可用的描述文件,可以通过屏蔽特定 URL 来禁用自动检测和下载更新。

    去除更新标记(红点数字 1)

    通常在 ”Wi-Fi + 充电“ 的条件下,系统会自动检测和下载更新,此时在 “设置” ⚙️ > “通用” > “iPhone 存储空间”,找到软件更新文件删除,必要时重启系统,标记即可消失。

    打开 “设置” ⚙️ > “通用” > “软件更新” > “自动更新”,打开 “下载 iOS 更新”,关闭 “安装 iOS 更新” ,然后连接 Wi-Fi,连接充电器,软件开始自动下载,此时在 “设置” ⚙️ > “通用” > “iPhone 存储空间”,找到软件更新文件删除,标记即可消失。

    但总有一些顽固的更新标记,一般通过以下方法可以去除:

    • 方法一:退出 iCloud 登录(前往 “设置” > “[您的姓名]” > 退出登录),还原网络设置(可能需要),标记可以去除,重新登录 iCloud

    • 方法二:“设置” ⚙️ > “通用” > “还原” > “还原所有设置”

    关于 “还原” 的详细说明:

    前往 “设置” ⚙️ > “通用” > “还原”。

    选取一个选项:

    **【警告】**如果选取 “抹掉所有内容和设置” 选项,那么您的所有内容都会被移除。请参阅抹掉 iPhone

    • *还原所有设置:*所有设置(包括网络设置、键盘词典、主屏幕布局、位置设置、隐私设置和 Apple Pay 卡片)都将移除或还原至默认状态。不会删除数据或媒体。

    • *还原网络设置:*所有网络设置都会移除。此外,在 “设置” > “通用” > “关于本机” 中分配的设备名称会还原为 “iPhone”,且手动信任的证书(如网站的证书)会变为不受信任。(由配置描述文件或移动设备管理 (MDM) 安装的 VPN 设置会保留)

    屏蔽更新网址

    在网关设备(比如路由器或者防火墙)上屏蔽 iOS 更新网址,或者是通过写 hosts 的方式填写如下条目:

    #主要
    127.0.0.1 mesu.apple.com
    127.0.0.1 appldnld.apple.com
    #次要
    127.0.0.1 xp.apple.com
    127.0.0.1 gdmf.apple.com
    127.0.0.1 ns.itunes.apple.com
    127.0.0.1 gg.apple.com
    

    具体网关设备配置方法可以咨询一下厂商客服或者自行搜索。

    必要时可以考虑屏蔽更多的地址,参看下表。

    iOS 设备软件更新使用的主机和端口列表:

    主机端口协议OS描述支持代理
    appldnld.apple.com80TCP仅限 iOSiOS 更新
    gg.apple.com443、80TCPiOS、Apple tvOS 和 macOSiOS、Apple tvOS 和 macOS 更新
    mesu.apple.com443、80TCPiOS、Apple tvOS 和 macOS托管软件更新目录
    ns.itunes.apple.com443TCP仅限 iOS
    updates-http.cdn-apple.com80TCPiOS、Apple tvOS 和 macOS
    updates.cdn-apple.com443TCPiOS、Apple tvOS 和 macOS
    xp.apple.com443TCPiOS、Apple tvOS 和 macOS
    gdmf.apple.com443TCPiOS、Apple tvOS 和 macOS供 MDM 服务器用来识别使用“被管理的软件更新”的设备有哪些可用的软件更新

    4. 禁用 App Store 自动更新和去除更新标记

    禁用 App Store 自动更新

    “设置” ⚙️ > “App Store”,关闭 “App 更新” 和 “自动下载”,如图:

    ios-update-04

    禁用 App Store 更新标记

    “设置” ⚙️ > “通知” > “App Store”,关闭 “标记”,或者直接关闭 “允许通知”。

    展开全文
  • C++实现软件自动更新(update)

    千次下载 热门讨论 2010-01-04 16:11:29
    C++编写,实现软件版本与服务器端版本库比较,如果有新版本则自动更新。压缩包包括服务器端示例。
  • 软件自动更新原理

    千次阅读 2018-04-12 10:50:00
    在互联网不太普及的时代,很多软件公司还是会发布离线更新包,这种更新包其实就是个安装程序,只是安装的内容是更新的部分,没有变化的文件直接用已经安装的版本的。此外这些安装程序还会修改一些系统配置以适应新...
    转载:https://www.zhihu.com/question/24263552/answer/27216798

    在互联网不太普及的时代,很多软件公司还是会发布离线更新包,这种更新包其实就是个安装程序,只是安装的内容是更新的部分,没有变化的文件直接用已经安装的版本的。此外这些安装程序还会修改一些系统配置以适应新版本的功能,比如注册COM组件,修改注册表等。

    现在互联网已经十分普及,几乎所有软件都采用在线升级,具体实现上,有下列几种做法。

    1. 比较简单的,通过http协议,检测是否有更新,就是把本地版本号发给服务器,服务器会返回一个配置文件,里面表明是否有新版本,并且带有新版本的下载地址,更新程序按照URL下载新版本的安装程序,然后执行这个安装程序,用户根据安装程序提示进行更新。

    2. 再进化一步,每次都重新安装太麻烦,更新程序下载一个新版本的压缩包(zip/7z),然后帮用户解压缩到安装目录。现在客户端都追求简单设计尽量降低和系统的耦合,基本都是复制文件就算安装的那种绿色软件,所以把新版本的文件一更新就能用。

    3. 如果某个软件体积已经比较大了,比如大于10MB,每次都下载一个完整的新版本的话,下载就太慢,安装也慢。既然本地已经有个安装版本了,每次更新其实变化的东西也不是很多,那么有个软件就下载一个更新文件的压缩包,然后解压缩到安装目录覆盖旧文件。

    4. 有的软件更大,更新也频繁,每次更新的exe dll模块大多都有更新,所以还是要下载很大的更新包,于是有人用 bsdiff算法求新版本和旧版本的二进制差异,如果新版本就是修了bug改了几行代码,那么bsdiff生产的补丁也就几KB,下载的二进制补丁用bspatch来更新本地版本。bsdiff的算法库很小,大约才30+KB很容易集成到更新程序里。

    5. 有的软件更更大,即使用bsdiff产生的补丁还是很大,有人搞出了更给力的补丁算法,Chrome的方法,
    从介绍看,它比bsdiff生成的补丁还要小一个数量级,这个想法相当巧妙,对于那种代码模块为主的程序尤其有效。很多时候我们只改了几行代码,但是DLL模块却改变了很多,主要是因为代码优化链接时重排造成的,如果比较汇编代码差异就会很小,Courgette就把DLL反编译成汇编码,然后和旧版本的汇编码比较得到差异,更新的时候把旧版本也反编译打补丁然后再编译成DLL。这样的话如果只改了几行代码,那么生成的补丁可能就几十个字节。

    6. 随着更新包越来越大,更新下载和安装的时间也越来越长,造成用户长时间等待,有的软件采用了后台下载后台更新的方式。所谓后台下载就是无论用户是否点了立刻更新,只要有新版本就在后台偷偷给用户下载下来,有点流氓,但这也是为了用户体验呢。那么后台更新呢,正在运行的程序,每个文件都是被占用的,是不能更新的。还是Chrome想出来的,双目录更新,把就版本先复制到另一个目录,然后更新这份新复制的,下次用户启动的时候就直接启动新版本。
    比如 Chrome有如下的目录结构
    Chrome
        +Application
            +35.0.1916.153
            +35.0.1916.114
             chrome.exe 
    

    它用版本号做目录名,每次升级的时候更新新版本,旧版本在另一个目录运行不受影响。下次启动的时候 Chrome.exe永远加载最新版本的dll运行就好了。chrome.exe是个很小的程序,里面的逻辑就是检测下版本号加载最新版本的dll,这样简单的程序本身几乎不需要更新。


    在需求的推动下,现代客户端的升级程序已经相当复杂了,包括了支持灰度放量的新版本检测,http断点续传下载,MD5完整性校验,bsdiff/courgette 二进制补丁更新,双目录迭代升级等技术。到了移动app时代,以上这些技术都用不到了,操作系统垄断了升级机制,只能通过操作系统检测下载安装更新,iOS做得相当彻底,Android还给app留了条自己下载apk安装的路,但是二进制补丁完整性校验等就彻底不需要app开发者自己操心了。

    转载于:https://www.cnblogs.com/gaara-zhang/p/8806157.html

    展开全文
  • electron-vue 软件自动更新

    千次阅读 2020-06-30 12:22:48
    //接收渲染进程消息,开始检查更新 ipcMain.on("checkForUpdate", (e, arg) => { //执行自动更新检查 // sendUpdateMessage({cmd:'checkForUpdate',message:arg}) autoUpdater.checkForUpdates(); }) } //给渲染...

    我本人特别不喜欢那么长篇博客,我尽量缩减。

    参考1: https://blog.csdn.net/gsj4719896/article/details/100131840
    参考2:https://www.jianshu.com/p/15bde714e198

    第一步:安装electron-updater

    npm install electron-updater --save
    

    第二步:在vue.config.js里添加public配置,打包将会在dist目录中生成latest.yml文件

    1. 我看很多文章都将public配置放在package.json的文件里,我是放在vue.config.js文件了,请具体根据项目自行配置。
    2. url就是你打包上传的地址的前缀,比如你打包后的文件会放在http://www.xxx.com/static/demo.exe,那么这个url就是http://www.xxx.com/static/
    3. 关于latest.yml这个文件要放到和上传文件一致的位置,要和2的位置保持一致http://www.xxx.com/static/latest.yml
      在这里插入图片描述

    在这里插入图片描述

    第三步:请求服务器更新,将这部分的逻辑抽成一个update.js文件

    import {
        autoUpdater
    } from 'electron-updater'
     
    import {
        ipcMain
    } from 'electron'
    let mainWindow = null;
    export function updateHandle(window, feedUrl) {
        mainWindow = window;
        let message = {
            error: '检查更新出错',
            checking: '正在检查更新……',
            updateAva: '检测到新版本,正在下载……',
            updateNotAva: '现在使用的就是最新版本,不用更新',
        };
        //设置更新包的地址
        autoUpdater.setFeedURL(feedUrl);
        //监听升级失败事件
        autoUpdater.on('error', function (error) {
            sendUpdateMessage({
                cmd: 'error',
                message: error
            })
        });
        //监听开始检测更新事件
        autoUpdater.on('checking-for-update', function (message) {
            sendUpdateMessage({
                cmd: 'checking-for-update',
                message: message
            })
        });
        //监听发现可用更新事件
        autoUpdater.on('update-available', function (message) {
            sendUpdateMessage({
                cmd: 'update-available',
                message: message
            })
        });
        //监听没有可用更新事件
        autoUpdater.on('update-not-available', function (message) {
            sendUpdateMessage({
                cmd: 'update-not-available',
                message: message
            })
        });
     
        // 更新下载进度事件
        autoUpdater.on('download-progress', function (progressObj) {
            sendUpdateMessage({
                cmd: 'download-progress',
                message: progressObj
            })
        });
        //监听下载完成事件
        autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl) {
            sendUpdateMessage({
                cmd: 'update-downloaded',
                message: {
                    releaseNotes,
                    releaseName,
                    releaseDate,
                    updateUrl
                }
            })
            //退出并安装更新包
            autoUpdater.quitAndInstall();
        });
     
        //接收渲染进程消息,开始检查更新
        ipcMain.on("checkForUpdate", (e, arg) => {
            //执行自动更新检查
            // sendUpdateMessage({cmd:'checkForUpdate',message:arg})
            autoUpdater.checkForUpdates();
        })
    }
    //给渲染进程发送消息
    function sendUpdateMessage(text) {
        mainWindow.webContents.send('message', text)
    }
    

    第四步:background.ts引入update.js

    1、我看好多文章都是在main/index.js引入的update.js,根据项目的具体结构来,反正都是要引进来的。
    2、主要的代码就两行
    import {updateHandle} from '@/utils/updater.js';
    // --------放在createWindow方法最后一行就行-------------
    updateHandle(win, 'http://static.xuezhong100.cn/client-software/');

    import {updateHandle} from '@/utils/updater.js';
    
    function createWindow() {
      // Create the browser window.
      win = new BrowserWindow({
        width: 800,
        height: 600,
        frame: false,
        center: true,
        webPreferences: {
          nodeIntegration: true,
          webSecurity: false
          // preload: path.join(__dirname, './preload')
        }
      })
    
      var url;
      if (process.env.WEBPACK_DEV_SERVER_URL) {
        url = process.env.WEBPACK_DEV_SERVER_URL as string;
        if (!process.env.IS_TEST) win.webContents.openDevTools()
      } else {
        createProtocol('app')
        url = 'app://./index.html';
      }
    
      win.webContents.openDevTools()
    
    
      win.loadURL(url)
      win.on('closed', () => {
        mainWindow = null
      })
      // 更新,第二个参数就是public里的url,我这里写死了,你直接去找
      updateHandle(win, 'http://static.xuezhong100.cn/client-software/');
    }
    

    第五步:App.vue处理逻辑

    <template>
      <div id="app">
        <router-view></router-view>
        <el-dialog
          title="正在更新新版本,请稍候..."
          :visible.sync="dialogVisible"
          width="60%"
          :close-on-click-modal="closeOnClickModal"
          :close-on-press-escape="closeOnPressEscape"
          :show-close="showClose"
          center
        >
          <div style="width:100%;height:20vh;line-height:20vh;text-align:center">
            <el-progress
              status="success"
              :text-inside="true"
              :stroke-width="20"
              :percentage="percentage"
              :width="strokeWidth"
              :show-text="true"
            ></el-progress>
          </div>
        </el-dialog>
      </div>
    </template>
    <script>
    let ipcRenderer = require("electron").ipcRenderer;
    
    
     
    export default {
      name: "app",
      data() {
        return {
          dialogVisible: false,
          closeOnClickModal: false,
          closeOnPressEscape: false,
          showClose: false,
          percentage: 0,
          strokeWidth:200
        };
      },
      mounted() {
        let _this = this;
    	//接收主进程版本更新消息
    	ipcRenderer.on("message", (event, arg) => {
    	  // for (var i = 0; i < arg.length; i++) {
    	  console.log(arg);
    	  if ("update-available" == arg.cmd) {
    	    //显示升级对话框
    	    _this.dialogVisible = true;
    	  } else if ("download-progress" == arg.cmd) {
    	    //更新升级进度
    	    /**
    	     * 
    	     * message{bytesPerSecond: 47673
    	      delta: 48960
    	      percent: 0.11438799862426002
    	      total: 42801693
    	      transferred: 48960
    	      }
    	     */
    	    console.log(arg.message.percent);
    	    let percent = Math.round(parseFloat(arg.message.percent));
    	    _this.percentage = percent;
    	  } else if ("error" == arg.cmd) {
    	    _this.dialogVisible = false;
    	    _this.$message("更新失败");
    	  }
    	  // }
    	});
      	ipcRenderer.send("checkForUpdate");
      }
    };
    </script>
    

    第六步:结果+错误分析

    然后让我们打包一份,打包的版本是比如是1.1.0,将latest.yml(里面对应exe的版本信息、称之类的)和对应的exe放到服务器地址上,将本地的package.json的version改成1.0.0(因为更新是通过版本号的对比控制的)更新操作就会触发,这时候如果你能顺利显示下图,说明你这边已经很顺利的完成了

    在这里插入图片描述

    很不幸,如果你报错了

    • 问题描述:问题4:控制台会出现:electron-updater code: “ENOENT” errno: -4058 path:
      “E:\project1\edu-student\dist_electron\dev-app-update.yml” syscall:
      “open”
    • 问题描述:dev-app-update.yml文件不存在
    • 问题分析:dev-app-update.yml文件没有打包到default_app.asar中,dev-app-update.yml的格式是怎样的,查看打包后的文件dist\win-unpacked\resources,发现其中一个app-update.yml文件,查阅资料后发现其实dev-app-update.yml的文件内容格式是一样的
      在这里插入图片描述
    • 问题解决:electron-updater中提供了这个文件的属性配置updateConfigPath,修改updater.js文件,我们将调用的地址修改一下。
     autoUpdater.updateConfigPath = path.join(__filename, '../../dist/win-ia32-unpacked/resources/app-update.yml')
    

    在这里插入图片描述

    改到这一步,你还报错,比如说命令行报错,下载失败balabla的,看下你请求的exe地址是不是有中文,中文会到导致下载失败,请改成英文。对应的yml里的文件名称也改成英文,在试一下。我就是走到这一步才成功才下载成功!!!!走了很多弯路,各种试,到最后下载下来,成就感还是蛮强的。

    展开全文
  • uni-app自动更新软件功能实现

    千次阅读 2020-03-03 11:52:32
    let that; export default { data(){ return{ version:"1.0.0",//版本号...//下载最新版本APP } } }); } } }); } } } /*每个页面公共css */  
  • UniAPP 安卓应用版本自动更新下载安装

    万次阅读 多人点赞 2019-06-21 19:14:47
    近期进行 Uniapp 的开发过程,最后需要实现版本的自动检测和更新下载操作,特地在此进行文章的整理,以方便道友们减少前进道路上的坎坷,多谢指摘 … 注: 本次指导,以更新 安卓应用为案例,ios、小程序等可...
  • 采用C#实现软件自动更新的方法

    千次阅读 2019-10-15 17:55:31
    本文实例分析了采用C#实现软件自动更新的方法,是非常实用的功能,值得学习和借鉴。具体如下: 1.问题概述: 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论...
  • Dreamweaver DW CC2019软件下载及安装教程(亲测可用)

    万次阅读 多人点赞 2019-08-11 00:44:19
    DW CC2019(64位)软件下载地址: pan.baidu.com/s/1aot251D3-339IbKItV0n3g 提取码:alyw 1、"安装前先关闭杀毒软件" 下载软件,解压"Dw CC2019安装包",选择"解压到Dw CC2019安装包/E" 2、解压完成,...
  • 关闭CentOS系统自动更新服务 检查 yum-updatesd chkconfig –list yum-updatesd yum-updatesd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 停止 yum-updatesd 服务 service yum-updatesd stop 查看状态 ...
  • 自动更新原理: 1.通过Python对蓝奏云api的获取分析检测用以下载 2.在通过本文的内容检测达到更新检测的目的 二.更新检测区块: 一.自动更新原理: 1.通过Python对蓝奏云api的获取分析检测用以下载 用Python的...
  • C# 软件自动更新程序

    热门讨论 2010-08-18 17:22:51
    使用C#编写,服务使用WEB服务方式保存更新程序,客户端下载覆盖本地可执行程序,相当好用,无需修改!
  • 对于C/S架构来说,软件更新是一个很常用的功能。对于新手来说,软件自动升级功能的开发或许会有点难度。本文根据作者平时工作中实现的一种方式,介绍一种简单的软件自动升级方案。 工具/原料 VS2010 主程序中...
  • h5+实现APP自动下载更新(hbuilder)

    万次阅读 2017-07-04 15:21:57
    这里的自动更新并非是热更新,而只是单纯检测服务器上是否有新的版本,如果有则下载安装。思路:在服务器中配置一个版本文件:xxx.json{ update:’yes’,//是否自动更新 version:’1.0.8’,//最新的版本号 url:’...
  • 我的软件自动更新程序

    千次阅读 2018-03-23 21:46:35
    软件名称:AutoUpdate.exe软件版本:[2018.3.23.1]软件功能:实现升级程序自身升级和更新主程序;主要流程:主程序启动---主程序检测到新版本---主程序退出,启动升级程序--升级程序启动---检测升级程序自身版本---...
  • Qt实现软件自动更新的一种简单方法

    千次阅读 热门讨论 2019-03-31 12:50:38
    点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示: 如果点击"去下载",那么会调用系统默认浏览器,直接创建下载任务。...
  • 软件自动更新解决方案及QT实现(源码已上传)

    万次阅读 多人点赞 2015-07-11 08:26:39
    软件自动更新解决放案及QT实现
  • R语言软件版本自动更新

    万次阅读 2016-12-04 22:48:27
    这次介绍如何利用R语言命令自动更新你所使用的R语言软件的版本。 代码如下:install.packages("installr")library(installr) updateR()运行命令后,出现如下的提示: ok,保证网络畅通 下载完后会提示安装...
  • python+qt实现CS端软件自动更新的功能

    千次阅读 2019-02-19 15:38:55
    前段时间公司做了个support技术支持的网站,因此想做个在线升级的软件,通过可视化界面(qt)和python下载上传到网站上的文件,来完成自动更新升级的功能。 一、python基于http协议下载文件 python下载网站上的...
  • Android 自己实现更新下载自动安装

    万次阅读 2018-08-11 11:28:10
    1、一些公司开发完一款App之后可能并不会去上架App商店,但事后期也需要定时进行维护更新,所以会选择把打包好的apk 发布到自己的服务器,然后在数据库建一个版本号的表,然后剩下的就交给你android开发了,android...
  • 自动更新程序的代码,使用 VB.NET 语言写。最近为单位写了一个C/S结构的软件,这个软件是工作在单位的局域网内的。为了减轻为程序进行升级的工作量,需要解决程序自动更新的问题。那么如何做一个自动更新程序呢? 想...
  • 众所周知,iOS 系统一直保持着较高的更新频率,但并不是所有用户都喜欢将自己的设备升级到最新版本,尤其是一些旧型号的 iPhone,运行新系统可能会导致卡顿、耗电等异常情况出现。 如果不想升级系统,之前我们是...
  • iOS APP版本自动更新

    千次阅读 2018-07-12 17:20:13
    1.版本自动更新一般采用API对应的方式 获取当前App Store上版本号 于本地存储的版本号对比 2.由服务端返回版本控制升级(容易审核不通过) 参考地址(很详细) ...   想省事的小伙伴们可以直接下载下面文件 ...
  • C#基于ftp自动更新、自动下载

    千次阅读 热门讨论 2017-03-16 10:38:15
    ,显然当前客户端不是最新的,需要进行更新下载; 3 、从 ftp 服务器上下载所需安装的 exe 安装包; 4 、退出当前程序,调用更新程序 调用更新程序: Process.Start(" exe 文件路径 "); 退出当前程序: ...
  • 前言  之前实现过基于无障碍服务的自动更新(如想了解请移步 http://blog.csdn.net/zxc514257857/article/details/72667640),但是在测试及使用过程中发现有如下缺陷: 无障碍服务只出现在android5.0以上系统中,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,271
精华内容 99,308
关键字:

下载自动更新软件