一般情况下,出于省电、权限、合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是“当 APP 处于后台或锁屏状态时,依旧可以监听到摇一摇,进而触发某些功能,比如:语音播报”。
在产品经理提出此需求的一瞬间,仿佛周边的空气都凝固了,我也犹如五雷轰顶,愣在原地无法动弹。不由心想:“苹果爸爸怎么可能允许开发者实现这种功能!这得多费电啊!要是所有 APP 都这么做了,那还了得!” 与此同时,之前网上疯传、远近闻名的的需求--“做一个会根据手机壳颜色而改变主题颜色的APP”,清晰地浮现在脑海中,顿时一万只xx从心中奔腾而过。此时,产品经理解释到,这是咱们好多视力障碍用户提的需求,他们经常锁屏或把 APP 退到后台,且因为视力不佳原因,导致重新找到 APP 并切到前台的操作很是麻烦,所以十分希望我们能实现这个功能。
在短暂的心理活动后,秉着“客户第一,产品”的原则,于是回复说:“这功能太少见了,我先在网上看看吧,要是有其他 APP 有类似的功能,麻烦跟我说我参考一下。”然后,就祭出了程序员利器--Google,输入“iOS 后台 摇一摇”,只搜索出来的一个思路:利用 CoreMotion 框架,监听加速计原始数据,然后在 APP 退到后台后,可以实现监听摇一摇的效果。然而,并没有完整的代码或 demo 。顿时,Talk is cheap, show me the code!这句经典台词突然地出现在脑海中!也看到有人评论说 CoreMotion 的确可以实现跟系统摇一摇类似的效果,但是退到后台或锁屏后,没办法监听到摇一摇事件。
看到这条评论时,我不禁开始怀疑此功能是否真的可以被实现。
玩归玩,闹归闹,开始 code,不开玩笑。
接下来,开始自己的探索之旅。
本文 demo 链接为 OCDailyTests/BackgroundShakeTest https://github.com/Dast1Woop/OCDailyTests.git,可自行下载,方便运行和验证。
经过一番 Google,终于找到一款 APP 有类似功能::酷狗音乐 APP,对,就是那个在 PC 端一打开就会大喊 Hello KuGou!的音乐软件对应的 APP,万万没想到,手机 APP 也是这样,一句Hello KuGou!把我吓一跳。按如下步骤,在设置里打开此功能后,后台或锁屏时,摇一摇手机,可实现切歌的效果。
既然的确有 APP 实现了此功能,那就踏踏实实地探索它可能是怎么实现的吧。
系统摇一摇回调方法:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
NSLog(@"%s", __FUNCTION__);
}
经测试,此方法只有在 APP 处于前台时,才会被回调。APP 处于后台或锁屏时,此方法不会回调。故初步判定此方法不能满足需求。
**其他方法能否实现 **
此时,还是先根据网上各路大神提供的思路进行尝试,即利用 CoreMotion 框架,监听加速计原始数据,然后在 APP 退到后台后,实现监听摇一摇的效果。
好,我们先利用 CoreMotion 框架,监听加速计原始数据,实现类似系统摇一摇回调的效果。
通过加速计监听摇一摇
因加速计回调比较频繁,因此比较占用资源,故把此功能设计为单例。
//具体实现详见 demo 中文件
#import "HMSingleton.h"
@interface MYAccelerometerTool : NSObject
HMSingleton_h(MYAccelerometerTool);
@end
@implementation MYAccelerometerTool
HMSingleton_m(MYAccelerometerTool);
@end
@property(nonatomic, strong) CMMotionManager *gMotionMnger;
- (CMMotionManager *)gMotionMnger{
if (nil == _gMotionMnger) {
CMMotionManager *lMnger = [[CMMotionManager alloc] init];
lMnger.accelerometerUpdateInterval = 0.1;
[lMnger startAccelerometerUpdates];
_gMotionMnger = lMnger;
}
return _gMotionMnger;
}
声明和实现时间戳属性,用于实现节流效果(为防止频繁回调,每次检测成功后,停止摇动 1s 后才继续响应下次摇一摇。)
@property(nonatomic, strong) NSDate *gDateLastShakeSuc;
- (NSDate *)gDateLastShakeSuc{
if (nil == _gDateLastShakeSuc) {
_gDateLastShakeSuc = [NSDate distantPast];
}
return _gDateLastShakeSuc;
}
- (BOOL)startMonitorShake{
if (NO == self.gMotionMnger.isAccelerometerAvailable) {
return NO;
}
//监听中,直接返回YES
if (self.gMotionMnger.isAccelerometerActive) {
return YES;
}
[self.gMotionMnger startAccelerometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
CMAcceleration acceleration = accelerometerData.acceleration;
//综合x、y两个方向的加速度(z方向速度无意义,用的话,走路上下抖手机时会误触发,系统摇一摇也不会被z轴加速度触发)
//当综合加速度大于2.3时,就激活效果(数据越小,用户摇动的动作就越小,越容易激活)
double accelerameter = sqrt( pow( acceleration.x , 2 ) + pow( acceleration.y , 2 ));
if (accelerameter > 2.3) {
//节流效果:距离上次摇一摇成功事件,间隔时间小于1s时,认为无效
NSDate *lCrtDate = [NSDate date];
if ([lCrtDate timeIntervalSinceDate:self.gDateLastShakeSuc] < 1) {
self.gDateLastShakeSuc = lCrtDate;
return ;
}
self.gDateLastShakeSuc = lCrtDate;
[[NSNotificationCenter defaultCenter] postNotificationName:KNTFY_SHAKE_SUCCESS object:nil];
}
}];
return YES;
}
- (void)stopMonitorShake{
[self.gMotionMnger stopAccelerometerUpdates];
self.gMotionMnger = nil;
self.gDateLastShakeSuc = nil;
}
控制器相关逻辑和代码
BOOL lRes = [[MYAccelerometerTool sharedMYAccelerometerTool] startMonitorShake];
NSLog(@"lRes:%d", lRes);
NSAssert(lRes, @"开始监听摇一摇失败");
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nmShakeSuccess:) name:KNTFY_SHAKE_SUCCESS object:nil];
//在摇一摇的同时,通过观察此方法是否有log,可以判断是否有监听到。
- (void)nmShakeSuccess:(NSNotification *)ntfy{
NSLog(@"%s", __FUNCTION__);
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
运行 demo 工程,测试可知,通过上述方法,的确可以在 APP 处于前台时,实现监听摇一摇动作的效果。可是,当把 APP 退到后台或锁屏时,nmShakeSuccess 方法不再有 log,即:APP 处于后台时,通过监听加速计的方法,默认也无法在 APP 处于后台或锁屏时实现监听效果。这也印证了上文提到的那个评论者的疑问。
可是 Hello KuGou!明明实现了后台或锁屏时摇一摇的效果啊!难道是需要额外的配置?联想 iOS 处于后台时,默认会把 APP 的服务给挂起(suspended),只有当 APP 通过某种方式(后台定位/播放音乐/蓝牙扫描等)具有后台运行权限时,才可以一直保活。可猜想,也许赋予 APP 具有后台运行的权限后,就可以实现想要的功能了。于是,开始进行验证如下。
因为工作中很多 APP 具有后台定位权限和相关功能,所以本文通过为 APP 申请后台定位权限来验证。 APP 申请后台定位权限
<key>NSLocationAlwaysUsageDescription</key>
<string>我们需要根据您的定位提供周边搜索和导航服务</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>我们需要根据您的定位提供周边搜索和导航服务</string>
增加”后台定位权限“
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
@property(nonatomic, strong) CLLocationManager *gMnger;
- (CLLocationManager *)gMnger{
if (nil == _gMnger) {
_gMnger = [[CLLocationManager alloc] init];
_gMnger.delegate = self;
_gMnger.allowsBackgroundLocationUpdates = YES;
[_gMnger requestWhenInUseAuthorization];
}
return _gMnger;
}
遵守代理协议
@interface ViewController ()<CLLocationManagerDelegate>
指定代理对象
_gMnger.delegate = self;
实现代理方法
#pragma mark - delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"%s", __FUNCTION__);
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"%s", __FUNCTION__);
}
运行 demo 工程,经测试,把 APP 退到后台或锁屏,或即退到后台又锁屏,都能够检测到摇一摇事件。
这里用 demo APP 和酷狗音乐 APP 进行测试。
同时打开这两个 APP,其中酷狗音乐 APP 打开后台摇一摇切歌的功能。
酷狗音乐 APP 开始放歌,退到后台。
demo APP 打开后,退到后台。
摇一摇,查看效果:
当摇动的力度不是很大时,demo APP 回调方法会被触发;
当摇动的力度很大时,demo APP 回调方法和酷狗 APP 切歌会同时被触发;
由此可见,如果多个 APP 同时实现了此功能时,那么后台或锁屏摇一摇时,只要满足了某个 APP 实现的加速计相关判定条件,就可以同时触发多个 APP 对应的效果。
经测试,还是不行。果然,系统摇一摇还是比较受限的,只能在前台回调。
想要实现”iOS后台锁屏监听摇一摇“功能,
首次,必须满足一个硬性条件:APP 具有某种后台运行的权限。
其次,技术实现上必须使用CoreMotion框架,通过监听加速计回调自己实现对摇一摇事件的监听判定。
最后,可通过增加时间属性,实现对摇一摇事件监听时的节流效果,防止持续摇动时,太过频繁的事件回调。
此外,多 APP 都实现此功能时,摇一摇的效果是:只要摇动力度很大,加速计数据满足 APP 实现的摇一摇判定条件,就可以同时触发多个 APP 各自对应的效果。
因此,如果不是 APP 特别需要此功能,尽量不要这样实现,毕竟,比较占用系统资源,而且太多 APP 同时实现时,可能会出现效果上的相互干扰。不过,如果合理利用此功能,却可以为特殊用户群体提供极大的便利!
通过探索,满足了视力障碍用户的迫切需求,还是蛮有成就感的!
偷偷的告诉大家,写到这里时,产品经理还没告诉我他所知道的哪个 APP 实现了这个功能,可能他太忙,给忘记了吧......
本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/hGzR9J-N6VI5qwObHChzKQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。