公司开发一个app,是使用摄像头的。需要知道用户点击锁屏键锁屏事件。刚开始使用的是注册通知,使用如下方法:
static int setScreenStateCb(){
uint64_t locked;
__block int token = 0;
notify_register_dispatch("com.apple.springboard.lockstate",&token,dispatch_get_main_queue(),^(int t){
});
notify_get_state(token, &locked);
NSLog(@"setScreenStateCb locked:%d",(int)locked);
return (int)locked;
}
在使用是只需 int ret = setScreenStateCb();判断ret是否大于0,
if(ret > 0) {
//锁屏
}else {
//其他。。。
}
代码中使用到的com.apple.springboard.lockstate属于达尔文通知,就是后来上架被驳回时才知道的。一般使用达尔文通知来监听锁屏的方法如下面的链接所介绍的一样:
https://www.cnblogs.com/LiuChengLi/p/5591030.html
以前这样写是没有问题的,但是,后来苹果就禁止了这样的实现手法,如果使用了,在上架的时候会直接被驳回,app状态显示“二进制文件无效”,收到的邮件提示内容:“Unsupported operation - Apps are not allowed to listen to device lock notifications.”(此处需要注意的是,苹果的回复邮件一般都有几条的,要全都看完了!我之前就是只看到提示二进制文件无效的邮件,却没有看到后面再发来的提示具体是什么问题导致不能上架的邮件,因此走了不少弯路,切记引以为戒)
当收到itunes说“二进制文件无效”的邮件时,希望确认是否是因为这个达尔文通知造成的,可以对生成的ipa文件使用grep命令,搜索一下两个字符串“com.apple.springboard.lockcomplete”、“com.apple.springboard.lockstate”、“com.apple.springboard.hasBlankedScreen”,若是没找到片,还可以对项目中用到的一些第三方sdk进行同样的搜索。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
好了,说了那么多,该说说怎么解决这个问题了。
我们需要知道是否锁屏,但是apple却又不允许我们使用达尔文通知。那么我们可以“拐个弯”,从其他的角度入手,获取当前是否是锁屏。直接饿上代码:
//定义如下方法
//说明:当用户离开通过锁定按钮而不是主页按钮时,苹果只允许你从applicationDidEnterBackground更改屏幕亮度。这种方法是当APP进入后台时, 以较小的数量改变屏幕亮度,并检查是否能够更改。如果能够更改便是锁定按钮,不能则是主页按钮。经过检测这种方法是可行的,这里讲的是监听锁屏,这个方法同样也可以监听解锁。