如何黑掉别人的手机相册的照片都黑了

iOS开源加密相册Agony的实现(一)
虽然目前市面上有一些不错的相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。
本文主要介绍加密相册的登录验证与注册模块的实现。注册时只需要密码,每个密码对应一个独立的存储空间,登录时通过Touch ID或密码验证。如果有多套密码,Touch ID会被绑定到一个主密码上(可更改)。
账户数据存储设计
账户类设计
由于加密相册只用于本地,当前设计还未考虑密码找回,因此账户只需要密码这一字段即可,为了统计当前已有账户数量,再使用一个id字段,账户类SGAccount设计如下。
@interface SGAccount : NSObject
@property (nonatomic, assign) NSInteger accountId;
@property (nonatomic, copy) NSString *
为了进行归档存储,需要实现NSCoding的相关方法,如下。
#import &SGAccount.h&
NSString * const kSGAccountId = @&kSGAccountId&;
NSString * const kSGAccountPwd = @&kSGAccountPwd&;
@implementation SGAccount
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInteger:self.accountId forKey:kSGAccountId];
[encoder encodeObject:self.password forKey:kSGAccountPwd];
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.accountId = [decoder decodeIntegerForKey:kSGAccountId];
self.password = [decoder decodeObjectForKey:kSGAccountPwd];
+ (BOOL)supportsSecureCoding {
return YES;
账户集合类设计
对于多个账户,使用一个账户集合类来管理,账户集合类管理所有的账户,由于登录验证时需要查询密码对应的账户是否存在,为了高效查找,应该使用以密码为key的Map,也就是NSDictionary来存储。
除此之外,还需要记录Touch ID对应的密码,综上所述,设计如下。
@interface SGAccountSet : NSObject
@property (nonatomic, strong) NSMutableDictionary *accountM
@property (nonatomic, copy) NSString *touchIDP
同理这些属性也需要在NSCoding的相关方法里处理,类的实现如下。
#import &SGAccountSet.h&
NSString * const kSGAccountSetAccountMap = @&kSGAccountSetAccountMap&;
NSString * const kSGAccountSetTouchIDPassword = @&kSGAccountSetTouchIDPassword&;
@implementation SGAccountSet
+ (BOOL)supportsSecureCoding {
return YES;
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.accountMap = [decoder decodeObjectForKey:kSGAccountSetAccountMap];
self.touchIDPassword = [decoder decodeObjectForKey:kSGAccountSetTouchIDPassword];
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.accountMap forKey:kSGAccountSetAccountMap];
[encoder encodeObject:self.touchIDPassword forKey:kSGAccountSetTouchIDPassword];
- (NSMutableDictionary *)accountMap {
if (_accountMap == nil) {
_accountMap = @{}.mutableC
return _accountM
对于accountMap的懒加载,可以保证在没有账户数据时拿到的字典不为空。
账户管理类的设计
公有接口设计
账户管理类对外提供的接口主要是注册与验证,为了方便,作为单例使用。
注册时只需提供密码即可,而验证包括两种情况,其一是通过密码验证,第二是通过Touch ID验证,当验证成功时直接返回账户类。
除此之外,账户管理类还有一个属性currentAccount记录当前验证成功的账户,以便后续使用,具体设计如下。
@interface SGAccountManager : NSObject
+ (instancetype)sharedM
- (void)registerAccountWithPassword:(NSString *)password errorMessage:(NSString * __autoreleasing *)errorM
- (SGAccount *)getAccountByPwd:(NSString *)
- (SGAccount *)getTouchIDA
用于AppDelegate获取窗口的根控制器
没有注册过账户则进入注册页面
注册过用户则进入登录验证页面
- (UIViewController *)getRootViewC
@property (nonatomic, strong) SGAccount *currentA
私有接口设计
私有接口用于管理类内部的逻辑实现,其中accountSet用于存储所有用户数据,accountPath用于存储账户数据保存和加载的路径。
@interface SGAccountManager ()
@property (nonatomic, strong) SGAccountSet *accountS
@property (nonatomic, copy) NSString *accountP
账户集合accountSet的懒加载
账户集合类的初始化包括两个步骤,首先从硬盘加载数据,如果硬盘上没有数据,则初始化一个。之所以分解为两个方法,是因为从硬盘加载数据的方法loadAccountSet会被在其他地方调用,实现如下。
- (SGAccountSet *)accountSet {
if (_accountSet == nil) {
[self loadAccountSet];
return _accountS
- (void)loadAccountSet {
SGAccountSet *set = [NSKeyedUnarchiver unarchiveObjectWithFile:self.accountPath];
if (!set) {
set = [SGAccountSet new];
_accountSet =
账户存取路径accountPath的懒加载
账户数据的存储路径会在加载和写入账户集合类数据时使用,实现如下。
- (NSString *)accountPath {
if (_accountPath == nil) {
_accountPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@&account.agony&];
return _accountP
注册的实现
注册时传入密码,密码经过加密后,先判断账户集合中是否已经存在此密码,以防止密码重复,这是因为密码与存储空间一一对应,因此密码不能重复。如果密码重复,则通过传入的字符串指针回传。
对于第一次注册的密码,将会被绑定到Touch ID上,以后使用Touch ID验证时则相当于输入此密码,注册方法的实现如下。
- (void)registerAccountWithPassword:(NSString *)password errorMessage:(NSString * __autoreleasing *)errorMessage {
NSAssert(password != nil, @&password cannot be nil&);
// 对密码进行MD5+盐的加密处理
password = [self encryptString:password];
SGAccount *account = self.accountSet.accountMap[password];
// 如果根据要注册的密码能取到账户,则说明密码重复,回传错误并返回
if (account != nil) {
*errorMessage = @&Account Already Exists&;
account = [SGAccount new];
// 生成账户id
NSInteger accountid = self.accountSet.accountMap.allKeys.count + 1;
account.accountId =
account.password =
// 存入到集合中
self.accountSet.accountMap[password] =
if (accountid == 1) {
// 如果是第一次注册,则将其绑定到Touch ID验证对应的密码上
self.accountSet.touchIDPassword =
// 将内存数据同步到硬盘
[self saveAccountSet];
加密方法的实现如下。
- (NSString *)encryptString:(NSString *)string {
return [[[[NSString stringWithFormat:@&allowsad1&,string] MD5] MD5] MD5];
MD5方法通过分类的形式添加到NSString上,实现如下。
#import &NSString+MD5.h&
@implementation NSString (MD5)
- (NSString *)MD5 {
const char *cStr = [self UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, (CC_LONG)strlen(cStr), digest);
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i & CC_MD5_DIGEST_LENGTH; i++) {
[result appendFormat:@&%02x&,digest[i]];
将数据写入到硬盘的方法实现如下。
- (void)saveAccountSet {
[NSKeyedArchiver archiveRootObject:self.accountSet toFile:self.accountPath];
登录验证的实现
通过密码验证的方式,先将密码加密,再与集合中的密码比对,找到匹配的则验证成功,实现如下。
- (SGAccount *)getAccountByPwd:(NSString *)pwd {
pwd = [self encryptString:pwd];
return self.accountSet.accountMap[pwd];
通过Touch ID验证的方式,需要在Touch ID验证成功后调用,使用Touch ID对应的密码进行验证,实现如下。
- (SGAccount *)getTouchIDAccount {
NSString *pwd = self.accountSet.touchIDP
return self.accountSet.accountMap[pwd];
窗口根控制器选择的实现
如果已经有了账户,则返回导航控制器包裹的验证控制器SGWelcomeViewController,如果没有注册过账户,则先初始化一个导航控制器包裹的SGWelcomeViewController,并且向视图栈中push一个注册控制器SGRegisterViewController,之所以这么做,是为了保证注册完成后能够返回到验证控制器,并与从验证页面进入的注册保持相同的逻辑,具体实现如下。
- (UIViewController *)getRootViewController {
if ([self hasAccount]) {
return [[UINavigationController alloc] initWithRootViewController:[SGWelcomeViewController new]];
SGWelcomeViewController *welcomeVc = [SGWelcomeViewController new];
SGRegisterViewController *registerVc = [SGRegisterViewController new];
UINavigationController *nav = [UINavigationController new];
nav.viewControllers = @[welcomeVc, registerVc];
本文主要介绍了与注册与登录验证有关的数据类和管理类的接口与实现过程,在后面的注册与登录验证视图设计中,只需要使用工具类即可。欢迎关注项目后续,项目的下载地址在本文的开头可以找到。正在初始化报价器用手机照图片做电子视频相册,怎么出来有黑边,是不是手机图片太小尺寸,用什么软件可以把图片尺寸调大,2个回答wduser_PSwduser_这不能调尺寸,只能放大,手机相机里可以设置。其他回答热门问答1234567891011121314151617181920查看更多21222324252627282930相关问答1个回答wduser_在360手机助手里有“一键root”工具。首先将手机连接360手机助手。点击“我的手机”——”管理预装软件“。进入之后,点击一键root。1个回答wduser_非常抱歉,三星手机官网没有提供刷机软件。由于刷机存在风险,如因自行刷机后导致的手机问题,还有可能会影响包修,因此我们不建议您自行刷机。 若手机因系统故障无法正常使用或自行刷机后导致...3个回答wduser_智能皮套比较好,能发挥这个手机的智能休眠功能。如果用普通手机壳感觉亏3个回答wduser_如需购买三星手机配件(电池、耳机、智能皮套、充电器等),您可通过如下途径购买: 1.三星网上商城:进入三星网上商城-配件中购买。 2.三星手机原装配件商城:关注“三星服务”微信公众...2个回答wduser_肯定是红米的好一点!4G手机我之前用过~联想的我爸在用!总体感觉MIUI的系统要比联想的好得多!1个回答wduser_您好!希望下面的回答能够对您有所帮助
  不同的电信版本的4G手机价格也是不同的,从1000元到几千元都有的,建议您购买品牌的电信手机,目前电信的4G手机有很多新款的,华为,酷派...1个回答wduser_您好!希望下面的回答能够对您有所帮助
  不同的电信版本的4G手机价格也是不同的,从1000元到几千元都有的,建议您购买品牌的电信手机,目前电信的4G手机有很多新款的,华为,酷派...3个回答wduser_如需购买三星手机配件(电池、耳机、智能皮套、充电器等),您可通过如下途径购买: 1.三星网上商城:进入三星网上商城-配件中购买。 2.三星手机原装配件商城:关注“三星服务”微信公众...2个回答wduser_联想不好用红米没有小米好也不怎么好用4g就是网速快看你自己喜欢哪款咯要考虑清楚4个回答wduser_华为,中国的一家极富创新性的世界500强公司。作为个人手机市场之一,华为团队致力开发,制造并销售最可靠,安全易用技术,提供优质专业的服务,帮助消费者与盟友取得成功,所以不管是国内还...经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
这几天没有打开相册,不确定是不是这次升级导致的。今天早上起来有个更新,和往常一样直接升级结果悲剧了,照片全部变黑色。而且多了很多这样的文件,像是被复制了好几遍。文件管理里面看了一下多了很多Burst文件。
Screenshot_-08-32-14-087_com.miui.gallery.png (94.05 KB, 下载次数: 0)
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
这个真的很烦,还好丢失的照片不算太多
经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
总共3079张黑色文件
经验6297 米
在线时间35 小时
版本8.6.27
机型未知设备
签到次数62
MIUI版本8.6.27
刚刚看自己的,没有问题,重启手机看看
经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
刚刚看自己的,没有问题,重启手机看看
经验442 米
在线时间1 小时
版本V9.1.3.0.NAACNEI
积分 445, 距离下一级还需 55 积分
积分 445, 距离下一级还需 55 积分
机型未知设备
签到次数45
MIUI版本V9.1.3.0.NAACNEI
我的小米5的相册也这样了,悲催,很多珍贵的照片呢。。我查了一下网,发现小米很多型号手机都出现过这个问题,但都找不到解决方法,晕。。MIUI不是很牛的吗?怎么这么久了它的工作人员还没有找到解决办法?难道这个牛是吹牛的牛
经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
我的小米5的相册也这样了,悲催,很多珍贵的照片呢。。我查了一下网,发现小米很多型号手机都出现过这个问 ...
昨天又这样了,出来五千多个黑色照片,手机内存快被弄满了。好像有人操控手机一样。照片文件名都有burst
经验676 米
在线时间11 小时
版本7.6.14
积分 711, 距离下一级还需 1289 积分
积分 711, 距离下一级还需 1289 积分
机型小米手机5
签到次数35
MIUI版本7.6.14
昨天又这样了,出来五千多个黑色照片,手机内存快被弄满了。好像有人操控手机一样。照片文件名都有burst ...
找到原因了,应该是放在裤兜或者晚上睡觉压倒手机拍照,连拍就是burst
在线时间0 小时
积分 32, 距离下一级还需 18 积分
积分 32, 距离下一级还需 18 积分
也碰到这个问题+1
在线时间0 小时
积分 22, 距离下一级还需 28 积分
积分 22, 距离下一级还需 28 积分
找到原因了,应该是放在裤兜或者晚上睡觉压倒手机拍照,连拍就是burst
不要瞎说好不好?我是看着黑照片一张张多出来的。
我刚删除完全部,当时还停留在相册app,然后当着我的面黑照片一张张出来。
MIUI 300周
MIUI 300周更新纪念勋章
已关注极客秀微信
已关注微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
Copyright (C) 2017 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号涨姿势 | 一招搞定!如何防止别人左右滑看你的手机相册?
新春红包大放送仅剩1天!最高10GB赠给你!进入南京移动公众号回复“10G ”马上开抢!
不知道你有没有遇到过这样的尴尬
有时,遇到开心的事情想要分享
兴高采烈把手机里的照片递给别人看
但ta很可能会不自觉地左右翻动
心情一下子就不好了
我没有什么见不得人的隐私
但不代表你可以随意翻看啊!
难道要和ta翻脸吗?
NO,NO,NO......
这就献上一招简单的必杀技!
iPhone中有一个不常用的功能:
让朋友无法乱翻你的手机!
(所有应用都适用!)
打开【设置】→ 【通用】→【辅助功能】
往下划,找到【引导式访问】的选项
打开【引导式访问】
第一次使用时,需要设置密码
用于确认退出时输入
温馨提醒:如果不小心把密码忘记那就麻烦啦~ 建议设置前打开touch ID,也可于退出引导式访问哦~
在【辅助功能】里找到【辅助功能快捷键】
选中【引导式访问】
找到你想要和好友share的照片
连按三次 Home 键
在出现的引导式访问页面
点击右上角的【开始】就搞定了!
于是乎,你会发现你的手机
就定格在你选择的图片上
怎么划都没反应
只要按照上面的步骤设置一次
下次把照片给别人看之前
打开照片,连按三次 Home 键
屏幕即可处于自动固定状态了
退出只需重新点击三次 Home键
输入密码即可
当然了,要是别人问
为什么划不动屏幕?
那你就说,可能手机卡了吧!
这个技能是不是非常实用?
来源:本文内容转载自网络,如有侵权,请联系小编微信:njyd025,我们会及时审核处理。
说明:本文内容转载自网络,南京移动微信对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。本条微信最下方广告由腾讯平台自动筛选展示,其内容与本公众号无关。
— 你可能也会喜欢 —
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点

我要回帖

更多关于 手机看相册视频黑 的文章

 

随机推荐