Password AutoFill APP Extensions 密码自动填充 iOS12

      刚开始接到这个需求的时候第一感觉就是做不到,怎么可能把自己APP内的账号密码填充到其他APP登录的输入框内,但是客户找出了类似的APP说是别人的APP是可以的,相信你也可以。这时我就有些没有头绪了,我在网上找资料,可是无果。最后拿出我的神器,用谷歌搜,刚开始搜的也是一些没有用的。但是随后还是找到了一些资料。都是一些零零散散的。而且都是一些英文的文档,我一边翻译一边看,还是没有头绪。我想着这是在APP以外用到的,不会启动APP,所以我就想到了用APP拓展。我就按照APP拓展的方式去打开果然真的有账号密码填充。

点击加号就会出现应用拓展的选项,直接选择密码填充
接下来就是跟正常的APP拓展是一样的,需要配置一下配置文件

这里就不多说了,新建完之后有一个文件夹,里面有一个CredentialProviderViewController控制器和一个MainInterface.storyboard,这两个类就是应用拓展的入口,入口也是可以改变的需要在info.plist里面

NSExtensionPrincipalClass 添加这个键对应的就是APP拓展的入口,NSExtensionAttributes下面的ASCredentialProviderExtensionShowsConfigurationUI的属性对应的就是在设置的时候是否弹出APP拓展的入口,

一般来说在设置点击的时候是需要验证一下,此应用的密码,或者是指纹之类的。但是如果点击了设置里面的选项,弹出APP拓展的验证,这时取消验证,设置里面的选项还是被勾选的,不能被取消。如果读者有更好的方法,可以在下面留言,可以相互学习一下。

接下来先简单的介绍一下CredentialProviderViewController.m里的

- (void)prepareCredentialListForServiceIdentifiers:(NSArray<ASCredentialServiceIdentifier *> *)serviceIdentifiers

这个是如果输入框设置为苹果的账号类型就会有返回,这个方法进入之后就会走这个方法。展示Credentials List让用户选择,系统会触发该方法,并传入serviceIdentifiers数组,以便用户过滤或者对数据排序。如果serviceIdentifiers数组存在多个,那么越靠前的数据价值越大。当然数组也可能是空的。

- (void)provideCredentialWithoutUserInteractionForIdentity:(ASPasswordCredentialIdentity *)credentialIdentity;

这个方法会被触发是点击键盘上面的账号密码,这个账号密码如何显示到键盘上,需要存储到ASCredentialIdentityStore里面,我是在点击具体的密码返回到上一界面的时候

ASPasswordCredentialIdentity * credent = [[ASPasswordCredentialIdentity alloc] initWithServiceIdentifier:self.service

                                                                                                        user:accout

                                                                                            recordIdentifier:nil];


    [[ASCredentialIdentityStore sharedStore] saveCredentialIdentities:@[credent]

                                                          completion:^(BOOL success, NSError * _Nullable error) {

                                                              NSLog(@"%@", error);

                                                          }];

self.service是prepareCredentialListForServiceIdentifiers:方法返回的,这里会有问题,可以自己创建一个ASCredentialServiceIdentifier类型的对象进行存储。如果用户可信则直接返回数据,否则可以触发ASExtensionErrorCodeUserInteractionRequest让用户进行身份验证。该方法触发时ViewController并没有展示,所以不要做任何的UI操作。

- (void)prepareInterfaceToProvideCredentialForIdentity:(ASPasswordCredentialIdentity *)credentialIdentity;

该方法是验证,比如提供一个解锁页面,当用户输入密码正确则调用[ASCredentialProviderExtensionContext completeRequestWithSelectedCredential:completionHandler:]对外提供数据;如果输入错误,则调用[ASCredentialProviderExtensionContext cancelRequestWithError:]错误类型选用ASExtensionErroCode中的ASExtensionErroDomain,如果Extension无法为外部提供数据则选用ASExtensionErrorCodeCredentialIdentityNotFound。

- (void)prepareInterfaceForExtensionConfiguration;

系统Setting打开Extension时触发。这时会展示ViewController。该方法触发需要配置。


走到这里基本上完成了百分之50。有一个最重要的还没有解决,就是要读取主APP的数据,APP拓展的数据跟主APP的数据是独立的。所以这里就需要的用到APP GROUP https://blog.csdn.net/allangold/article/details/54890555这里介绍的很全面,我这里就不细说了。

我在这里遇到了一个问题,就是主APP中的数据是存储在数据库里面。需要把这些数据存储到共享的空间当中。我的数据库文件是个.db文件。所以我在初始化数据库的时候直接把数据库copy到共享空间,其他的在那个博客里面也写到,这里就不多做解释

- (BOOL)saveDataFromPath:(NSString *)originPath toFile:(NSString *)filename

{

    NSURL *url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"这里是共享空间的ID"];

    NSURL *fileURL = [url URLByAppendingPathComponent:filename];


    NSFileManager *fileManager =[NSFileManager defaultManager];

    return [[NSFileManager defaultManager] copyItemAtPath:originPath toPath:[fileURL path] error:nil];

}

用这个方法

NSURL *url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"这里是共享空间的ID"];      

NSURL *fileURL = [url URLByAppendingPathComponent:@"mypass.db"];

  _queue = [FMDatabaseQueue databaseQueueWithPath:fileURL.path];

到这里大部分的工作做得差不多了。第一次写写文章,有些地方写的不是很全面。也有些落下的可以多多指正。逻辑可能有些乱,不动的可以留言,或者加我wx: jiangdong00000000,大家共同学习,一起进步,谢谢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容