精华内容
下载资源
问答
  • 该项目是通过。... 升级到React Native的新版本需要更新react-native , react和expo软件包版本,并在app.json设置正确的sdkVersion 。 有关软件包版本兼容性的最新信息,请参见版本控制指南。 可用脚本
  • 1⃣️ 下载后,直接前往该路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 2⃣️ 发现没有10.2 的支持包,拖进去。 3⃣️ 重新选择真机,运行
  • APP测试

    2015-01-06 14:57:32
    2.再次进入后,重新获取网络,重新登录 3.断网,登陆后,刷新提示,未连接 4.联通网络,运行软件,软件刷新,此时会出现BUG,网络已经联通,但是未连接字体没有消失,应在联网后,刷新,判断是否有网络,有网络就...

    苹果客户端后台运行

    1.苹果手机客户端后台运行后,实质上是关闭了此软件

    2.再次进入后,重新获取网络,重新登录

    3.断网,登陆后,刷新提示,未连接

    4.联通网络,运行软件,软件刷新,此时会出现BUG,网络已经联通,但是未连接字体没有消失,应在联网后,刷新,判断是否有网络,有网络就让未连接字体消失,无网络,再继续提示


    验收测试

    通常可以包括:安装(升级)、启动与关机、功能测试(正例、重要算法、边界、时序、反例、错误处理)、性能测试(正常的负载、容量变化)、压力测试(临界的负载、容量变化)配置测试、平台测试、安全性测试、恢复测试(再出现掉电、硬件故障或切换、网络故障等情况下,系统是都能够正常运行)、可靠性测试等

    α测试,是指软件开发公司内部人员模拟各类用户进行即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真的模拟实际运行环境和对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式。经过α测试调整的软件产品称为β版本,并要求用户报告异常情况,提出批评意见。然后软件开发公司再对β版本进行改错和完善。一般包括功能度、安全可靠性、易用性、可扩充性、兼容性、效率、资源占用率、用户文档八个方面。

    展开全文
  • 优化连接APP稳定性 要正确升级固件,请仔细执行以下步骤: 1.关掉摄像机。 2.从相机中取出MicroSD卡。 3.使用计算机上FAT 32文件格式重新格式化MicroSD卡*。 4.将固件‘bin’文件复制到MicroSD卡中,请保留固件...
  • 1.APP发布苹果商店时没有修改连接现网服务器的域名,而是连接的测试服务器的IP地址,导致用户升级后不能正常使用,业务中断。由于苹果的APP审核要3到5个工作日,所以不能立刻重新发布APP并下载使用。 解决方案:对...

    特声明本文章只针对典型案例,不针对公司或个人,若有雷同纯属意外。
    1.APP发布苹果商店时没有修改连接现网服务器的域名,而是连接的测试服务器的IP地址,导致用户升级后不能正常使用,业务中断。由于苹果的APP审核要3到5个工作日,所以不能立刻重新发布APP并下载使用。
    解决方案:对版本发布要有发布流程文档,发布APP按照文档进行核对进行。预发测试最好要一天(稳定后的版本最长可达三天),切不可以预发时还在改问题,进入预发测试要封版本,非严重问题不修改,在进入预发测试最后半天禁止提单,修改问题,大多数的严重问题都是发布前修改问题没有全面测试引起的,修改小问题引起大问题的事情多了的去。预发测试用例要包含常用关键测试场景。
    2.APP发布后使用时,发现有关键的图片加载不全或加载不上(透明图片)。开发者通过XCODE安装到测试手机上能正常使用。
    原因是应用图片名称使用了@x2.png,在XCODE上由于对图片有临时存储功能,装到手机上可以找到图片,当生成IPA包时,不能把这类的图片完全匹上。可见这是XCODE的重要BUG。开发者自己很难发现这类问题,除非先生成IPA包,放到http://fir.im,七牛服务器,或上传到苹果商店,用TestFlight下载,或者让另一个开发者下载代码并通过XCODE安装才能真正发现。只让一个人开发一个版本, 不经过上面的准商店测试是发现不了这类问题的。老板为了省钱想一个人包打一切,那样理想是丰满的,现实是骨干的,人员备份还是好处的。
    3.APP开启了定位服务,结果应用中的页面没有一个页面有带地图定位的页面,导致驳回,要求提供有地图定位的视频。
    原因是提供给审核人员的账户里没有数据,导致用户很多页面看不到,特别是地图定位页面看不到。
    解决方案是:
    给APP审核人员提供的登录帐号和密码,并且提供部分测试数据,防止审核人员看到白茫茫的一天,只看你满文在画饼充饥。
    4.APP审核时发现,有版本更新的功能,直接被no pass了。因为今年3月初,苹果禁止发布的APP有版本更新功能,要用萌萌达的版本更新功能。
    解决方案:
    你要关心苹果对APP发布规则和新功能的介绍了。看来你要使用你那中国式英语看下苹果的公告了。就是你需要版本更新,也不能当面让苹果审核BOSS发现啊,至少先欺骗它通过,以后再改数据库的版本号,启动版本更新也不迟。版本更新真的有需要保留,是给自己留的后门,若业务大变更可以启动。但是别当家常便饭来刷大家(强制或非强制下载新版本)。
    5.APP由于使用友盟的新浪微博没有安装,授权登录跳到空白页面,导致审核不通过。
    解决方案:
    判断是否安装新浪微博,若发现没有安装弹出没有安装新浪微博就可以了,别乱跳舞了。
    6.一个开发人员加入一个图片并且是该图片被两个目录引用,然后删除了图片,在他的电脑上安装和发布APP正常,别人下载相同的代码都报找不到图片。
    这个也可能和第2种情况类似,本机XCODE缓存了以前删除的图片,导致可以找到已经删除的图片。
    解决方案:
    让他删除图片重新正确加载,删除search path对本地路径的包含地址,统一使用相对路径。上传工程文件就可以解决。
    一下是具体被拒绝的实际例子。
    1.This app attempts to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSBluetoothPeripheralUsageDescription key with a string value explaining to the user how the app uses this data.
    This app attempts to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.
    Once these issues have been corrected, you can then redeliver the corrected binary.
    因为你的应用app使用了麦克风,但是Info.plist里没有配置,它是会引起 crash的。至于的蓝牙的描述,估计是蓝牙和它属于一类问题,除非你是用了蓝牙没有配置,否者路过。
    2.Your app has the UIFileSharingEnabled key set to true in the Info.plist, but the Documents folder includes files and folders not intended for file sharing.

    Next Steps

    Please move all files that are not intended for user access via the file sharing feature to another part of your app’s sandbox. When file sharing is enabled, the entire Documents folder is used for file sharing.

    If your app does not require the file sharing feature, please set the UIFileSharingEnabled key in the Info.plist to false.
    这个是你使用了app的文档共享功能,发布描述时没有说明为何使用它。当然绝对大多数的应用不需要文档共享,直接删除那条属性(Application supports iTunes file sharing)或设置为NO.当然你若需要这个功能,在发布描述里说明你的app为何需要文档共享,有什么用处。我们的应用,在测试版本需要这个文档共享功能来到处日志文件。正式版本是不打日志的,所以不需要这个文档共享功能。
    3.We discovered one or more bugs in your app when reviewed on iPad and iPhone running iOS 9.3.3 on Wi-Fi connected to an IPv6 network.

    Specifically, we encountered an network error message upon launch.

    We’ve attached screenshot(s) for your reference.

    Next Steps

    Please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify the issue(s), then revise and resubmit your app for review.

    If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.

    For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue(s). For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue(s).

    Resources

    For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking
    这个是你的app是否支持http请求,它默认是只支持https请求。这个需要你在Info.plist文件中增加App Transport Security Settings和子属性Allow Arbitrary Loads为YES
    这里写图片描述
    4.你的应用开启了远程推送,你的证书不支持远程推送,实际上你也没有实际使用远程推送。以前苹果对这个配置检查不严格,现在检查严格了。可能你没有配置定位功能,但是它顺带也报你配置了定位功能。因为定位功能配置和远程推送配置是一类问题,可能它也顺带说了。不要被它误解了。解决方案:若你没有使用远程推送,关闭它的能力就可以了,一了百了。
    We identified one or more issues with a recent delivery for your app, “****”. Please correct the following issues, then upload again.

    Missing Info.plist key - This app attempts to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSLocationWhenInUseUsageDescription key with a string value explaining to the user how the app uses this data.

    Though you are not required to fix the following issues, we wanted to make you aware of them:

    Missing Push Notification Entitlement - Your app appears to register with the Apple Push Notification service, but the app signature’s entitlements do not include the “aps-environment” entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the “aps-environment” entitlement. Xcode 8 does not automatically copy the aps-environment entitlement from provisioning profiles at build time. This behavior is intentional. To use this entitlement, either enable Push Notifications in the project editor’s Capabilities pane, or manually add the entitlement to your entitlements file. For more information, see https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194-CH6-SW1.
    在这里插入图片描述

    5.app图标缺失。完善图标就可以了。
    We have discovered one or more issues with your recent delivery for “***”. To process your delivery, the following issues must be corrected:

    Invalid Image Path - No image found at the path referenced under key “CFBundleIcons”: AppIcon20x20

    Once these issues have been corrected, you can then redeliver the corrected binary.

    这里写图片描述
    这里写图片描述
    6.iOS提交审核:您的 App 正在使用广告标识符 (IDFA)
    您的 App 正在使用广告标识符 (IDFA)。您必须先提供关于 IDFA 的使用信息或将其从 App 中移除,然后再上传您的二进制文件。
    解决方案:检查是否使用IDFA
    检查我们项目中是否使用广告标示符,其实就是查看我们framework中是否有个叫做AdSupport.framework的框架;
    如果检查framework没有,可能是我们接入的第三方里面有,用以下方法检查第三方中是否包含有IDFA版本;
    (1)打开终端cd到要检查的文件的目录;
    (2)执行命令:grep -r advertisingIdentifier .(注意别少了点);

    jiaguoshangdeMacBook-Air:ArtEnjoymentRunLu-2.4.0的副本 jiaguoshang$ grep -r advertisingIdentifier .
    ./Pods/YXFDCategories/YXFDCategories/Classes/UIDevice+YiXiang.m:            idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    Binary file ./Pods/UMengUShare/UShareSDK/SocialLibraries/Twitter/TwitterCore.framework/TwitterCore matches
    Binary file ./Pods/UMengUShare/UShareSDK/SocialLibraries/UniqueId/libSocialUniqueId.a matches
    Binary file ./Pods/UMengUShare/UShareSDK/SocialLibraries/Facebook/FBSDKCoreKit.framework/FBSDKCoreKit matches
    Binary file ./Pods/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/libWeiboSDK.a matches
    

    可以发现罪魁祸首是私有库YXFDCategories。把私有库中相关代码删除后,再次提交版本就不提示使用广告描述符了。真奇怪UMengUShare开源第三方库也检测出来使用了,但是苹果审核程序直接无视了。
    7.只支持微信等第三方软件授权登录,并且不支持网页授权登录或用户名密码登录。
    Guideline 4.2.3 - Design - Minimum Functionality
    We were required to install the WeChat app before we could log in via WeChat. Users should be able to log in with WeChat and access their accounts without having to install any additional apps.
    Next Steps
    If you would like to offer authentication through WeChat, please use a mechanism that allows users to log in with WeChat from within your app without first having to install an additional app.
    We recommend implementing the Safari View Controller API to display web content within your app. The Safari View Controller allows the display of a URL and inspection of the certificate from an embedded browser in an app so that customers can verify the webpage URL and SSL certificate to confirm they are entering their sign in credentials into a legitimate page.
    可以看到流行的软件当发现本地没有装微信时,都不显示微信登录;QQ当没有安装,大都也不显示QQ登录图标,个别的显示QQ图标并且采用网页登录QQ授权,不过他们都有用户名密码登录功能。所以它的常规解决方案时当发现本地没有安装第三方授权软件直接不显示它的按钮(按钮灰化不使能或弹出提示苹果照样给你驳回),就时没有完整的用户名/密码登录功能,至少给他在审核期间可以只有审核人员知道的登录账户和密码。可以当发现服务器返回版本低于app版本时显示临时用户名密码登录,发布时选择手动发布。当审核通过时(苹果会发邮件一般造成7点左右审核过的可能比较多),修改服务器返回的最新版本号并设置不更新,并发布版本,等在所在区域的苹果商店看到最新的app时在,再设置为非强制更新,等一天后等全世界的区域都上架后若是需要强制更新的再设置为强制更新(世界各个苹果市场上架时间并不一致,有不同的负责任,是苹果审核人员手动上架的,一般2小时上架,也有时6个小时上架的)。当然这个你的用户密码功能没有开发完的情况。若你的这个功能完全,直接不显示第三方授权登录的按钮,保留用户名密码按钮就可以。
    8.自己的截图不能反映自己App的主要功能(We noticed that your screenshots do not sufficiently reflect your app in use.),重新换了设计师做的UI图(现在app流行的截图不是直接用手机对app界面进行手机截屏,而是UI设计师设计一个图把需要的数据放到截图上,app页面只是截图的一部分,其它的部分放上说明信息。任何事情都有风险的,按钮和标签位置要相对正确,有不大的出入,就被苹果KO了。这就是新玩法的阵痛,所以我们发布新app时都是先试水一两次,可以审核时的功能不是很全,防止审核不过影响市场推广)就可以了。

    Guideline 2.3.3 - Performance - Accurate Metadata
    We noticed that your screenshots do not sufficiently reflect your app in use.
    Specifically, your 5.5-inch iPhone screenshots do not display the app in the correct device frame.
    Next Steps
    To resolve this issue, please revise your screenshots to ensure that they accurately reflect the app in use on the supported devices. For iPhone, you need a set of 5.5-inch display screenshots and for iPad, you need a set for 12.9-inch display. This set will be scaled appropriately down to other device sizes when viewed on the App Store in each territory.
    Note that 5.8-inch display assets for iPhone X are optional and don't scale down to other devices sizes. Screenshots that include iPhone X layout features like rounded corners or sensor housing should only be used for the 5.8-inch display.
    Resources
    For resources on creating great screenshots for the App Store, you may want to review the App Store Product Page information available on the Apple developer portal.
    Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Learn how to use Media Manager to add custom screenshots for each display size and localization.
    Please see attached screenshots for details.
    Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.
    

    9.iPhone 8 plus的截图有iphone x的显示特性(Specifically, your 5.5-inch iPhone screenshots include iPhone X display features.),重新换了设计师做的UI图就可以了。

    Guideline 2.3.3 - Performance - Accurate Metadata
    We noticed that your screenshots do not sufficiently reflect your app in use.
    Specifically, your 5.5-inch iPhone screenshots include iPhone X display features.
    Next Steps
    To resolve this issue, please revise your screenshots to ensure that they accurately reflect the app in use on the supported devices. For iPhone, you need a set of 5.5-inch display screenshots and for iPad, you need a set for 12.9-inch display. This set will be scaled appropriately down to other device sizes when viewed on the App Store in each territory.
    Note that 5.8-inch display assets for iPhone X are optional and don't scale down to other devices sizes. Screenshots that include iPhone X layout features like rounded corners or sensor housing should only be used for the 5.8-inch display.
    Resources
    For resources on creating great screenshots for the App Store, you may want to review the App Store Product Page information available on the Apple developer portal.
    Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Learn how to use Media Manager to add custom screenshots for each display size and localization.
    Please see attached screenshots for details.
    Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.
    

    这里写图片描述

    以后遇到app被拒绝,我会把苹果拒绝的情况都贴出来。

    展开全文
  • 接收通知与⾃定义消息,并向开发者App 传递相关信息 主要特点 客户端维持连接占⽤资源少、耗电低 SDK丰富的接⼝,可定制通知栏提⽰样式 服务器⼤容量、稳定 jpush-sdk_v2.x.y.zip 集成压缩包内容 AndroidManifest_...
    主要功能
    保持与服务器的⻓连接,以便消息能够即时推送到达客户端
    接收通知与⾃定义消息,并向开发者App传递相关信息
    主要特点
    客户端维持连接占⽤资源少、耗电低
    SDK丰富的接⼝,可定制通知栏提⽰样式
    服务器⼤容量、稳定
    jpush-sdk_v2.x.y.zip 集成压缩包内容
    AndroidManifest_AS_Example.xml / AndroidManifest_Eclipse_Example.xml
    客户端嵌⼊SDK参考的配置⽂件。分别对应AndroidStudioEclipse
    libs/jpush-sdk-release2.x.y.jar
    SDK Java 开发包
    libs/armeabi(或armeabi-v7a/arm64-v8a/libjpush2xy.so
    SDK native 开发包。分别对应arm, armv7a,armv8a(64).so⽂件。
    res/
    集成SDK必须添加的资源⽂件

    example

    是个完整的Android项,通过这个演了JPush SDK的基本用法,可以来做参考。


    SDK集成步骤
    1、导⼊SDK开发包到你⾃⼰的应⽤程序项⺫
    解压缩 jpush-sdk_v2.x.y.zip 集成压缩包
    复制 libs/jpush-sdk-release2.x.y.jar 到⼯程 libs/ ⺫录下
    复制 libs/armeabi( armeabi-v7a/arm64-v8a)/so⽂件 到⼯程libs/下对应的CPU⺫录下
    AndroidStudio中使⽤,在build.gradlesourceSets.main节点下指定jniLibs的路径。
    sourceSets{
    main {
    jniLibs.srcDirs= ['libs']// <-- Set your folder here!
    }
    }
    复制 res/drawable-hdpi 中的资源⽂件到⼯程的res/drawable-hdpi/⺫录下
    复制 res/layout 中的布局⽂件到⼯程的 res/layout/ ⺫录下
    2、配置AndroidManifest.xml
    根据 SDK 压缩包⾥的 AndroidManifest.xml 样例⽂件,来配置应⽤程序项⺫的AndroidManifest.xml
    主要步骤为:
    1. 复制备注为 "Required" 的部分
    2. EclipseAndroidManifest中将备注为"您应⽤的包名"的部分,替换为当前应⽤程序的包名; AndroidStudio
    AndroidManifest中引⽤的是所在ModuleapplicationId,需在build.gradle中配置。
    3. AppKey替换为在Portal上注册该应⽤的的Key,例如(9fed5bcb7b9b87413678c407
    EclipseAndoridManifest⽰例:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="您应⽤的包名"
    android:versionCode="205"
    android:versionName="2.0.5"
    >
    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="17" />
    <!-- Required ⾃定义⽤来收发消息的相关权限 -->
    <permission
    android:name="您应⽤的包名.permission.JPUSH_MESSAGE"
    android:protectionLevel="signature" />
    <!-- Required ⼀些系统要求的权限,如访问⺴络等-->
    <uses-permission android:name="您应⽤的包名.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <!-- Optional for location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission
    android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
    <!-- Required SDK核⼼功能-->
    <activity
    android:name="cn.jpush.android.ui.PushActivity"
    android:configChanges="orientation|keyboardHidden"
    android:theme="@android:style/Theme.NoTitleBar"
    android:exported="false">
    <intent-filter>
    <action android:name="cn.jpush.android.ui.PushActivity" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="您应⽤的包名" />
    </intent-filter>
    </activity>
    <!-- Required SDK核⼼功能-->
    <service
    android:name="cn.jpush.android.service.DownloadService"
    android:enabled="true"
    android:exported="false" >
    </service>
    <!-- Required SDK 核⼼功能-->
    <!-- option since 2.0.5 可配置android:process 参数将PushService设置为独⽴进程--
    >
    <service
    android:name="cn.jpush.android.service.PushService"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
    <action android:name="cn.jpush.android.intent.REGISTER" />
    <action android:name="cn.jpush.android.intent.REPORT" />
    <action android:name="cn.jpush.android.intent.PushService" />
    <action android:name="cn.jpush.android.intent.PUSH_TIME" />
    </intent-filter>
    </service>
    <!-- Required SDK 核⼼功能 since 1.8.0 -->
    <service
    android:name="cn.jpush.android.service.DaemonService"
    android:enabled="true"
    android:exported="true">
    <intent-filter >
    <action android:name="cn.jpush.android.intent.DaemonService" />
    <category android:name="您应⽤的包名"/>
    </intent-filter>
    </service>
    <!-- Required SDK

    展开全文
  • Activity和广播/**下载APK细节1、点击升级后对话框不消失,再次点击时不能重复下载2、下载过程中退出APP,下次进入应用后要重新下载(因为可能不完整)3、下载过程中退出APP(或下载完成后退出),如果APK已经下载...

    Activity和广播
    /**
    下载APK细节
    1、点击升级后对话框不消失,再次点击时不能重复下载
    2、下载过程中退出APP,下次进入应用后要重新下载(因为可能不完整)
    3、下载过程中退出APP(或下载完成后退出),如果APK已经下载完毕,则下次进入应用后不再下载
    4、如果下载的APK被清除了,要重新下载
    5、断网后重新连接或切换网络后不受影响
     */
    public class MainActivity extends Activity {
        private TextView textView;
        private DownloadCompleteReceiver receiver = null;
        private String url = "http://113.107.216.43/imtt.dd.qq.com/16891/BD5BA98958C0FEC9D88FB65BF5534A3B.apk?mkey=581c007d0e1baac8&f=8a5d&c=0&fsname=com.bcb_2.0.2_52.apk&csr=4d5s&p=.apk";
        private String fileName;
        private AlertDialog dialog;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            textView = new TextView(this);
            setContentView(textView);
            fileName = "福利金融-" + Utiles.getVersionCode(this) + ".apk";
            textView.setText("文件名:" + fileName //
                    + "\n文件路径:" + Utiles.getApkFile(fileName).getPath() //
                    + "\n是否已下载过此版本的安装包:" + Utiles.getIsDownloaded(thisfileName)//
                    + "\n是否已下载时退出了:" + Utiles.getIsFinishedWhenDownloading(this));
            showVersionDialog();
        }
        private void showVersionDialog() {
            AlertDialog.Builder ibuilder = new AlertDialog.Builder(this);
            ibuilder.setTitle("版本更新啦!");
            ibuilder.setMessage("优化用户界面,界面更好看\n修复所有已经的bug");
            ibuilder.setNegativeButton("退出应用"new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    dialog = null;
                    finish();
                }
            });
            ibuilder.setPositiveButton("立即更新"new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    File file = Utiles.getApkFile(fileName);
                    if (Utiles.getIsDownloaded(MainActivity.thisfileName)) {//已下载完毕
                        if (file == null || !file.exists()) {
                            Utiles.clearSP(MainActivity.this);//清空保存的两个数据
                            registerReceiver();//被删了,重新下载
                        } else Utiles.installApk(MainActivity.this, file);//否则,安装
                    } else if (Utiles.getIsFinishedWhenDownloading(MainActivity.this)) {//上次在下载过程中退出了,下次进入应用时重新下载
                        registerReceiver();//重新下载
                    } else if (file != null && file.exists()) {//正在下载
                        Toast.makeText(MainActivity.this"正在下载,请稍后", Toast.LENGTH_SHORT).show();
                    } else {//没下载过
                        registerReceiver();
                    }
                }
            });
            dialog = ibuilder.create();
            dialog.setCanceledOnTouchOutside(false);
            dialog.setCancelable(false);
            dialog.show();
        }
        private void registerReceiver() {
            receiver = new DownloadCompleteReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);//下载完成的动作
            registerReceiver(receiver, intentFilter);
            Utiles.downLoadFile(MainActivity.thisurlfileName);//开始下载
        }
        class DownloadCompleteReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
                    Toast.makeText(MainActivity.this"下载完毕", Toast.LENGTH_SHORT).show();
                    textView.append("下载完毕");
                    Utiles.saveIsDownloaded(context, fileName);
                    Utiles.installApk(context, Utiles.getApkFile(fileName));
                    if (receiver != null) {
                        unregisterReceiver(receiver);
                        receiver = null;
                    }
                }
            }
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (receiver != null) {//如果receiver不为空,说明正在下载APK包,即使应用退出了,也会继续下载
                unregisterReceiver(receiver);
                Utiles.saveIsFinishedWhenDownloading(this);//如果在下载过程中退出了,下次进入应用时重新下载
            }
        }
    }

    工具
    public class Utiles {
        public static final String SP_NAME = "version";
        public static final String FILE_PATH = "/fljr/apk";
        /**返回下载的APK文件*/
        public static File getApkFile(String fileName) {
            String filePath = Environment.getExternalStorageDirectory().getPath() + FILE_PATH + File.separator + fileName;
            return new File(filePath);
        }
        /**安装指定的APK包*/
        public static void installApk(Context context, File apkFile) {
            Intent mIntent = new Intent(Intent.ACTION_VIEW);
            mIntent.setDataAndType(Uri.fromFile(apkFile)"application/vnd.android.package-archive");
            mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        }
        /**获取VersionCode*/
        public static int getVersionCode(Context context) {
            try {
                PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
                return packageInfo.versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                return 0;
            }
        }
         /**清空SP的数据*/
        public static void clearSP(Context context) {
            SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
            editor.clear();
            editor.commit();
        }
        //******************************************************************************************
        /**记录是否在下载过程中退出了,如果在下载过程中退出了,下次进入应用时重新下载*/
        public static void saveIsFinishedWhenDownloading(Context context) {
            SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
            editor.putBoolean("finish"true);
            editor.commit();
        }
        /**是否在下载过程中退出了*/
        public static boolean getIsFinishedWhenDownloading(Context context) {
            return context.getSharedPreferences(SP_NAME, 0).getBoolean("finish"false);
        }
        //******************************************************************************************
        /**记录是否已下载过指定版本的APK包*/
        public static void saveIsDownloaded(Context context, String fileName) {
            SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, 0).edit();
            editor.putBoolean(fileName, true);
            editor.commit();
        }
        /**查看是否已下载过指定版本的APK包*/
        public static boolean getIsDownloaded(Context context, String fileName) {
            return context.getSharedPreferences(SP_NAME, 0).getBoolean(fileName, false);
        }
        /**下载文件*/
        public static void downLoadFile(Context mContext, String url, String fileName) {
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url))//下载路径
                    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)//显示方式。默认,下载过程中显示,下载完成后自动消失
                    .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)//网络设置
                    .setDestinationInExternalPublicDir(FILE_PATH, fileName);//文件下载路径
            ((DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(request);
        }
    }





    转载于:https://www.cnblogs.com/baiqiantao/p/8849b21268b338f1cfd3bd955ec4aee0.html

    展开全文
  • 泰格商霸V7升级

    2015-10-07 12:29:27
    app_fix.exe -- 泰格工具软件,提供以下功能: a、终止数据库假连接 b、数据库重新安装时恢复泰格数据库 c、检查数据库并自动修复错误 d、修改操作员密码 e、更换供应商编码(只用于商业版) expire.exe -- ...
  • 到电脑中并解压缩,解压缩后的固件文件名称为 T50.bin。 2) 升级前确保电量充足,最好有2格以上电量。 3) 升级过程中不要开关、断电、重启...2)针对苹果手机,在后台杀掉乐视视频APP进程,重新启动乐视视频APP进入即可
  • nginx跳过某连接301

    2017-02-16 16:25:28
    最近项目从http升级至https后,原来app中短信的访问连接采用http请求的,现在以上线。我的nginx中判断如果是80端口请求的全部301至https的443端口,但是此时如果改的话,需要重新发布app,所以,采用办法是将这个...
  • 2019年3月1日起,我们将VirtualApp商业版代码更新方式升级为GitHub私有库方式,授权后即可加入。在授权期内可以和众多授权项目近2100多位安卓工程师一同迭代升级,反馈BUG,我们会第一时间更新解决。 2020年 10月15...
  • 该项目是通过。 您将在下面找到有关执行常见任务的信息。... 升级到React Native的新版本需要更新react-native , react和expo软件包版本,并在app.json设置正确的sdkVersion 。 有关软件包版本兼
  • Build System 改成 Legacy Build System 然后卸载 App 重新运行。 打包时遇到 i386 打包失败怎么办? cordova platform update ios PushConfig.plist 文件中的字段都是什么意思? Appkey:应用标识。 Channel:...
  • 第一步:通过安卓APP获取设备参数,推荐用NRF或者BLE调试助手。 第二步、把蓝牙适配器插入电脑USB口。 第三步、打开串口软件,选择正确的COM口点击 “连接”。 第四步、输入MAC地址和 RAWDATA数据,点击 “一键下载...
  • 刚刚升级遇到的问题,希望能够帮助到遇到相同问题的人。 1. 用xcode12连接iOS设备调试安装应用 2. 拔掉数据线 3. 从桌面图标点击进入App必闪退 后来发现是flutter的原因,目前有下面两种个解决方案: 1. 使用...
  • 不再更新 不幸的是,我摆脱了我可信赖的Mac Pro 1,1,因此该存储库将不再更新。 Mac Pro 2006 1,1 El Capitan升级 我已经在Apple Mac Pro 1,1上完成了升级,以便准备好El Capitan(OS X ... reboot (这将重新启动Mac
  • usb_bootloader.zip

    2020-04-29 21:45:33
    Bootloader在启动后1秒内,检测USB是否连接PC:如果连接PC,则进入固件升级模式,执行第3步;超时则跳转第8步,尝试执行用户APP Bootloader模拟成MSD设备,构建FAT16虚拟文件系统,U盘名为”Bootloader”,容量为100...
  • 1:问题:nordic 52832 DFU后出现无法重连的问题 ...升级完成后,硬件自动重启,蓝牙App重新连接硬件 4>这时,发现蓝牙一直无法重连 3:调试: 1>过程中尝试搜索连接,发现调用一些方法后,...
  • 问题描述 iOS 升级成 iOS14后,出现 Termius 使用 SSH 连接局域网主机无法连接,报错内容如下: Connection could not been established: No route to host 但是连接远程主机却正常。...重新打开 App,即可正常访
  • 按照教程打开USB调试 把文件夹复制到U盘,插入百度影棒2 OTG USB母口…… 打开影棒文件管理按顺序进行安装…… ...【为方便你日后升级使用建议不要卸载百度一键root,每次升级都要重新获取权限】
  • phpwind论坛移动端代码

    2018-03-13 16:24:05
    1) 关闭站点,后台管理-全局-站点设置-站点状态设置页面进行设置; 2) 请提前备份您的站点文件,网站根目录下所有文件; 3) 请提前备份您网站所有...8) 登录app管理中心,使用你的阿里云账号登录后,重新生成app即可。
  • 当你开始着手部署应用时,最简单的方式莫过于使用管理员身份重启my_app或者所有服务,使产品升级至当前版本。开始的时候一切都很好,但是最终你会发现一旦应用启动以后,在重启期间去尝试连接会得到众多HTTP 503 ...
  • 注意:数据库在App_Data文件夹中(Access) 后台登录地址/admin/admin.aspx 注意后台验证码区分大小写 VS2005版修改内容: 1.由VS2003升级为2005版。 2.删除了一些没有实现的功能。 3.修改了部分页面连接错误的问题。...
  • 我们重新定义了盒仔的机械结构,并优化了连接部分的设计,组装仅需半小时。 技术规格: 外壳尺寸:130x130x130mm 微型控制器:ATmega328 引导装载程序:Arduino Nano 通讯模块:低功耗蓝牙4.0通讯模块 蓝牙芯片: TI CC...

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

连接app重新升级