日期: 2021 年 3 月 25 日

Python分类求和方法

Python分类求和方法

Python分类求和方法,Excel表格数据为例。
在Excel中经常会有根据列分类求和的需求,如果数据较少,可以在Excel中通过手动筛选的方法,但是数据较多那就比较麻烦啦。
这里需要用到groupby函数,pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名等)拆分pandas对象。计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。对DataFrame的列应用各种各样的函数。应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。计算透视表或交叉表。执行分位数分析以及其他分组分析。
这里只简单举个例子,利用groupby函数在Excel表格中分类求和的简单实现。
需求分析,现有如下表格
%title插图%num

需要按照不同月份汇总value值,这里可以用groupby函数简单实现。
%title插图%num
import pandas as pd
df=pd.read_excel(‘F:\邮件张\wan.xlsx’)
df_sum = df.groupby(‘month’)[‘value’].sum()
df_sum.to_excel(‘F:\邮件张\汇总.xlsx’)
1
2
3
4
*终得到新建汇总表格如下%title插图%num

可以利用Python得到按照列分类的汇总。

Tomcat启动成功访问404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

Tomcat启动成功访问404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

项目右键->Properties->Java Build Path->Libraries->add Libraries-
%title插图%num
选择要使用的tomcat版本
%title插图%num
查看了一下Tomcat文件夹中的webapps文件夹,发现里面并没有我的项目,但是我确实是把项目部署进去了,于是我查看了一下我的Tomcat的server页 发现里面的Tomcat路径不对,是默认的eclipse里面的路径,所以导致了Tomcat的部署失败:
%title插图%num
端口号修改在:
%title插图%num
所有关于tomcat服务器的修改都要在add项目之前进行修改再重启,必要时进行clear

Navigation 保存 Fragment 状态问题被关闭了

讨论了两年的 Navigation 保存 Fragment 状态问题居然被关闭了
问题描述
大概两年前开始使用 Navigation,当时觉得把所有 Fragment 都保存在一个导航图的理念很先进,然后就用了,然后发现每次 Fragment 都会重新创建,如果从 A 页面到 B 页面,然后返回 A 页面,那么 A 页面会被重建,FragmentA – FragmentB – New FragmentA,无论用户还是开发者都是不希望页面被重建的,https://github.com/android/architecture-components-samples/issues/530#issuecomment-658360926

Workaround
于是有了这位同学的解决方法,https://github.com/android/architecture-components-samples/issues/530#issuecomment-526455102

public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args,
@Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) {

// ft.replace(mContainerId, frag);

// change to

if(mFragmentManager.getFragments().size()>0){
ft.hide(mFragmentManager.getFragments().get(mFragmentManager.getFragments().size()-1));
ft.add(mContainerId, frag);
}else {
ft.replace(mContainerId, frag);
}

}
于是就这样用了一年多,但是这个方法用起来也确实会有很多内存消耗问题,而且在非主流配置的机器上,页面跳转明显比官方的 Navigate()方法响应慢。

问题照旧
于是又翻了下这个问题的讨论情况,发现还是老样子,官方坚持说这么做会消耗大量内存,https://github.com/android/architecture-components-samples/issues/530#issuecomment-789131002 说这里是给你讨论我的 sample 代码的 issue 的,不是讨论 library 本身的??还坚持说我 Fragment 也没问题(没有任何人报告 issue ),各种保存和恢复机制都给你做好了等等等等,然后把问题关了??

请问下有用使用 Navigation 的同学吗?请说说你们的看法,谢谢!

• 2021-03-15 23:25:52 +08:00
Lin0936 1
Lin0936 12 天前
在用 navigation,用 viewmodel 保存状态,UI 重建无所谓
fragment 本身就挺垃圾?
james2013 2
james2013 12 天前
使用 Navigation 后,发现 A 界面是复杂的 fragment,返回到 A 界面重建时间耗费太长。而且 A 界面的 ViewModel 的数据又会重新更新一遍…
直接放弃使用了.
shily 3
shily 12 天前
直接弃用了,改回跳转 Activity 了。每次跳转回来时界面闪一下,不能接受。
yumerdev93 4
yumerdev93 12 天前
上面 show hide 的解决方法用了一年了,基本没问题。viewmodel 保存状态是个不错的方案,但是我不太喜欢?
ikas 5
ikas 11 天前
用 show,hide 也有很多问题,1.view 的层级问题,先 show 的 view 在下面,当你在次需要显示时,实际他是在新页面的下面,尤其做 xy 轴动画,可以明显看到.2.生命周期问题,hide 的视图,本身生命周期并没有任何改变,所以需要你配置*大生命周期,当设置为 STARTED 时会导致动画执行是在 RESUMED 之后.导致刷新数据造成动画卡顿,还会会导致 viewmodel 的监听不正常,如果设置为 CREATED,又会导致 view 重建..然后其他小问题就不说了..反正坑.官方说内存问题,就很搞笑啊,当内存不够时再销毁 fragment 不行么..就连 uwp 的 page 都支持 NavigationCacheMode(Disabled, Enabled, Required);目前我是自己实现了这样的东西,但是已经不想用了
slyang5 6
slyang5 11 天前
fragment 这个组件 简直就是 垃圾中的垃圾 ,30%的 crash 和它有关
cgpiao 7
cgpiao 11 天前 via iPhone
字节不是创建了导航库吗,可以用那个。叫 scene, 官方 navigation 我觉得是半成品,包括 fragment 。
sankemao 8
sankemao 11 天前 via iPhone
google 的 api 向来很难用,比如 paging3
lear7 9
lear7 10 天前
@ikas 我没怎么用到动画,当普通使用都会发现这个问题,所以页面统统不能设置透明的,不然会上一个页面会透出来。而且右上角的 optionmenu 也需要每个页面重新清空和增加,不然也会显示错乱。
lear7 10
lear7 10 天前
@cgpiao 好的,感谢分享,我去了解一下!

zhanlanhuizhang 11
zhanlanhuizhang 9 天前
我也有这个问题。但是仔细研究后,可以重写 FragmentNavigator 下的 navigate 方法,然后重写 NavHostFragment 下的 onCreateNavController 方法。就可以自己想怎么控制,就怎么控制,虽然还是坑。
zhanlanhuizhang 12
zhanlanhuizhang 9 天前
我这里是配合 BottomNavigationView 一起用,所以网上的方法不管用,*后需要自己研究。
ikas 13
ikas 9 天前
@zhanlanhuizhang 是重写,但是他这个问题不仅仅是 FragmentNavigator 问题,还有 Fragment 等的问题,目前基本都是重写,用 show,hide,但是 show,hide 根本不足以满足,还需要配合生命周期…..反正解决一个问题又来一个问题,然后发现越来越复杂了
ikas 14
ikas 9 天前
@lear7 只用 show,hide,应该是没法解决这个问题了.目前想参考 viewpager2 来实现,但是本质 Fragment 的复杂,还是可预见的一堆问题。

在阿里云服务器上访问 xwiki.org 被限速,这是什么原因?

如题,我在阿里云服务器上使用 xwiki 自建的 deb 仓库安装 xwiki,下载 apt 包的速度只有 8k/s,这是什么原因?如何操作才能提速?已经试过魔法上网,无法提速。

服务器为张家口地区共享实例 s6 规格,带宽峰值为 10Mbps 。

xwiki 服务器 提速 阿里2 条回复 • 2021-02-22 19:39:34 +08:00
Foxkeh 1
Foxkeh 90 天前
一般是跟软件源 sources.list 的连接问题,试试重新配个,遇到过很多次跑不满带宽。我自己购买的 ECS 实例带宽 1Mbps,软件更新*多能达到 11M/s 左右。
jingkaimori 2
jingkaimori 30 天前
限速问题已解决。把本地的梯子端口转发到服务器上,再配置 xwiki 的代理。xwiki 骨骼清奇,代理配置不同寻常,欲知具体配置方案请至[此处]( https://forum.xwiki.org/t/update-xwiki-using-a-proxy/8291/2)。端口转发挂梯子,本地执行以下命令:
“`bash
ssh.exe -i ‘你的服务器密钥’ -R 30000:127.0.0.1:50011 [email protected]
#50011 为本地代理软件的端口,30000 为服务器上的空闲端口
“`
服务器执行以下命令(对 apt 有效):
“`bash
export HTTPS_PROXY=localhost:30000
export http_proxy=http://localhost:30000
“`

如何中转欧洲高校 Anyconnect 代理?

有一个欧洲高校 Anyconnect *(IKEv2 协议) 但没有做亚洲优化,国内访问全局代理非常慢,有没有现成方案在香港 VPS 做中转呢?或者搭配 Clash 规则做分流呢?先谢过各位 xdm 了 !

zk8802 1
zk8802 58 天前 via iPhone
在中继服务器上(比如香港的 VPS )搭 Open* 服务器。
windyland 2
windyland 58 天前 via Android
碳云有 iepl 流量转发服务,应该可以满足你的需求,但是需要通过支付宝进行实名认证
当然如果不想认证的话就直接服务器上开 goproxy 然后端口转发就行了
felixcode 3
felixcode 58 天前
haproxy 做端口转发
ericFork 4
ericFork 58 天前
为什么 AnyConnect 用 IKEv2?
czwstc 5
czwstc 58 天前
建议用前置代理

效果:
路由器挂一个 SSProxy 就好了,随便买一个机场就好了。
我公司 * 都是国外的,不中转基本没法用。

理由:
不过和一般的服务器中转不一样,国外直链节点的加速建议使用前置代理的形式。
就是路由器或者网关上跑一个代理程序接管 GEOIP 国外的请求。
此时你电脑发起的都会被中转到 SS 的 Node 去请求,就起到了避免直链的路由劣化和国际带宽太小 QOS
当然你的代理*好也是走内网的,避免公网的丢包、限速、QOS 。

HowTo:
路由器上跑 SS,Clash 采用 GEOIP 或者规则加入域名或者 IP 。
或者有 Mac 可以用 ClashXPro 或者 Surge 的网关模式。
这俩是网关和透明代理加速你的 Anyconnect 。
成本比较低,只要额外一台电脑,可以刷机的路由器或者虚拟机。加上一个 iplc/iepl 走内网的 SS 节点就好了。

Anyconnect 是 * 协议,本机运行的 Clash 是代理类的协议,协议层级不一样。只能通过外部设备去加速网络层协议。

中转的话,还要看你们学校有没有做证书认证。不一定可以。
sarkdavidson 6
sarkdavidson 57 天前
感谢诸位,使用 HAProxy 做端口转发应该不行,IKEv2 走的 UDP 。

特别感谢 @czwstc 的长文回复,简单来说就是前置代理高校连接的域名嘛?: p

>”Anyconnect 是 * 协议,本机运行的 Clash 是代理类的协议,协议层级不一样。只能通过外部设备去加速网络层协议”

局域网已经有部署 LEDE 旁路由代理了!测试成本非常低 感谢指导!
czwstc 7
czwstc 57 天前 via iPhone
@sarkdavidson 代理国外 ip 就行,你学校就是国外 ip

Python风格的对象

符合Python风格的对象

Python的私有属性和受保护的属性:

如果有人编写了Dog类,这个类内部用到了mood实例属性,但是没有将其开放。

现在,你创建了Dog类的子类:Beagle。如果你在毫不知情的情况下又创建了名为mood的实例属性,那么在继承的方法中就会把Dog类的mood属性覆盖掉。

名称改写:

为了避免这个情况,如果以__mood的形式命名实例属性,Python会把属性存入实例的__dict__属性中,而且会在前面加上一个下划线和类名。

因此,对Dog类来说,__mood会变成_Dog__mood;对Beagle来说,会变成_Beagle__mood。这个特性就是名称改写。

约定俗成:

对于不喜欢使用名称改写的人,他们约定使用一个下划线前缀编写的“受保护”的属性。(如:_MyThing_blahblah)

类似于使用全大写字母表示一个常量。

__slots__类属性节省空间:

默认情况下,Python在各个实例中名为__dict__的字典里存储实例属性,字典会消耗大量内存。

继承自父类的__slots__属性没有效果。Python只会使用各个类当前类中定义的__slots__属性。

创建一个类属性__slots__,把它的值设为一个字符串构成的可迭代对象,其中各个元素表示各个实例属性。

class Vector:

__slots__ = (‘__x’,’__y’)
在类中定义了__slots__属性之后,实例不能再有__slots__中所列名称之外的其他属性。

如果类中定义了__slots__属性,而且想把实例作为弱引用的目标,要把’__weakref__’添加到__slots__中。

实例只能拥有__slots__属性,除非把”__dict__”加入到__slots__中后,会支持动态创建属性。

覆盖类属性:

类属性可用于为实例属性提供默认值。

如果为不存在的实例属性赋值,会新建实例属性。

如果想修改类属性的值,必须直接在类上修改,不能通过实例修改。

如果想修改所有实例的XX属性的默认值,可以通过 类.XX 修改

iOS App后台保活

笔者查询了相关资料后发现,iOS App可以实现后台保活。

短时间保活的方式有beginBackgroundTaskWithName;

App长时间保活的方式有:播放无声音乐、后台持续定位、后台下载资源、BGTaskScheduler等;

唤醒App的方式有:推送、VoIP等;

导读

本文分为如下几部分:

App 运行状态、及状态变化

App 后台保活方式简介

短时间App后台保活

Background Modes AVAudio,AirPlay,and Picture in Picture

Background Modes Location updates

BGTaskScheduler (iOS13.0+)

1

App 运行状态、及状态变化

不低于iOS13.0的设备端App 运行状态

%title插图%num

不低于iOS13.0设备端App 运行状态

iOS13.0+的设备,支持多场景,共有上图中的Unattached、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。

1、Unattached:多个场景的情况,如果创建的场景不是当前显示的场景,那么场景处于Unattached状态;

2、Foreground Inactive:应用启动后,显示启动图的过程中,处于Foreground Inactive状态;

3、Forground Active:应用启动后,显示出来我们设置的rootViewController之后,场景处于Forground Active;

4、Foreground Inactive:应用启动后,场景处于显示状态,数据加载完毕,且用户和App没有交互过程中,处于Forground Inactive状态;

5、Background:用户点击Home键、或者是切换App后、锁屏后,应用进入Background状态;

6、Suspended:进入Background后,应用的代码不执行后,应用进入Suspended状态;(代码是否在运行,可以在应用中写定时器,定时输出内容,从Xcode控制台,或Mac端控制台查看是否有输出内容来判断)

低于iOS13.0的设备端App 运行状态

%title插图%num

低于iOS13.0设备端App 运行状态

上图是低于iOS13.0的设备端App的运行状态,分别是Not Running、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。

Not Running:指用户没有启动App,或用户Terminate App 后,App处于的状态;其他的五种状态和不低于iOS13.0的设备端App的运行状态意义相同。

App 进入后台状态变化

笔者写了个定时器,定时输出“普通定时器进行中”,可以看到,应用进入后台后,基本上立刻,就没有内容输出了。笔者认为可以认为此时App 已经进入Suspended的状态。

%title插图%num

App 进入后台

下边笔者介绍下,尝试的App后台保活方式。

2

iOS App 后台保活方式简介

短时间App后台保活

beginBackgroundTaskWithName 和 endBackgroundTask

笔者尝试过使用相关API,测试过2款手机。

对于系统版本低于iOS13(iOS 12.3)的设备(iPhone6 Plus)后台运行时间约3分钟(175秒);

对于系统版本不低于iOS13(

iOS 13.0)的设备(iPhone6 Plus)后台运行时间约31秒;

播放无声音乐

App 进入后台后,播放无声音乐,适用于音视频类App。

笔者对逆向不了解,从iOS项目技术还债之路《一》后台下载趟坑中得知,腾讯视频、爱奇艺采用了播放无声音乐保活的方式。

后台持续定位

对于定位类App,持续定位App,可以实现App后台保活。定位类App需要后台保活,像系统的地图应用,在导航的时候切换App的时候,就需要后台保活。

后台下载资源

对于需要下载资源的App,需要后台下载资源,如我们在某App下载资源的时候,我们希望在切换App时候,或者App退出后台后,资源仍然继续下载,这样当我们打开App的时候,资源已经下载好了。

BackgroundTasks

BackgroundTasks.framework 是iOS13新增的framework,笔者认为此framework中的API可以在信息流类的App中发挥作用。

3

短时间App后台保活

系统版本低于iOS13.0的设备

系统版本低于iOS13.0的设备,在应用进入后台的时候,开始后台任务([[UIApplication sharedApplication] beginBackgroundTaskWithName:)。在应用进入前台时或后台任务快过期的回调中,终止后台任务([[UIApplication sharedApplication] endBackgroundTask:)。

示例代码如下:

– (void)applicationDidEnterBackground:(UIApplication *)application {

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)applicationWillEnterForeground:(UIApplication *)application {

[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
添加相关代码后,笔者在iOS12.4的6 Plus上测试结果如下,应用在进入后台后,大概还运行了175秒。

2019-12-29 19:06:55.647288+0800 QiAppRunInBackground[1481:409744] -[AppDelegate applicationDidEnterBackground:]:应用进入后台DidEnterBackground
2019-12-29 19:06:56.256877+0800 QiAppRunInBackground[1481:409744] 定时器运行中
….
2019-12-29 19:09:50.812460+0800 QiAppRunInBackground[1481:409744] 定时器运行中
系统版本不低于iOS13.0的设备

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
添加相关代码后,笔者在iOS13.0的6s上测试结果如下,应用在进入后台后,大概还运行了31秒。
%title插图%num

iOS13.0+ App 进入后台

Xs·H 提到过,如果持续后台播放无声音频或是使用后台持续定位的方式实现iOS App后台保活,会浪费电量,浪费CPU,所以一般情况下,使用这种短时间延长App 后台保活的方式,应该够开发者做需要的操作了。

4

Background Modes AVAudio,AirPlay,and Picture in Picture

对于音视频类App,如果需要后台保活App,在App 进入后台后,可以考虑先使用短时间保活App的方式,如果后台保活App方式快结束后,还没处理事情,那么可以考虑使用后台播放无声音乐。相关示例代码如下。

– (AVAudioPlayer *)player {

if (!_player) {
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@”SomethingJustLikeThis” withExtension:@”mp3″];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
audioPlayer.numberOfLoops = NSUIntegerMax;
_player = audioPlayer;
}
return _player;
}
[self.player prepareToPlay];
系统版本低于iOS13.0的设备

– (void)applicationDidEnterBackground:(UIApplication *)application {

NSLog(@”%s:应用进入后台DidEnterBackground”, __FUNCTION__);
self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{

if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player play];
}
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)applicationWillEnterForeground:(UIApplication *)application {

NSLog(@”%s:应用将进入前台WillEnterForeground”, __FUNCTION__);
if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player pause];
}
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
系统版本不低于iOS13.0的设备

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

NSLog(@”%s:应用已进入后台DidEnterBackground”, __FUNCTION__);

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player play];
}
NSLog(@”终止后台任务”);
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player pause];
}
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
NSLog(@”%s:应用将进入前台WillEnterForeground”, __FUNCTION__);
}
5

Background Modes Location updates

开启后台定位持续更新配置,添加了位置隐私申请后,在应用使用持续定位的情况下,可以实现后台保活App。

%title插图%num

添加后台获取位置及音频使用能力

%title插图%num
添加获取位置隐私申请

对于定位类App,如果需要后台保活App,在用户使用了定位功能后,App 进入后台后,App自动具备后台保活能力,部分示例代码如下。

self.locationManager = [CLLocationManager new];
self.locationManager.delegate = self;
[self.locationManager requestAlwaysAuthorization];
@try {
self.locationManager.allowsBackgroundLocationUpdates = YES;
} @catch (NSException *exception) {
NSLog(@”异常:%@”, exception);
} @finally {

}
[self.locationManager startUpdatingLocation];
如果遇到如下异常信息:

2019-12-29 19:57:46.481218+0800 QiAppRunInBackground[1218:141397] 异常:Invalid parameter not satisfying: !stayUp || CLClientIsBackgroundable(internal->fClient) || _CFMZEnabled()
检查:

Signing&Capablities 的 backgounrd Modes 中 Location updates是否勾选;

后台下载资源

当需要实现下载资源类的App在进入后台后,持续下载资源的需求时。我们可能需要使用后台如下示例示例代码。

创建指定标识的后台NSURLSessionConfiguration,配置好

NSURL *url = [NSURL URLWithString:@”https://images.pexels.com/photos/3225517/pexels-photo-3225517.jpeg”];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@”com.qishare.ios.wyw.backgroundDownloadTask”];
// 低于iOS13.0设备资源下载完后 可以得到通知 AppDelegate.m 文件中的 – (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler
// iOS13.0+的设备资源下载完后 直接在下载结束的代理方法中会有回调
sessionConfig.sessionSendsLaunchEvents = YES;
// 当传输大数据量数据的时候,建议将此属性设置为YES,这样系统可以安排对设备而言*佳的传输时间。例如,系统可能会延迟传输大文件,直到设备连接充电器并通过Wi-Fi连接到网络为止。此属性的默认值为NO。
sessionConfig.discretionary = YES;
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:url];
[downloadTask resume];
6

BGTaskScheduler(iOS13.0+)

如果我们的App是信息流类App,那么我们可能会使用到BGTaskScheduler.framework中的API,实现后台保活App,帮助用户较早地获取到较新信息。

笔者尝试使用BGTaskScheduler 做了一个获取到App调度的时候。更新首页按钮颜色为随机色并且记录调度时间的Demo。

项目配置

为了App 支持 BGTaskScheduler,需要在项目中配置Background fetch,及Background Processing;

需要在Info.plist文件中添加 key 为Permitted background task scheduler identifiers,Value为数组的内容。

Value的数组填写,刷新的任务标识和清理的任务标识。

注册后台任务

在应用启动后,注册后台任务。

– (void)registerBgTask {

if (@available(iOS 13.0, *)) {
BOOL registerFlag = [[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:kRefreshTaskId usingQueue:nil launchHandler:^(__kindof BGTask * _Nonnull task) {
[self handleAppRefresh:task];
}];
if (registerFlag) {
NSLog(@”注册成功”);
} else {
NSLog(@”注册失败”);
}
} else {
// Fallback on earlier versions
}

if (@available(iOS 13.0, *)) {
[[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:kCleanTaskId usingQueue:nil launchHandler:^(__kindof BGTask * _Nonnull task) {
[self handleAppRefresh:task];
}];
} else {
// Fallback on earlier versions
}
}
调度App 刷新

应用进入后台后,调度App 刷新。

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

[self scheduleAppRefresh];
}

– (void)scheduleAppRefresh {

if (@available(iOS 13.0, *)) {
BGAppRefreshTaskRequest *request = [[BGAppRefreshTaskRequest alloc] initWithIdentifier:kRefreshTaskId];
// *早15分钟后启动后台任务请求
request.earliestBeginDate = [NSDate dateWithTimeIntervalSinceNow:15.0 * 60];
NSError *error = nil;
[[BGTaskScheduler sharedScheduler] submitTaskRequest:request error:&error];
if (error) {
NSLog(@”错误信息:%@”, error);
}

} else {
// Fallback on earlier versions
}
}
得到后台任务调度的时候,调用App刷新的方法,笔者在这个方法中做了发送更新首页按钮颜色的通知,并且记录了当前更新时间的记录。

– (void)handleAppRefresh:(BGAppRefreshTask *)appRefreshTask API_AVAILABLE(ios(13.0)){

[self scheduleAppRefresh];

NSLog(@”App刷新====================================================================”);
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = 1;

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

[[NSNotificationCenter defaultCenter] postNotificationName:AppViewControllerRefreshNotificationName object:nil];

NSLog(@”操作”);
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@”yyyy-MM-dd HH:mm”];
NSString *timeString = [dateFormatter stringFromDate:date];

NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@”QiLog.txt”];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [timeString dataUsingEncoding:NSUTF8StringEncoding];
[[NSFileManager defaultManager] createFileAtPath:filePath contents:data attributes:nil];
} else {
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
NSString *originalContent = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *content = [originalContent stringByAppendingString:[NSString stringWithFormat:@”\n时间:%@\n”, timeString]];
data = [content dataUsingEncoding:NSUTF8StringEncoding];
[data writeToFile:filePath atomically:YES];
}
}];

appRefreshTask.expirationHandler = ^{
[queue cancelAllOperations];
};
[queue addOperation:operation];

__weak NSBlockOperation *weakOperation = operation;
operation.completionBlock = ^{
[appRefreshTask setTaskCompletedWithSuccess:!weakOperation.isCancelled];
};
}
经过测试,发现App 在退到后台,没有手动Terminate App的情况下。苹果有调用过App调度任务的方法。现象上来看就是隔一段时间,我们再打开App 的时候可以发现,首页的按钮颜色改变了,相应的日志中追加了,调起相关方法的时间记录。

手动触发后台任务调度

Xcode运行我们的App

-> App 退到后台

-> 打开App 进入前台

-> 点击下图中蓝框中的Pause program execution,输入如下内容

后台模拟调起App

e -l objc — (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier: @”com.qishare.ios.wyw.background.refresh”]
-> 再次点击Continue program execution,就可以模拟后台启动任务,调用我们的App。

%title插图%num

Continue program execution

查看日志记录小提示

之前记得听沐灵洛提过怎么便于查看日志,正好我这里也用到了。便于我们可以直接在File App中查看写入到我们App的Documents中的文件,可以在Info.plist文件中添加key为LSSupportsOpeningDocumentsInPlace ,value为YES的键值对App 接入 iOS 11 的 Files App。

经过我们操作后,就可以打开File App -> 浏览 -> 我的iPhone -> 查看选择我们的App -> 查看我们的日志记录文件。

定义类(class)的语法

python定义类(class)的语法,

定义类(class)的语法

class Iplaypython:               #类的名字,首字母,有一个不可文的规定,*好是大写,这样需要在代码中识别区分每个类。
>>>     def fname(self, name):   #第二行开始是类的方法,大家看到了,和函数非常相似,但是与普通函数不同的是,它的内部有一个“self”,参数,它的作用是对于对象自身的引用。
>>>           self.name = name

玩蛇网是一个学习python比较好的网站

http://www.iplaypy.com/jinjie/

2)_init_函数(方法)

首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。

类的实例(类的调用)、类的方法、构造函数、类的命名空间和作用域以及类的继承概念

哪家的 UI 和应用商店能完美支持 Android App Bundle ?

国内有哪家的 UI 和应用商店能完美支持 Android App Bundle 的?
看了下 Google Play 要求 2021.8 后的新 APP 必须使用 App Bundle 分发。然后查了下我手头的小米 9 ( MIUI12.5 开发版),基本上大部分 Play 下载的应用都是用 bundle 的。不过小米应用商店下载的还是传统的多 abi 多 dpi 的 apk 。虽然用 play 安装的支持没有问题,但自带的系统备份却只支持备份 base apk,导致用 bundle 的 app 在还原后直接打不开,得卸载重装。

像 B 站客户端就离谱,play 上的国际版有纯 arm64 版,国内版不管在商店下还是官网下,都是 armv7+x86 版,没有 arm64 版。

按理说这技术能省不少空间的,也方便差分更新,也不是 GMS 专享的技术,但感觉国内无论是手机厂商还是应用厂商都不怎么搭理这个技术,这是啥原因?
17 条回复 • 2021-03-23 22:49:08 +08:00
minami 1
minami 3 天前
t/620974
minami 2
minami 3 天前
@minami #1 爱奇艺搞了个“山寨”版的,从宣传里可以看出,App Bundle 需要依托 GMS,所以国内肯定不搭理的
janus77 3
janus77 3 天前
需要应用市场做适配,aab 其实是不能直接安装的,当你在应用市场点击下载的时候,是应用市场根据 aab 生成相应的 apk 再提供给设备安装的
janus77 4
janus77 3 天前
huawei 应用市场好像是支持 aab,不过没看到实际例子
systemcall 5
systemcall 3 天前
国内这几年都在弄应用内的增量更新和 App 热更之类的吧
loginbygoogle 6
loginbygoogle 3 天前
格局不同
FucUrFrd 7
FucUrFrd 3 天前 via Android
成龙说的,中国的 app 会爆炸
yikuo 8
yikuo 3 天前 via Android ❤️ 1
华为商店支持
jim9606 9
jim9606 3 天前
@minami
Qjigsaw 算是给开发者提供的解决方案。而且看 Google 的介绍 App Bundle 并不是只能由 GMS 支持,Split apks 是 Android framework 就有的功能,也就是说手机内置商店要实现这个功能并不需要依赖 GMS,像 Apkpure 和 SAI 都能在国产 UI 上支持这种安装。

作为证据,我用的 MIUI 安装 Split apk 虽然比较麻烦,需要关掉 MIUI 优化或者用 Shizuku,但还是能装上的。虽然我希望 AOSP 可以直接支持 App Bundle,但以 google 的态度看是没戏了。

@systemcall @janus77
我并不是说国内厂商完全不 care 模块化这事,只是国内我能搞到的 apk 模块化顶多是区分 abi 的 multiapk,而 app bundle 是可以做到区分 abi 、语言、dpi 、feature 的,例如我的小米 9 常见组合是 base+zh+arm64_v8a+xxhdpi 。

具体到我下的 b 站客户端,armv7+x86 这种肯定不是 aab 生成出来的,所以我认为小米商店是完全没支持这个的。
jim9606 10
jim9606 3 天前
另外关于原生库还有一点我不满意的就是国产 app 普遍压缩原生库,安装的时候需要解压这些库占据额外的存储空间,例如微信就因为这点导致安装后体积膨胀了一半。而 App Bundle 拆分的原生库包是不压缩的,所以就不用占额外的空间。

感觉那么多搞 APK 体积优化的压根就不关心安装后体积的问题。

minami 11
minami 3 天前
@jim9606 #8 那就是说只要商店支持就可以了。我去 OVHM 四家的开放平台文档搜了下,只有菊厂的 AppGallery 提到了“App Bundle 应用上架操作指导”,其他的都没有相关文档
hanqian 12
hanqian 3 天前 via Android
我就想吐槽国内这些 UI,OVM 三家都魔改了 package installer,不支持 split apks ( MIUI 要关闭 MIUI 优化),倒是 EMUI 没啥问题,真是吃饱了撑的
1041412569 13
1041412569 3 天前 via Android ❤️ 1
@bilibili_apk 这个 tg 频道有 arm64 版哔哩哔哩客户端分享。
winterx 14
winterx 3 天前
楼主能说一下,play 上的国产 app 有 AAB 吗?这个好像感知不出来
比如阿里系的支付宝跟淘宝
mxalbert1996 15
mxalbert1996 3 天前 via Android
@winterx 淘宝是 AAB,支付宝不是。
jim9606 16
jim9606 3 天前
@winterx 这个需要用软件查,例如 SAI 或者 Native Libs Monitor 。这功能不算什么用户感知明显的功能,主要是节省存储空间。
我用到的使用 AAB 的国产 app 有淘宝和小米运动。
jim9606 17
jim9606 1 天前
@minami @yikuo
目前看 App Bundle 的坑是必须要将 apk signkey 交给商店,Google Play 和华为 AppGallery 都要这样,估计是为了自动生成 multiapk 供低于 Android5.0 的设备用。也就是说商店有可能恶意冒充你签名发布新版包。

@hanqian AOSP 的 Package Installer 本身就不支持 split apks,魔改的是别的东西。

Android 这边还有比较好的本地视频播放器吗?

Android 这边还有比较好的本地视频播放器吗?

小米自带的, 没有 dts 解码器, 某些视频没声音.

MX player, 被国产公司收购后挺垃圾的, 而且识别不到 otg 的 nvme 硬盘

vlc player, 能识别 otg 的 nvme 硬盘上的视频, 但是无法加载 otg 上的外挂字幕
42 条回复 • 2021-03-24 14:19:00 +08:00
tetora 1
tetora 6 天前 via Android
找个能识别的文件管理器,用 mx 打开视频文件,这样可行不?
volks 2
volks 6 天前
mpv
blueboyggh 3
blueboyggh 6 天前
试试 oplayer ?
myqy 4
myqy 6 天前 via Android
nplayer
systemcall 5
systemcall 6 天前
试试 kodi,有个皮肤是为触摸屏优化过的
harwck 6
harwck 6 天前 via Android
MX Player Pro, VLC 等
Cielsky 7
Cielsky 6 天前
Reex
xiaoliu926 8
xiaoliu926 6 天前 ❤️ 1
VLC
yyyb 9
yyyb 6 天前
mxplayer 被国产了?今天刚知道
Huelse 10
Huelse 6 天前
我用的是这里的 MX Player,不知道有没有问题 http://xiaozhon.lanzoui.com/b01nr6usb

tanyongle0633 11
tanyongle0633 6 天前 via Android
MX 播放器是被印度某公司收购的
wee911 12
wee911 6 天前
安卓的场景,估计也不会看特别大的文件,其实什么都行, 没差
TokyoIncidents 13
TokyoIncidents 6 天前 via Android
kmplayer ?
a566 14
a566 5 天前
kp 应该是*好用的一个
sleepm 15
sleepm 5 天前 via Android
nplayer 可以在设置里加载 libffmpeg
vlc 挺好使的
xratzh 16
xratzh 5 天前
kmplayer pro 在用,还行
yinzhili 17
yinzhili 5 天前
@wee911 电视也是安卓系统,你没有电视机?
hscui 18
hscui 5 天前
nplayer +1 ;安卓和苹果上都用,开本地和 NAS 上视频均很棒。
TimhLiu 19
TimhLiu 5 天前 via Android
Reex
HangoX 20
HangoX 5 天前
觉得楼主思路不对,android 上只要找个可以打开 otg 文件夹的文件管理器用 mxplayer 播放即可。
在播放器上打开 otg 硬盘是 ios 的思路
Misakas 21
Misakas 5 天前
Xplayer
KarmaWu 22
KarmaWu 5 天前
MX Player
wee911 23
wee911 5 天前
@yinzhili 那就*望了, 电视机上没一个播放器好用的,不如用 n1 刷 coreelec
7emes 24
7emes 5 天前
bs player
PythonYXY 25
PythonYXY 5 天前
ios 上用的是 nplayer,不知道安卓上有没有
Vegetables 26
Vegetables 5 天前
我现在就 vlc 凑合用吧
syuraking 27
syuraking 5 天前
nplayer 好用
hkllzh 28
hkllzh 5 天前
XPlayer 万能播放器。
本地的、Nas 上的都可以。
blueboyggh 29
blueboyggh 5 天前 via Android
@syuraking nplayer 已经好久不更新了
MaverickLee 30
MaverickLee 5 天前
VLC
feitxue 31
feitxue 4 天前
qq 影音算不算?
feitxue 32
feitxue 4 天前
算了.收回 qq 影音的推荐,虽然 pc 版还不错…安卓版好久没更新了…
fox0001 33
fox0001 4 天前 via Android
能不能识别硬盘,不是播放器的锅吧?不过好像有播放器不能读取外置存储设备。

VLC 无法加载外挂字幕是什么问题?不能读取字幕文件,还是加载出错?
tubowen 34
tubowen 4 天前 via Android
VLC 挺好用的啊,还能播放局域网的 samba 上面的视频
alfawei 35
alfawei 3 天前 via iPhone
nplayer
volks 36
volks 3 天前 via Android
看到楼上推荐的 reex 去试了一下,感觉很好。基于 libmpv,操控和界面做了适配,而且性能似乎比官方 Android 版还好,进度跳转无迟滞。
Awes0me 37
Awes0me 3 天前
@fox0001 #33 不能读取字幕文件
pk000 38
pk000 3 天前 via Android
Reex 官网是什么?
augustheart 39
augustheart 3 天前 via Android
mx 应该是印度的
Awes0me 40
Awes0me 3 天前
@HangoX #20

理论上你这样说是对的, 但实际上现在字幕和视频文件都是分开的, 播放器本身不识别 otg 的话, 加载不了字幕
basaka 41
basaka 2 天前
不是啥特殊格式的话 QQ 影音还不错,PS:不像南山必胜客做的
junyee 42
junyee 23 小时 53 分钟前
请教小伙伴们现在流行的是什么播放器.

从安卓 2.X 开始用的 MXPlayer,出于习惯就一直用,

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速