如果使用苹果X怎么下不了库乐队手机不登陆ID密码,我的数据安全吗?

真实记录apple id 被盗及找回经历
来源:爱思助手
去年10月份,网易邮箱数据库泄漏,导致大量邮箱账户被盗,其实从那时开始,apple ID盗号在那时已经大规模的发生了,只是我们谁也没有想过居然会发生在自己的头上。最近手机被锁被盗的太多,据说连苹果那边都已忙不过来了!今天小编给大家分享一个防盗和防骗的经历,毕竟防范于未然比亡羊补牢来的更好。先说下盗号者常使用盗取apple id 账号密码的手段。1、你的账号借给他人使用。2、APPLE ID邮箱并盗号(绝大多数)。&由于苹果安全验证机制的问题,在获得了同apple id的主邮箱的账号密码以后,便能修改包括apple id 在内所有的信息,包括生日,密保问题,这是极不合理的一件事。&盗号者(一般是中间商问黑客买邮箱信息)获取你的主邮箱账号密码,然后再apple 官网找回密码,这时,你的主邮箱便会收到重置密码的邮件,重置密码后你的apple id 便能登陆了。然后把你的主邮箱名改了,如我的被换成了(我的ID在apple官网查不到了)如下图。之后添加了救援邮箱,也就是之后所有重置密码以及修改身份的信息都将发送到救援邮箱中。救援邮箱添加好后联系400修改安全提示问题,400修改安全提示问题的的必须条件是登陆apple id 官网,点击左下角拿到pin码(骗子既然有apple id 账号,自然可以实现),一个受信任的苹果设备,只要用你的id登陆一下手边的设备,都能作为受信任的设备(实现),救援邮箱(刚刚被添加,实现),这样,你的安全问题也被改了。之后便是开启两步验证,但是由于刚修改过密码等安全操作,需要3天后才能开启。一旦被开启两步验证,这个账号就彻底和你说88了。废话不多说了,我将以时间为顺序,来详细说下被盗以及解锁的过程,中间会说下重点。最后会给大家一些安全建议来保护apple id,不要看着很远,很可能下个就是你。3月9日17点,在家玩电脑,手机突然跳出app store 密码不正确,apple id 密码不正确,要我输入,我以为是apple服务器又抽风了,没有理他.2分钟,手机来电铃响并弹窗。如下图,原谅我那时候哪还有空拍照,网上盗的图。再过一分钟后,我的手机被强行重启,清空并被开启了手机丢失查找模式。3月9日17点10分,登陆网易邮箱,我是126的,便看到邮箱里的勒索邮件。3月9日17点15分,我立马拨打客服电话,说明了我账号被盗并且消失的情况,确认了我联系邮箱和身份后直接转了二线。(记住自己的事件编号)这里再补充下苹果客服的基本结构和权限,不一定正确,但是是我7天至少20个电话轰炸下来的结果。一线:权限较低,几乎和用户一致,感受下来唯一的区别就是可以直接跳过生日验证来回答安全问题。别耽误时间了,直接转二线。二线:所谓账号部门,拥有中等权限,比如锁定app store,验证身份,如果身份验证通过可以直接发送找回密码邮件给您。三线:最高级,身份验证不通过将转到三线,也就是让你提交资料来解锁账号。工程部:账号解锁部门。在美国和新加坡,所有解锁都在那边处理。3月9日17点20分,说了我的ID的情况,然后他们说可以帮我追寻到,并且我在第二天,ID再次再官网上看到,当然我最关心的就是我的信用卡盗刷问题,我让客服关闭了我的icloud和app store 所有的操作权限,哪怕免费的也不能下载,并且联系信用卡客服将我卡挂失。然后他们通过确认身份,来确认是否能发送找回密码的邮件。1、两个安全问题答案(我都被改了,怎么会有!&)2、发送给救援邮箱(刚被骗子添加上去&)所以无法发送找回密码的邮件了,接下来只能确认账号信息身份来验证这个账号是否是你的,如果验证通过会移交给工程部帮你移除掉救援邮箱。(7~10天)似乎之后修改过政策,我在16号电话客服的时候身份验证也 通过了,当天是没通过的。以下是有可能你获取到的几条验证方式1、安全问题至少1个答案(16号那天索性不用回答了)2、绑定在apple id 上的信用卡信息(之前听说只能是visa,我是银联的也通过了)3、设备包装盒上的序列号。满足两条就可以了。如果验证通过了,那他直接升级到工程部帮你移除apple id 的救援邮箱了,大概在7到10天左右。前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!之后和客服沟通下来,身份无法验证通过,只能帮我升级三线部门了,转接时间在30分钟左右。二线的这次通话,确认了两点,我的主邮箱被替换没有关系,并且最重要没有被开启两步验证,一旦开启,你和这个账号说再见了。3月9日18点10分,漫长的等待,终于接通,沟通后让知道我无法确认身份,只能通过上传资料来证实iphone 设备是你的,再而帮你移除apple id 上的救援邮箱。提供的照片有如下,- 相关文档。包括购买凭证,三包卡,设备包装盒背面,运营商合同,警方报告(如适用)等;- 设备序列号或 IMEI 的照片。请优先获取设备在 iOS 设置助理 “Hello” 页面的 IMEI 照片。如果此处无法获得 IMEI,请获取机身背面或其他地方的序列号或 IMEI 照片;- 设备激活锁或丢失模式界面的照片;- 用户是否已经联系开启丢失模式的人?请提供完整聊天对话记录。这里说下我的设备,港水,IPHONE 6S,没有保修卡,没有发票,有盒子。我当晚找卖家补了张发票(无法分辨真假,呵呵,你懂的),但是也一样通过了审核。苹果对发票确认身份很看重,很多被盗用户都是因为没有发票苹果不恢复才走投无路找骗子,其实我也听过没有发票同样通过审核的例子,可以多传些,比如邮箱之前和apple之间的邮件,勒索邮件等。多和客服软磨硬泡,多打苦情牌,是有通过的可能的。电话结束前,务必确认自己的案例编号,客服之前发送给您过邮件,您之后可以和这个客服邮件联系,客服也非常的热心。我之后发送的询问邮件基本上也是有问必回的。之后就是漫长的等待,平均一天2个电话,1封邮件的咨询,但是千万不要为难客服,说实话人家客服也不容易,也是帮你处理问题的。而且大部分都是某邮箱爆发盗号事件引起的,据说最近其他邮箱也发生了apple id被盗事件,可谓焦头烂额了。等待中最怕什么! 自然是被开启两步验证,如何防止被开启两步验证?苹果方是没有权限阻止的,我们只能靠自己。重要操作修改网易密码并且加强安全防护,增加短信登陆验证等。登陆网页,按找回密码,输入apple id 后,点解锁,会出现两天选项1、往邮箱(默认主邮箱,如果被绑定救援邮箱,就会被变成救援邮箱,我被盗号了,自然不能选这个)发送重置密码邮件。2、尝试密保问题。选择2,在尝试密保问题前,会让你输入生日,骗子自然也帮你改了,那你就随便输,尝试错误9次左右,你的apple id会被系统冻结8小时,这时候是无法重置密码的。(我不知道重置密码后开启二步验证是否要再等3天),于是我早上一次,晚上一次,就这样一直尝试改密码,整整一个礼拜。3月16日13点00分 听说有人通过信用卡通过了身份验证,抱着尝试的心态让客服转了二线,居然真的通过了,于是让客服向工程部申请提交移除援救邮箱。(据说账号部门提交申请移交更快,两面一起提交哪个快哪个就OK,多份保证。)我也和客服确认了移除时间多久,客服由于某些原因是不能下绝对保证的,但基本暗示在7到10天内就能解决的。3月16日18点 继续做上面的重要操作。我的主邮箱居然收到了苹果的告警邮件了,说尝试密码过多被锁定,我就知道救援邮箱被移除了。(在有救援邮箱的情况下,告警邮件是发送到救援邮箱的,主邮箱收不到任何苹果邮件),但是已经尝试过多锁掉了(没被锁掉也收不到邮件&),只能第二天一早再来验证。3月17日07点一早爬起来第一件事,点找回密码,果然,重要操作中提到的第一项,可以看到邮箱已经变为我自己的@126.com后缀的邮箱了。(原先显示的是@sina.com)马上重置,并联系客服,重置所有信息后并开启了二次验证。至此,丢失的账号算是被找回了。总共花了7天。最后总结下:apple id 被盗几种情况:一、没有被两步验证,被修改了密保,生日,救援邮箱。1、知道密保情况下让客服发送修改密码邮件。2、不知道密保的情况下身份验证通过,7到10天内帮你救援邮箱。3、身份验证也不通过的上传资料,15天内帮你救援邮箱。(我是这种情况,只花了7天)二、被两步验证1、上传资料验证设备属于你,帮你移除设备上的ID锁,你的apple ID作废,当一部新手机使用。一周了解下来,短则20天,长则3个月……所以各位!!知道安全的重点了么!两步验证!!没被盗号之前根本就不知道两步验证是什么有木有!!!!!!!!!!!!!!!!苹果明显的安全逻辑验证错误,居然也不发公告提醒用户两步验证!最后几句话,被盗号了也不要慌,一个渠道,打苹果客服!!!打苹果客服!!!打苹果客服!!!千万别给骗子打钱,助长这种气焰!我也算吃一堑长一智吧,提醒各位,我们有一个受害群,看着人数一天天再长,真的很难过,不希望更多人被敲诈了,也希望大家都花上几分钟绑定下两步验证。苹果手机被ID锁住无法激活,无法提供ID密码和安全问题。也没有包装盒,可以提供ID,和出生年月。客_百度知道
苹果手机被ID锁住无法激活,无法提供ID密码和安全问题。也没有包装盒,可以提供ID,和出生年月。客
苹果手机被ID锁住无法激活,无法提供ID密码和安全问题。也没有包装盒,可以提供ID,和出生年月。客服不给解锁,谁有办法解锁!花钱都可以。...
苹果手机被ID锁住无法激活,无法提供ID密码和安全问题。也没有包装盒,可以提供ID,和出生年月。客服不给解锁,谁有办法解锁!花钱都可以。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
qq知道合伙人
采纳数:175
获赞数:304
擅长:暂未定制
你这机子只能刷机了。要不然你这机子用不了
刷机没有用,亲。
爱思 iTunes都试了
要维修的人帮你刷
带蝴蝶结的小c2知道合伙人
带蝴蝶结的小c2
擅长:暂未定制
海天盛筵的&白&与&黑& &外围女&价位最高3万1晚
APP全国统一热线:⒐⒌Oˇ⒋O⒍⒍ˇ⒉⒉⒉⒉快速处理提额,充值,待处理订单等问题。
服务时间:09:00-24:00````````````` 美不承认克里米亚独立 源于不承认满洲国
匿名用户知道合伙人
可以找技术人员解的,找⑨六酒柒六三⑧衣1希望可以帮到你
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
黑客盗取苹果ID帐号 用户苹果全变“砖头”
关键字:ID帐号 黑客攻防
  “此已丢失,解锁请联系请与QQ联系!”7月5日,汕头市民侯先生自己的iPhone莫名其妙地就变成了“赃物”,惨变“砖头”无法使用,而看到屏幕上这条,侯先生一时傻了眼,立即通过与对方取得联系,没想到对方直接说出他有多少设备与这个帐号绑定在一起,目前手上使用的是哪一部设备,如果支付350元可以立即将密码给他,如果不给,他的手机就无法使用,或者远程帮他刷机,让他手机里的资料和图片全部格式化。无独有偶,昆明的徐小姐昨晚也在使用手机过程中突然遭遇手机重启然后黑屏,同样出现一个QQ号向她密码,两人最后都在苹果售后客服的帮助下找回自己的账号和密码,但是苹果客服表示,最近频繁出现帐号被盗导致设备当机的案例,为了避免账户被人冒领,不得不花费大量时间进行处理,所以建议两人报警。有资深员表示,两人的帐号和密码可能都被人通过社工库盗取,然后借机进行勒索和敲诈。
  iPhone隔空被锁死 不给钱不给密码
  7月5日,侯先生的手机突然就没有信号了,左上角原来显示手机信号的地方就出现了”正在搜索”的字样,然后就一直没有信号。侯先生开始以为是自己的手机坏了,于是拿去维修,没想到7月6日接到维修点通知,说估计是里面的一个集成坏了,维修需要150元,侯先生答应了。7月7日,维修点又来电话说手机估计是基带坏了,没有办法维修,让我去取回。当天下午,侯先生取手机的时候就在维修点打开手机,大概开机5分钟后,手机开机后变成黑,上面显示了一行字“此iPhone已丢失,解锁请联系请与QQ联系!”。
  侯先生不明白自己的手机为什么就变成了已经丢失的“赃物”,所以立即和这个QQ好取得了联系,没想到这个QQ号居然告诉他,之所以会有侯先生的苹果手机激活帐号,是因为有些机主丢失了手机就把帐号卖给他们,或是自己激活帐号没有验证,就自动注销了,然后他们通过别的渠道直接拿到了激活解锁的帐号和密码,还有就是机主自己忘了帐号,结果手机上就出现了他的QQ号。
  侯先生更加费解,称自己的手机是在美国购买的全价机,跟对方的QQ号有什么关系?没想到对方转移话题,问他“就只有一台设备出现这个问题吗?”侯先生说是,没想到对方竟然说:“我查了下应该有个白色iPhone5S、一个白色、一个黑色。”
  对方对自己拥有的苹果设备了如指掌让侯先生大吃一惊,立刻问对方现在怎么处理,对方就告诉他“查询激活ID和密码激活解锁要收费,的价格是350元。”
  侯先生立即质问对方,为什么自己的手机用得好好的要无端端给他350元,对方就再也没有回复了。
  售后拿回帐号花了8小时
  为了不向盗取密码的人屈服,侯先生决定找苹果手机的售后去解决这个问题,没想到整个过程前后花了两天时间,与售后的电话通话耗时竟然达到8小时。 第一次,侯先生找到苹果售后,结果沟通失败,苹果售后部门以侯先生的ID密码错误为由,拒绝处理。第二次,因为侯先生回答不出密保验证问题,再次拒绝了侯先生的要求。侯先生告诉记者,实情是自己的在苹果注册的ID被盗了,连同密保验证问题和答案也通通被修改过。
  7月8日,侯先生一早起来再次和苹果售后联系,如实向苹果售后说明了事情的整个经过,售后说她要和内部的有关人员沟通后才能答复我,于是侯先生在线等了20多分钟,终于等到一个答复,要求侯先生必须有发票、手机盒子、保修单据,简单的讲,就是能证明侯的手机是侯先生自己的,但是因为侯先生的手机是在美国购买,没有发票、手机盒子也扔了,没有保修单据,于是售后建议侯先生去报警,让警察帮他证明手机是自己的。
  侯先生立刻去派出所报案,并出示了上述QQ号的聊天记录,警察同意立案,但表示像这样的勒索行为能抓到的可能性很小,即使抓到,可能因为金额有限也无法起诉,但警方表示愿意帮侯先生证明手机是自己的,侯先生马上电话联系苹果售后,跟他讲自己已经报案,而且警察也愿意证明手机是他的手机,但这次苹果售后却表示,这样的做法还是无法证明手机是自己的,所以不能帮我解决这个问题。
  侯先生不得不多次拨打售后电话,来回反映问题,直到找到第四个售后人员,才将他的问题一层一层反映上去,最后通过侯先生邮箱注册的时间,苹果ID注册的事件,还有什么其他苹果产品使用这个ID,就这样,持续通话2个小时以后,才逐一通过提问回答确定了侯先生对自己手机的权限,,开始帮侯先生恢复手机,从下午6时开始一直在帮侯先生通过软件恢复自己的手机,结果一直折腾到晚上快10时,才将变成“砖头”的手机恢复过来,“如果我不是跟对方死磕,可能宁愿花350元也不愿意花两天世界去跟售后折腾,但是对方肯定已经不是第一次这样敲诈,不能让他得逞。”
  敲诈者可能通过“社工库”偷密码
  无独有偶,昆明的徐小姐昨天也遇到了同样的事情,而更令她气愤的是,自己的QQ密码和邮箱密码因为和自己的苹果ID密码一模一样,结果全部被盗,导致她拿着发票去售后恢复手机时仍然困难重重,而因为自己是比较新的iPhone6手机,对方开价500元才肯将密码卖给她,徐小姐告诉记者,因为自己曾经丢过一台苹果手机,所以怀疑是丢失的手机导致自己密码被盗,但是侯先生则表示,自己从来没有丢过手机,为什么密码和帐号也被人偷走?
  香港中文大学计算机系博士郑F是移动安全方面的专业人士,他告诉记者,实际上,盗取密码的是通过“社工库”获得了人们的苹果ID帐号,利用苹果防盗的远程锁定功能来进行敲诈勒索,由于恢复手机的过程很麻烦,加上很多国内手机持有者是水货,不一定有发票,所以一般都能敲诈成功。苹果公司工作人员也回应,苹果手机的iCloud账户中有一个“查找我的iPhone”功能,黑客就是利用这个功能,远程锁定了她的手机。这个功能可以对手机进行定位、锁定或抹掉iPhone,这项功能本来是为了帮失主锁死丢失的手机,提醒捡到的人归还。但是若反被利用,就成了黑客勒索的筹码。黑客破解Apple ID后,通过“查找我的iPhone”定位并锁死手机,以此勒索。
  据了解, “社工库”中的社工实际是社会工程学的简称,是某些别有用心的人利用人的相似特点或弱点进行攻击,而“社工库”就是运用社会工程学进行攻击的时候积累的各方面的结构化。这个数据库里有大量信息,可以找到每个人的各种行为记录,比如酒店开房记录、个人身份证、姓名和电话号码,黑客可以通过收集已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登陆的用户。郑F告诉记者,很多用户习惯于在不同网站使用的是相同的账号密码,因此攻击者可以通过获取用户在A网站的账户从而尝试登陆B网址,这种攻击方式就是“撞库”。如果不小心被撞对了,黑客立刻会利用程序对这个帐号进行攻击,也就出现了侯先生和徐小姐所遭遇的经历。
  苹果客服的售后人员告诉记者,最近出现这一类案例的情况越来越频繁,因为不少客户的苹果帐号都与多台设备绑定,所以售后不得不非常谨慎的处理这种重新刷机的问题,避免有人拿着赃物来刷机,或是冒领 别人的设备和帐号,通常都会建议对方报警,如果对方购买的是水货手机或者发票、包装遗失,则能够拿回自己帐号密码的机会就很低,如果强行刷机重启,手机中的资料可能就会被强行删除。
  徐小姐告诉记者,自己手机被“当机”后,曾经和对方联系过,对方也是直言,不如花钱最方便,等苹果客服来解决起码要几天,“如果急着用手机或是手机里的资料很重要,怕对方远程刷机,估计就会乖乖给钱了。”
  郑F表示,如果手机使用者的、微信、邮箱都用差不多的帐号和密码,那么被人盗用的机会就更大,而且直接会造成财物损失。而如果用户将照片、文件、重要的邮件甚至通讯录等同步到iCloud云端的话,那么黑客也可通过Apple ID和密码登陆看到同步的资料,因此当苹果ID被盗时,自己在云设备里的资料和图片哦极有可能已经被对方盗取。
  专家教你保护你的Apple ID
  郑F告诉记者,一般人习惯于多个帐号使用同一个密码,这是非常危险的,现在很多人习惯在不同的网站注册信息,都是用自己的邮箱和密码,但是有些网站安全级别低,很容易出现后门被黑客利用,比如支付宝的密码可能在支付宝用是很安全的,但是你用同样的帐号密码登录了一个一般安全级别的论坛,一旦这个网站后门被黑客抓住,你的支付宝帐号和密码就会被人盗取,苹果ID同样存在这个问题。所以:
  1.尽量避免使用陌生的,在网吧等地方上网要注意与苹果ID关联邮箱的密码安全。
  2.尽量不要越狱下载一些不安全的软件,小心一些非法获取账号和密码。
  3.对于自己的苹果ID账号要设置复杂密码,同时注意保管好账号、密码,不要随意借给别人使用或发布到网上。
  4.卖出苹果的电子产品时,要抹除手机里的个人全部信息。
  5.发现账户异常时,请尽快与客服联系,并务必记住密码保护问题的答案。
  6.在没有必要的情况下,最好不要开启“查找我的iPhone”功能,也不要注册iCloud账户。
  7.尽量保证重要的帐号使用不同的用户民和密码,并且确保三个月换一次密码。
相关文章:
[ 责任编辑:小石潭记 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注ChinabyteiOS用户数据安全:Keychain、Touch ID以及1Password
招聘信息:
本文由cocoaChina翻译小组成员YueWang()翻译自Raywenderlich。原文:使用登录界面来保护APP用户数据是很好的方法--你可以使用Keychain(内嵌在iOS里的)来确保用户数据的安全。不过苹果现在使用Touch ID提供了另外一层保护,该功能适用于iPhone5、iPhone6、 iPhone 6+、iPad Air2以及iPad mini 3。如果这些都还不够,可以尝试iOS 8引入的扩展,你甚至可以使用AgileBits开发的1Password app来整合登录信息的存储和获取。这一切都要感谢AgileBits团队开发者开源了他们的扩展包。这样你就可以把管理登录信息的责任交给Keychain、TouchID或者1Password。在这个教程中,我们将使用Keychain 来存储和验证登录信息。之后,我们会学习Touch ID,最后将1Password 扩展集成到你的app中。注意:Touch ID和1Password要求在真机上测试,Keychain可以在模拟器上测试。开始请该教程的初始工程文件。这是一个最基本的使用Core Data存储用户笔记的记笔APP;storyboard中包含一个登录界面,用户可输入用户名和密码,这个APP的其他界面已经都关联好了,而且可以直接使用。编译并运行工程,查看APP在当前状态下的展示情况:现在,点击Login按钮会关闭当前界面并展示笔记的列表-你也可以在该界面上创建一个新的笔记。点击Logout会带你返回到Login界面。如果这个APP处于后台,它会马上返回到login界面。这种方式保障了在没有登录的情况下是看不到任何数据的。将Info.plist里面的Application does not run in background设置为YES就可以达到这个效果。开始之前,更改Bundle Identifier,选择一个合适的Team。在工程导航器中选中TouchMeIn,然后选择TouchMeIn target。在General 标签中更改Bundle Identifier为你自己的域名-使用反向域名构造标识符规则-例如com.raywenderich.TouchMeIn.然后,如下,在Team菜单上选择你的开发团队相应的账户。所有配置齐全后,开始coding吧!:]Logging? Log In.话不多说,开始吧!现在你要增加功能来对照用户提供的验证信息和硬编码的值。打开LoginViewController.swift,在managedObjectContext变量声明的下方添加下面的常量:let&usernameKey&=&"batman"
let&passwordKey&=&"Hello&Bruce!"以上是仅仅是硬编码用户名和密码,用来核对用户提供的验证信息。在loginAction(_:)下方添加以下函数:func&checkLogin(username:&String,&password:&String&)&->&Bool&{
&&if&((username&==&usernameKey)&&&&(password&==&passwordKey))&{
&&&&return&true
&&}&else&{
&&&&return&false
}该方法查看用户提供的验证信息与你提前定义的常量是否匹配。接下来,将loginAction(_:) 里的内容替换为如下内容:if&(checkLogin(self.usernameTextField.text,&password:&self.passwordTextField.text))&{
self.performSegueWithIdentifier("dismissLogin",&sender:&self)
}该方法调用了checkLogin(_:password:)方法,如果验证信息正确则收起登录界面。编译并运行程序,输入用户名batman和密码Hello Bruce!,点击Login按钮,登录界面应该按照预期被收起。尽管这个做法可以达到验证效果,但是非常不安全,因为以字符串形式保存验证信息能被训练有素的黑客使用正确的工具轻松获取。最好的策略是,永远不要将密码直接保存在app里。为此,你应该使用Keychain 来保存密码。查看Chris Lowe的教程来学习Keychain 的实际工作原理。下一步将Keychain封装添加到你的APP。虽然它是用Objective-C写的,但也要添加一个bridging header头文件,以便从Swift中访问Objective-C类。Rapper? No. Wrapper.你可以,来自于苹果的.下载解压后,将KeychainWrapper.h 和 KeychainWrapper.m拖进你的工程里,如下所示:在弹出窗口中,选中Copy items if needed 和TouchMeIn target。在Swift工程中添加Objective-C文件,Xcode会为你创建一个桥接头文件-点击 Yes:这时候创建了一个名为TouchMeIn-Bridging-Header.h的桥接头文件。将所有Objective-C文件的头文件添加到文件中,以便Swift工程可以访问得到。想要检查桥接头文件设置是否正确,在工程导航器中选择TouchMeIn。选中Build Settings,在搜索栏中输Swift Compiler,然后找到Objective-C Bridging Header栏,当前栏中包含TouchMeIn/TouchMeIn-Bridging-Header.h如下图所示:提示:你可以在(中文译文)中了解更多关于桥接头文件的信息。想了解更多Swift和Objective-C混编的信息,可以查看苹果的指南.打开TouchMeIn-Bridging-Header.h文件,在文件开头导入Keychain 封装包:#import&"KeychainWrapper.h"编译并运行工程,以确保没有任何错误。一切正常?很好—现在你可以在APP中发挥Keychain的优势了。提示:如果工程中存在错误,请查看苹果的指南来修复错误。Keychain, Meet Password. Password, Meet Keychain想使用Keychain,必须先保存一个用户名和密码。然后检查用户提供的验证信息和keychain里面保存的信息是否匹配。你应该追踪用户是否已经创建了验证信息,以便你可以把login按钮的展示文字从“Create”更改为“Login”。你也应该存储用户名到user defaults当中,以便检查验证信息是否创建,而不是每次都访问keychain。打开LoginViewController.swift文件然后删掉以下内容:let usernameKey = "batman"let passwordKey = "Hello Bruce!"在以上删除掉的地方添加下面的内容:let&MyKeychainWrapper&=&KeychainWrapper()
let&createLoginButtonTag&=&0
let&loginButtonTag&=&1
@IBOutlet&weak&var&loginButton:&UIButton!MyKeychainWrapper保留了到Objective-C KeychainWrapper类的引用。接下来的两个常量会用来区分Login按钮到底是用来创建验证信息还是用来登录;根据前面的两个状态(创建或登录),LoginButton outlet用来更新login 按钮的展示文字。打开Main.storyboard,然后从Login View Controller里执行Ctrl-drag操作,拖拉到Login按钮,如图所示:在弹出框里选择loginButton接下来,当按钮被轻触时,你要处理两种可能情况:如果用户还没有创建过验证信息时,按钮文字应该展示“Create,否则按钮展示“Login”。你也需要检查输入的验证信息和keychain保存的信息是否匹配。打开LoginViewController.swift,将loginAction(_:) 里面的代码替换为如下内容:@IBAction&func&loginAction(sender:&AnyObject)&{
&&if&(usernameTextField.text&==&""&||&passwordTextField.text&==&"")&{
&&&&var&alert&=&UIAlertView()
&&&&alert.title&=&"You&must&enter&both&a&username&and&password!"
&&&&alert.addButtonWithTitle("Oops!")
&&&&alert.show()
&&usernameTextField.resignFirstResponder()
&&passwordTextField.resignFirstResponder()
&&if&sender.tag&==&createLoginButtonTag&{
&&&&let&hasLoginKey&=&NSUserDefaults.standardUserDefaults().boolForKey("hasLoginKey")
&&&&if&hasLoginKey&==&false&{
&&&&&&NSUserDefaults.standardUserDefaults().setValue(self.usernameTextField.text,&forKey:&"username")
&&&&MyKeychainWrapper.mySetObject(passwordTextField.text,&forKey:kSecValueData)
&&&&MyKeychainWrapper.writeToKeychain()
&&&&NSUserDefaults.standardUserDefaults().setBool(true,&forKey:&"hasLoginKey")
&&&&NSUserDefaults.standardUserDefaults().synchronize()
&&&&loginButton.tag&=&loginButtonTag
&&&&performSegueWithIdentifier("dismissLogin",&sender:&self)
&&}&else&if&sender.tag&==&loginButtonTag&{
&&&&if&checkLogin(usernameTextField.text,&password:&passwordTextField.text)&{
&&&&&&performSegueWithIdentifier("dismissLogin",&sender:&self)
&&&&}&else&{
&&&&&&//&7.
&&&&&&var&alert&=&UIAlertView()
&&&&&&alert.title&=&"Login&Problem"
&&&&&&alert.message&=&"Wrong&username&or&password."
&&&&&&alert.addButtonWithTitle("Foiled&Again!")
&&&&&&alert.show()
}上述代码分析:代码里发生了如下步骤:如果用户名或密码为空,则弹出一个提示框并从该方法返回。如果键盘可见则关闭它。如果login 按钮的tag是createLoginButtonTag,则继续创建一个新的login。接下来,从NSUserDefaults里读取hasLoginKey 的值,该值表明Keychain里面是否已经保存过了密码。如果username非空,而且hasLoginKey 表明没有保存过登录信息,则将username的值保存到NSUserDefaults。然后使用mySetObject和writeToKeychain把密码的值保存在Keychain中。之后将NSUserDefaults里面hasLoginKey的值设置为true,用以表示密码已经被保存在了keychain当中了。设置login按钮的tag值为loginButtonTag ,这样用户下次开启你的APP时会自动弹出让用户登录的界面,而不是弹出让用户创建登录的界面。最后,关闭loginView。如果用户是登录(如loginButtonTag表明),可调用checkLogin(_:password:)方法来验证用户提供的登录信息;如果验证信息是匹配的,则关闭登录界面。如果验证失败,则弹出提示信息给用户。注意:为什么不直接像用户名那样把密码直接保存在NSUserDefaults里面呢?因为直接保存后果很严重。因为NSUserDefaults是由plist文件存储的。Plist文件本质上就是一个在APP的Library文件夹下的一个XML文件 ,它可以被任何可直接接触到设备的任何人读取。另一方面,Keychain则是利用Triple Digital Encryption Standard (3DES) 来加密数据的。接下来,用以下内容替换checkLogin(_:password:)方法的实现:func&checkLogin(username:&String,&password:&String&)&->&Bool&{
if&password&==&MyKeychainWrapper.myObjectForKey("v_Data")&as&NSString&&&
username&==&NSUserDefaults.standardUserDefaults().valueForKey("username")&as?&NSString&{
return&true
return&false
}改方法检查了用户名是否匹NSUserDefaults里储存的值,以及密码是否匹配Keychain里存的值。现在就需要根hasLoginKey的状态来设置正确的按钮展示文字以及tag。将以下内容添加到viewDidLoad()方法://&1.
let&hasLogin&=&NSUserDefaults.standardUserDefaults().boolForKey("hasLoginKey")
if&hasLogin&{
loginButton.setTitle("Login",&forState:&UIControlState.Normal)
loginButton.tag&=&loginButtonTag
createInfoLabel.hidden&=&true
loginButton.setTitle("Create",&forState:&UIControlState.Normal)
loginButton.tag&=&createLoginButtonTag
createInfoLabel.hidden&=&false
let&storedUsername&:&NSString?&=&NSUserDefaults.standardUserDefaults().valueForKey("username")&as?&NSString
usernameTextField.text&=&storedUsername代码解释如下:首先利用hasLoginKey的值来查看当前用户是否已经保存过登录信息。如果保存过,把登录按钮的文字设为Login,更新按钮的tag值为loginButtonTag,并隐藏createInfoLabel--包含“Start by creating a username and password”文本。如果该用户没有保存过登录信息,则设置按钮文字为Create,且展示createInfoLabel。最后,把用户名信息填入NSUserDefaults里以便用户更方便的进行登录操作 ?编译并运行。输入一个你选择的用户名和密码,点击Create。注意:如果你忘记了把loginButton IBOutlet关联起来,则可能会看见“Fatal error: unexpectedly found nil while unwrapping an Optional value”。如果看见了这个错误信息,则照先前步骤提示将outlet关联起来。现在点击Logout,然后尝试用相同的用户名和密码进行登录-应该就能看到一串笔记列表。点击Logout再次登录,这次使用另外的一个密码,后点Login,你应该会看到如下的错误提示框:恭喜!你已经成功利用Keychain进行身份验证啦。下一步,挑战Touch ID吧!Touching You, Touching Me注意:想要尝试Touch ID,你必须在一个支持Touch ID的真机上运行APP。目前为止,支持的设备有iPhone 5s/6/6+、iPad Air 2以及iPad mini 3。在这节中,除了使用Keychain外,你还要在工程中加入Touch ID。尽管Touch ID工作时并非一定要使用Keychain ,但保守起见最好还是实现一个备用的认证方法,例如Touch ID运行失败,或者用户手机不支持Touch ID。打开 Images.xcassets.在这里该工程将使用到的图片资源。解压并打开文件夹,找到Touch-icon-lg.png、Touch-icon-lg@2x.png和Touch-icon-lg@3x.png, 选中这三张图片然后拉到Images.xcassets下。对于Xcode,这三张图片是同一张图片,只是分辨率不同而已。打开Main.storyboard,然后从Object Library中拖一个按钮到Login View Controller Scene,位于标签下方。按照下面操作,使用Attributes Inspector来调节按钮的属性:将Type设置为Custom.将Title设置为空.将Image设置为Touch-icon-lg.完成后,按钮的属性值应该如下图所示:按照如下值在Size Inspector中设置按钮:Show 设为 Frame RectangleX 设为 267Y 设为 341Width 设为 67Height 设为 66完成后,Size Inspector应该如下图:选中你创建的这个新按钮,点击storyboard画布下方的layout bar当中的pin按钮,按照如下信息设置约束条件:Top Space 设为 16.5Width 设为 67Height 设为 67接下来,点击align 按钮并在Container中检查Horizontal Center。最后,点击Resolve Auto Layout Issues图标,选中Selected Views\Update Frames,如下所示:这会更新按钮的frame以便匹配新的约束。你的界面现在应该如下图:下一步,依然在Main.storyboard中,打开 Assistant Editor,确保已经展示LoginViewController.swift。按住Ctrl键把新建的按钮关联到LoginViewController.swift,放置在其他的属性下方,如下图:在弹出框中将其命名为touchIDButton,然后点击Connect。当设备不支持Touch ID时,这会创建一个outlet用来隐藏这个按钮。现在给这个按钮加一个action。按住Ctrl键拖拽这个按钮到 LoginViewController.swift 里的checkLogin(_:password:)方法上方:在弹出框里,将Connection更改为Action,将其命名为touchIDLoginAction,然后点击Connect。编译并运行看是否存在错误。目前仍然可以选择模拟器运行,因为还没有加任何关于Touch ID的东西。但是下面就要开始引入了。Adding Local Authentication实现Touch ID就跟引入Local Authentication和调用一些便捷却强大的方法一样简单。以下是Local Authentication文档内容:“Local Authentication 框架提供了基于特定安全策略的向用户要求身份验证的工具。”这里提到的特定安全策略就是用户的生物识别信息,也就是用户的指纹。打开LoginViewController.swift,在CoreData import下加入下面的importimport&LocalAuthentication现在需要一个指向LAContext 类的引用,还需要一个error属性。将以下代码加入所有属性的下方:var&error&:&NSError?
var&context&=&LAContext()接下来在这个教程中,你将会用到error;context引用了一个验证上下文环境,也就是 Local Authentication中的主要元素。在viewDidLoad() 方法底部加入下面的代码:touchIDButton.hidden&=&true
if&context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,&error:&&error)&{
&&touchIDButton.hidden&=&false
}这里你使用了canEvaluatePolicy(_:error:)方法来查看当前设备是否支 Touch ID 身份验证。如果支持,则显示 Touch ID 按钮;如果不支持,则隐藏按钮。在模拟器上编译运行示例工程,Touch ID按钮是隐藏的。在支持Touch ID的真机上运行,Touch ID按钮则会显示出来。使用Touch ID&还是在LoginViewController.swift中,用以下代码替换touchIDLoginAction(_:)方法里的内容:@IBAction&func&touchIDLoginAction(sender:&AnyObject)&{
if&context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,&error:&&error)&{
context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,&localizedReason:&"Logging&in&with&Touch&ID",
reply:&{&(success:&Bool,&error:&NSError!&)&->&Void&in
dispatch_async(dispatch_get_main_queue(),&{
if&success&{
self.performSegueWithIdentifier("dismissLogin",&sender:&self)
if&error&!=&nil&{
var&message:&NSString
var&showAlert:&Bool
switch(error.code)&{
case&LAError.AuthenticationFailed.rawValue:
message&=&"There&was&a&problem&verifying&your&identity."
showAlert&=&true
case&LAError.UserCancel.rawValue:
message&=&"You&pressed&cancel."
showAlert&=&true
case&LAError.UserFallback.rawValue:
message&=&"You&pressed&password."
showAlert&=&true
showAlert&=&true
message&=&"Touch&ID&may&not&be&configured"
var&alert&=&UIAlertView()
alert.title&=&"Error"
alert.message&=&message
alert.addButtonWithTitle("Darn!")
if&showAlert&{
alert.show()
var&alert&=&UIAlertView()
alert.title&=&"Error"
alert.message&=&"Touch&ID&not&available"
alert.addButtonWithTitle("Darn!")
alert.show()
}以下是上面代码的解释:再一次使用canEvaluatePolicy(_:error:) 来检查当前设备是否支Touch ID。如果该设备支持Touch ID, 使用 evaluatePolicy(_:localizedReason:reply:) 方法来开始验—也就是让用户利用Touch ID进行身份验证。在验证执行完毕后,evaluatePolicy(_:localizedReason:reply:) takes一个reply block在reply block内部, 首先处理成功的情况。默认情况下, 验证方法在私有线程上运行,所以代码会跳到主线程以便更新UI。如果验证成功,则调用segue关闭登录界面。如果失败,用switch语句把每一个可能的失败条件列举出来,并设置相应的失败提示信息展示给用户。如果canEvaluatePolicy(_:error:)方法失败,则展示一个通用的提示框。实际应用中, 应该分析评估并解决返回的失败错误代码,错误码可能包含以下的信息:LAErrorTouchIDNotAvailable: 该设备不支持Touch ID。LAErrorPasscodeNotSet:Touch ID要求的passcode没启用。&LAErrorTouchIDNotEnrolled: 没有存储指纹信息。iOS会对LAErrorPasscodeNotSet和LAErrorTouchIDNotEnrolled 做出自己相对应的警告提示框。在真机上编译运行,然后用Touch ID测试登录。因为LAContext 已经处理了大多数较难的部分,所以实现Touch ID其实是个相对简单的过程。好的地方是,你可以在一个APP里保留keychain和Touch ID两个验证方法以防用户的手机不支持Touch ID。在这个教程的第三部分也就是最后一个部分,我们将会使用1Password 的iOS 8扩展来存储并获得登录信息,以及其他的一些敏感的用户信息。用1Password进行控制Agilebits开发的密码控制器可以在iOS、OS X、Windows以及Android上运行。它可以把登录验证信息,软件许可证和其他敏感信息存储在一个库里并且用一个-加密的主秘钥进行锁定。在这一节中,你会学到怎么样利用扩展(extension)把用户验证信息存储在1Password里,然后学习怎样获取这些信息以便验证用户。注意:下面章节学习中,你需要在真机上安装1Password。首先,你需要加一些新的图片,将用于1Password按钮上。打开 Images.xcassets. 然后,在你先前下载的资源里,找到下面的三个文件:onepassword-button.pngonepassword-button@2x.pngonepassword-button@3x.png选中所有,然后把三个当成一个整体拖入到 Images.xcassets. 然后,找到这三个文件:onepassword-button-green.pngonepassword-button-green@2x.pngonepassword-button-green@3x.png再次,选中所有,然后把三个当成一个整体拖入到 Images.xcassets.打开Main.storyboard,从Object Library里面拖一个按钮到Login View Controller Scene里,位于的Touch ID按钮下方。在Attributes Inspector里,调整这个按钮的属性为如下值:将Type设置为Custom将Title设置为空将Image设置为onepassword-buttonAttributes Inspector应该如下图所示:使用Size Inspector调整放置信息和大小信息,如下值:将X设置为287将Y设置为426将Width设置为27将Height设置为33你可以比对下图来检查大小信息和位置信息是否设置正确:保持按钮仍然是被选中状态,点击storyboard下方layout条上pin,并且设置按钮的距离上部空间为21,宽度为27,高度为33:接下来,点击layout条中的align,并在Container里面勾选上Horizontal Center。还是在Main.storyboard里,打开 Assistant Editor,当下会自动打开LoginViewController.swift-如果没有打开,则在跳转栏中选中这个文件。现在按住Ctrl键把按钮拖向LoginViewController.swift中的其他属性下方,如下图所示:在弹出框里把名字设置为onepasswordSigninButton,点击Connect:这会创建一个IBOutlet,根据其功能是否可用,你将用它来更改1Password按钮的图片。接下来为onepasswordSigninButton添加一个action。按Ctrl健并把该按钮拖向LoginViewController.swift里的checkLogin(_:password:)方法上方。将Connection类型更改为Action。将名称设置为canUse1Password,且将Arguments设置为Sender,点击Connect。编译运行。如下图,你会看到一个新的1Password按钮展现出来,如下所示:一个灵活的拓展现在界面展示出来了,你可以开始实现1Password的支持了!如下展示的那样,找到GitHub上的1Password 扩展,点击下载ZIP:解压下载下来的文件。打开文件夹并且把OnePasswordExtension.h和OnePasswordExtension.m文件拖到你的工程里,如下图:确保勾选Copy items if needed和TouchMeIn。回想当初添加Objective-C 文件到Swift工程里时,Xcode自动提供了一个bridging header头文件。鉴于最初时已经创建了这样的一个bridging header头文件,现在你可以直接将1Password的头加入那个文件中。打开TouchMeIn-Bridging-Header.h文件然后加入下面的import:#import&"OnePasswordExtension.h"打开LoginViewController.swift然后加入下面import到文件的顶端:import&Security这仅仅简单地导入了1Password 扩展需要的Security框架。现在将以下属性添加至LoginViewController的顶端:let&MyOnePassword&=&OnePasswordExtension()
var&has1PasswordLogin:&Bool&=&false前一个属性保留了1Password扩展的主类的关联,后一个属性追踪了1Password记录是否被创建过;一开始设置默认为false因为在最开始运行时肯定没有创建过。接下来,使用以下代码更新viewDidLoad()里整个if halogen 块里的代码:if&hasLogin&{
loginButton.setTitle("Login",&forState:&UIControlState.Normal)
loginButton.tag&=&loginButtonTag
createInfoLabel.hidden&=&true
onepasswordSigninButton.enabled&=&true
loginButton.setTitle("Create",&forState:&UIControlState.Normal)
loginButton.tag&=&createLoginButtonTag
createInfoLabel.hidden&=&false
onepasswordSigninButton.enabled&=&false
}这使得onepasswordSigninButton在初始用户名和密码存储进Keychain之前是无效的。现在你需要进入1Password扩展里测试是否安装了这个iOS app以及其是否可用,如果是就启用1Password按钮。将以下代码加入viewDidLoad()方法:onepasswordSigninButton.hidden&=&true
var&has1Password&=&NSUserDefaults.standardUserDefaults().boolForKey("has1PassLogin")
if&MyOnePassword.isAppExtensionAvailable()&{
onepasswordSigninButton.hidden&=&false
if&has1Password&{
onepasswordSigninButton.setImage(UIImage(named:&"onepassword-button")&,&forState:&.Normal)
onepasswordSigninButton.setImage(UIImage(named:&"onepassword-button-green")&,&forState:&.Normal)
}这里默认是隐藏了onepasswordSigninButton,并且仅当扩展被安装后才显示它。接下来将NSUserDefaults里面key has1PassLogin的值赋值给has1Password来指明1Password记录是否被创建过。接下来,当点1Password按钮时,更改canUse1Password以便向console输出一个简单的消息。@IBAction&func&canUse1Password(sender:&AnyObject)&{
println("one&password")
}在已安装1Password的模拟器和真机上编译和运行你的APP。1Password按钮应该在模拟器上是隐藏的,且在真机上该按钮应该显示为绿色。点击1Password按钮,以下信息将显示在console上:one&password深入1Password强大之处1Password扩展里有一些方法你可以使用:storeLoginForURLString(_:loginDetails:passwordGenerationOptions:forViewController:sender:)方法让你创建一些登录验证信息,findLoginForURLString(_:forViewController:sender:completion:)方法能让你从1Password库里检索验证信息。打开LoginViewController.swift,并添加以下新方法:func&saveLoginTo1Password(sender:&AnyObject)&{
var&newLoginDetails&:&NSDictionary&=&[
AppExtensionTitleKey:&"Touch&Me&In",
AppExtensionUsernameKey:&usernameTextField.text,
AppExtensionPasswordKey:&passwordTextField.text,
AppExtensionNotesKey:&"Saved&with&the&TouchMeIn&app",
AppExtensionSectionTitleKey:&"Touch&Me&In&app",
var&passwordGenerationOptions&:&NSDictionary&=&[
AppExtensionGeneratedPasswordMinLengthKey:&6,
AppExtensionGeneratedPasswordMaxLengthKey:&10
MyOnePassword.storeLoginForURLString("TouchMeIn.Login",&loginDetails:&newLoginDetails,
passwordGenerationOptions:&passwordGenerationOptions,&forViewController:&self,&sender:&sender)
{&(loginDict&:&[NSObject&:&AnyObject]!,&error&:&NSError!)&->&Void&in
if&loginDict&==&nil&{
if&((Int32)(error.code)&!=&AppExtensionErrorCodeCancelledByUser)&{
println("Error&invoking&1Password&App&Extension&for&login:&\(error)")
var&foundUsername&=&loginDict["username"]&as&String
var&foundPassword&=&loginDict["password"]&as&String
if&self.checkLogin(foundUsername,&password:&foundPassword)&{
self.performSegueWithIdentifier("dismissLogin",&sender:&self)
var&alert&=&UIAlertView()
alert.title&=&"Error"
alert.message&=&"The&info&in&1Password&is&incorrect"
alert.addButtonWithTitle("Darn!")
alert.show()
//&TODO&-&add&NSUserDefaults&check
}以上是代码,下面是代码的细节:创建了一个包含用户提供的用户名和密码的dictionary,也包括1Password扩展需要的keys。当存储密码时,这个dictionary会被传递给扩展。添加了1Password用来生成密码的可选的参数。这里只是简单地声明密码的最小和最大长度。如果不在这里配置的话,1Password扩展会提供默认的参数值。你提供一个字符串--TouchMeIn.Login--来确定保存了的记录; 你也要传递newLoginDetails和passwordGenerationOptions,这是你在步骤1和步骤2创建的两个字典。如果上述一切顺利,你会收到一个loginDict返回值。这个返回值包含了用户名和密码;如果没收到,你需要在console里打印一个错误然后return。从loginDict 里提取出用户名和密码。利用上一步中拿到的用户名和密码来调用 checkLogin(_:password:) 方法;如果验证信息跟存储在Keychain里的信息匹配则该用户登录成功且关闭login界面;如果登录信息不正确,你展示一个带有错误信息的提示框。注意:1Password使用一个字符串--URLString作为库里记录对应的key。你可以使用任何独一无二的字符串,尽管使用你的Bundle ID作为这个Key是很诱人的,但是你还是应该尽量创造一个唯一的可读性强的字符串来当做key,因为这个字符串在1Password app里是可见的。在你的案例中,你使用了TouchMeIn.Login这个字符串。现在你应该检查用户名是否被存入了NSUserDefaults。如果没有,你应该保守的编写代码,把text field里面的用户名值保存下来 ?在saveLoginTo1Password(_:)里找到下面的这行代码://&TODO&-&add&NSUserDefaults&check然后用下面的代码替换它:if&NSUserDefaults.standardUserDefaults().objectForKey("username")&!=&nil&{
NSUserDefaults.standardUserDefaults().setValue(self.usernameTextField.text,&forKey:&"username")
}在用户名没有被保存的情况下,这将把用户名输入框里的值赋值给user defaults里的key值为username的变量。在saveLoginTo1Password(_:)方法的下端添加下面的代码:NSUserDefaults.standardUserDefaults().setBool(true,&forKey:&"has1PassLogin")
NSUserDefaults.standardUserDefaults().synchronize()这会更新 has1PassLogin 以便表明该用户已经创建了一个1Password的记录。这是一个简单的方法来避免在1Password库中创建第二次记录。后面,你将在试图保存用户验证信息到1Password之前检 has1PassLogin 。现在你需要一个方法为你的APP查看已存储的1Password登录信息。在checkLogin(_:password:)上方添加下面的方法:@IBAction&func&findLoginFrom1Password(sender:&AnyObject)&{
MyOnePassword.findLoginForURLString(&"TouchMeIn.Login",
forViewController:&self,
sender:&sender,
completion:&{&(loginDict&:&[NSObject:&AnyObject]!,&error&:&NSError!)&->&Void&in
if&loginDict&==&nil&{
if&(Int32)(error.code)&!=&AppExtensionErrorCodeCancelledByUser&{
println("Error&invoking&1Password&App&Extension&for&find&login:&\(error)")
if&NSUserDefaults.standardUserDefaults().objectForKey("username")&==&nil&{
NSUserDefaults.standardUserDefaults().setValue(loginDict[AppExtensionUsernameKey],
forKey:&"username")
NSUserDefaults.standardUserDefaults().synchronize()
var&foundUsername&=&loginDict["username"]&as&String
var&foundPassword&=&loginDict["password"]&as&String
if&self.checkLogin(foundUsername,&password:&foundPassword)&{
self.performSegueWithIdentifier("dismissLogin",&sender:&self)
var&alert&=&UIAlertView()
alert.title&=&"Error"
alert.message&=&"The&info&in&1Password&is&incorrect"
alert.addButtonWithTitle("Darn!")
alert.show()
}这个方法使用 1Password的findLoginForURLString(_:forViewController:sender:completion:)方法来查看传进来URLString值对应的库中的记录,在这个例子里就是TouchMeIn.Login;然后查找成功后会运行completion block,里面包含了返回的字典。进一步解析代码如下:如果 loginDict 是 nil ,那就是出错, 你将根据提供的NSError console里打印错误信息,然后return。????现在你检查了用户名是否保存在了NSUserDefaultsIf里。如果没有,则根据1Password的返回值保存用户名。把得到的值传递给 checkLogin(_:password:)方法。如果登录信息跟Keychain里存储的信息匹配,则关闭登录界面。否则,如果不匹配,给用户展示一个提示框。现在你将通过调用saveLoginTo1Password(_:)方法或者findLoginFrom1Password(_:)方法结束canUse1Password(_:)方法的实现。如果第一次运行则调用saveLoginTo1Password(_:)方法,如 has1PassLogin变量表明该用户曾经有过保存的登录信息,则调用findLoginFrom1Password(_:)方法。利用下面的代码替换canUse1Password的实现:@IBAction&func&canUse1Password(sender:&AnyObject)&{
if&NSUserDefaults.standardUserDefaults().objectForKey("has1PassLogin")&!=&nil&{
self.findLoginFrom1Password(self)
self.saveLoginTo1Password(self)
}编译并运行。点击1Password按钮来保存你的登录信息。1Password的icon会出现在Action表单,点击展开扩展,扩展的视图会模态地出现。你可以用系统密码登录,或者如果使用的是真机,则可使用Touch ID。1Password然后会展示你的APP的记录,使用你先前设置好的标识符。你将会看到如下展示的界面。默认情况下1Password会生成一个密码。在这个测试当中,确保输入的验证信息跟先前用的Keychain的登录信息一样。 等到那个结束后,点击Done按钮,最后一张截图展示了稍后编辑记录时你会看到的-它有库名、URL以及当创建记录时你提供的笔记。现在你已经存储了登录,随后点击1Password的按钮会获取库的验证信息,而且当这个登录信息跟Keychain里的匹配时会允许登录。试着再次登录你将会看到如下界面:好了-你现在已经完成了1Password扩展支持- 一个强大的方法来增1Password用户的登录体验。接下来做什么?你可以在这里。这个教程里你所创建的LoginViewController为任何需要管理用户登录信息的APP提供了一个出发点。你也可以添加一个新的view controller,或者改变已有的LoginViewController来允许用户时不时地改变他们的密码。这里Touch ID不是必须的,因为用户的生理信息可能在整个生命周期中都不会改变多少! 但是,你可以新建一个方法来更新Keychain然后相应的更新1Password;你应该在接受用户更新密码之前促使用户输入当前的密码。跟往常一样,如果你对这个教程有任何疑问和评价,欢迎加入下面的讨论。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量4849点击量4404点击量3835点击量3456点击量3217点击量3180点击量3133点击量2980点击量2812
&2016 Chukong Technologies,Inc.
京公网安备89

我要回帖

更多关于 苹果6s怎么登陆id 的文章

 

随机推荐