iOS Password AutoFill開髮指南

来源:https://www.cnblogs.com/zhanggui/archive/2018/08/06/9431950.html
-Advertisement-
Play Games

引言 在《iPhone User Guide for iOS 11.4》這本書中,介紹了iOS11的新特性。其中在Safari的章節中,介紹了Fill in forms。也就是當你在網頁登錄、註冊以及購買的時候,用戶可以通過鍵盤來填充網頁的表單、或者是Safari自己填充(前提是你開啟了AutoFi ...


 轉載請標明來源:https://www.cnblogs.com/zhanggui/p/9431950.html

引言

在《iPhone User Guide for iOS 11.4》這本書中,介紹了iOS11的新特性。其中在Safari的章節中,介紹了Fill in forms。也就是當你在網頁登錄、註冊以及購買的時候,用戶可以通過鍵盤來填充網頁的表單、或者是Safari自己填充(前提是你開啟了AutoFill)。

AutoFill功能打開方式:設置 → Safari → 自動填充(AutoFill)。使用AutoFill有兩種功能:

1.保存你的密碼:你在網頁中輸入密碼,Safari會詢問您是否為你登錄的網站保存密碼,點擊YES即可。

2.為新賬號提供建議密碼:點擊密碼區域,點擊提示密碼,點擊使用建議的密碼,就可以使用建議密碼

上圖為註冊B站的流程,打開Safari,然後打開該網站,就可以進行註冊,註冊在輸入新密碼的時候,會有提示密碼,點擊提示密碼就會彈出圖(1)所示,Safari會為你生成一個建議密碼,然後你使用建議密碼即可(2),再次登錄時直接選中已經存儲的賬號密碼即可。

這裡還有一個很不錯的功能點:當你登錄與該網站關聯的APP時,系統會自動幫你填充賬號密碼,達到兩步登錄效果(點擊提示即可自動輸入賬號密碼,然後點擊登錄即可登錄)

如果想查看已經保存的密碼,可以直接打開設置 → 賬號和密碼 → 應用與網站密碼,即可查看當前存儲的密碼:

接下來就簡單實現一個類似上述功能的DEMO:在網頁登錄之後,在APP可以直接進行Password AutoFill。會從四個方面進行介紹:

  1. 如何展示出來QuickType Bar
  2. 保證正確的UI展示
  3. 讓QuickType Bar顯示正確的信息
  4. 針對第三方服務進行認證

如何展示出來QuickType Bar

所謂QuickType Bar,就是你使用輸入框調起鍵盤的時候鍵盤上面的Bar,要想展示出來QuickType Bar,首先要滿足的一個條件就是:在設置的賬戶和密碼中必須要有保存的賬號密碼

如下圖:

左側為在賬號和密碼中沒有任何賬號和密碼的情況,右側為保存了一個賬號和密碼的情況。也就是說只要在系統的“賬號與密碼”中有保存數據,QuickType Bar就會出現一個鎖,點擊即可選擇當前已經保存的賬號和密碼,達到填充輸入效果。

只要使用的UITextField或者是UITextView,都是可以在沒有開發任何代碼的情況下展示QuickType Bar。當然如果你使用的不是這兩個控制項,那麼需要實現<UITextInput>協議。實現此協議之後也可以使用該特性。問題來了:蘋果系統如何知道你在“賬號與密碼”中保存的內容如何自動填充到你自己開發的頁面表單中呢?這裡就用到了textContentType:

textContentType表示文本輸入區所期望的語義。舉個例子你可以執行輸入框的textContentType為:UITextContentTypeEmailAddress,這樣當你輸入內容的時候,系統可以在某些情況下自動選擇適當的鍵盤。預設情況下,這個屬性是nil。

系統在iOS11之前包含的contentType有:(註意iOS系統版本限制)

UIKIT_EXTERN UITextContentType const UITextContentTypeName                      NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNamePrefix                NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeGivenName                 NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeMiddleName                NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFamilyName                NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNameSuffix                NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNickname                  NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeJobTitle                  NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeOrganizationName          NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeLocation                  NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFullStreetAddress         NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine1        NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine2        NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCity               NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressState              NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCityAndState       NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeSublocality               NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCountryName               NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypePostalCode                NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeTelephoneNumber           NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeEmailAddress              NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeURL                       NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCreditCardNumber          NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeUsername                  NS_AVAILABLE_IOS(11_0);
UIKIT_EXTERN UITextContentType const UITextContentTypePassword                  NS_AVAILABLE_IOS(11_0);

在iOS11新增了兩個UITextContentTypeUsername 和 UITextContentTypePassword ,只需要設置textfield的這個屬性即可:

self.accountTextField.textContentType = UITextContentTypeUsername;
self.passwordTextField.textContentType = UITextContentTypePassword;

這樣系統便會根據你所這隻的ContentType將賬號和密碼按照你的設置填入相應的輸入框內。如果你的賬號是郵箱,可以將contentType設置為UITextContentTypeUsername,把鍵盤的keyboardType設置為:UIKeyboardTypeEmailAddress。

保證正確的UI展示

我們只要設置了兩個輸入框的textContentType,就可以將指定的信息填入指定的textfield中。但是有的時候有這種情況:在兩個輸入框內容均填寫之後,登錄按鈕才可以點擊。這種情況下,我們需要處理一下UI操作。從點擊QuickType Bar的鑰匙圖標到UITextField填充內容,你會發現沒有任何的視圖聲明周期調用。所以在視圖生命周期處理UI展示明顯是不可行的。你可以通過UITextFieldDidChange代理方法進行處理。這裡就不再贅述。

讓QuickType Bar顯示正確的信息

直接看一下第一張圖的5,那麼問題來了,QuickType Bar怎麼知道它要展示的是特定APP的賬號和密碼呢?這裡就需要將app和網頁進行關聯。下麵詳細介紹一下。

APP設置

首先我們需要對APP進行設置:

 

先打開Associated Domains,你可以直接在https://developer.apple.com/登錄,然後進入Certificates, Identifiers & Profiles,選擇你的Identifiers,點擊編輯,勾選Associated Domains

完成操作之後,按照上面的格式進行添加即可。webcredentials:網站地址。添加完成之後,APP設置完成。

伺服器設置

創建一個名為apple-app-site-association的json文件(不要添加json尾碼),然後裡面填入的信息如下:

{
 "webcredentials":{
    "apps": [ "E5334VM85F.com.example.Shiny" ]
  }
}


然後將此json文件放到功能變數名稱根目錄,或者.well-known目錄下麵,只要能夠使用如下網址能夠訪問到即可:apps內容格式為TeamId.Bundle Identifier

https://example.com/.well-known/apple-app-site-association
https://example.com/apple-app-site-association

到這裡就完成了服務端的設置。這裡是某站的訪問鏈接:https://www.bilibili.com/.well-known/apple-app-site-association。它的格式是Universal Links格式,並沒有按照但依然可以正確使用。why???。

完成以上兩步,便可實現Password AutoFill功能,並且能夠在QuickTypeBar展示。

但是按照現有的方式,只有我們在Safari登錄之後並且存儲密碼,才能在APP中使用。(如果你知道網址,可以手動的在“賬號與密碼”中添加)。現在瞭解到的做這個功能的我看到的只有B站。下麵是其簡單的原理圖:

針對第三方服務進行認證

針對第三方賬號登錄的情況,蘋果推薦使用Safari View Controller,應該是使用該Controller載入三方驗證登錄,然後通過Safari View Controller將數據進行保存吧。大部分APP如果有三方登錄,直接是喚起三方APP(如微信),然後在微信執行操作再返回自己的APP,這種方式個人理解暫時無法完成此項功能。

具體實現大家自行研究。

總結

使用此方法的確可以大大降低用戶的輸入操作成本,但是要現在Safari登錄(手機Safari和Mac Safari)就顯得比較尷尬了。Mac的也可以進行同步,但是只不過需要時間。不過如果用戶將自己的賬號密碼保存到了系統中的“賬號與密碼”中,這種操作還是十分方便的。

現階段的同步只是將Safari的登錄信息同步到了APP,據說iOS12可以將APP的信息同步到網站,而且移動APP支持註冊時填寫推薦密碼(textContentType新增了newPassword。當前只有Safari支持推薦密碼)。不過現階段還沒有升級到iOS12,感興趣的可以查看WWDC2018,裡面有對這一塊的介紹。

1.WWDC2017關於Password AutoFill的介紹

2.Implementing AutoFill Credential Provider Extensions

3.Automatic Strong Passwords and Security Code AutoFill

4.Support Universal Links


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /*其實我也搞不懂為什麼要用SQL來創建,明明SQL Server有圖形化創建資料庫多省事啊!*/USE master;​DECLARE @sqlstr nvarchar(max)/*定義一個變數*/DECLARE @database_name nvarchar(20) = 'MyDB';/*這裡輸 ...
  • 最近在MySQL中遇到分組排序查詢時,突然發現MySQL中沒有row_number() over(partition by colname)這樣的分組排序。並且由於MySQL中沒有類似於SQL Server中的row_number()、rank()、dense_rank()等排名函數,所有找到以下實 ...
  • 前言: 想把單行函數進行一個比較全面的總結,並分享給有需要的人,有不明之處還請多多指教。 SQL函數:Oracle的內置函數,包括了單行函數和多行函數,本文重點講解單行函數。單行函數又可以分為許多類,本人將常用的分為5大類: 字元函數(7個),數值函數(7個),日期函數(7個),轉換函數(3個),通 ...
  • 一.備份概述 數據安全是資料庫的生命,資料庫在使用過程中難免會遇到如:使用者的誤操作或是被惡意修改,硬體故障導致數據文件無法被訪問,自然災害導致機房在物理上的損毀。本章從備份與恢復的功能作為解決問題的切入點。在實際工作中會遇到:使用什麼樣的備份策略(比如完整備份,文件備份,差異備份,日誌備份),如何 ...
  • 數據表定義 數據表(或稱表)是資料庫最重要的組成部分之一,資料庫中以表為組織單位存儲數據,資料庫只是一個框架,數據表才是其實質內容。資料庫管理工具中可以顯示資料庫中的所有數據表,數據表是資料庫中一個非常重要的對象,是其他對象的基礎。 創建數據表 方式一:打開資料庫管理工具-》登錄-》選擇資料庫-》選 ...
  • 在目前相信大多數IT開發人員對於人工智慧+大數據並不陌生,使用的場景也越來越廣,日常開發中前端同學也逐漸接觸了更多與大數據相關的開發需求。因此對大數據知識也有必要進行一些學習理解。大數據學習資料分享群119599574 不管你是小白還是大牛,小編我都挺歡迎,今天的源碼已經上傳到群文件,不定期分享乾貨 ...
  • Android Fragment用法的講解 碎片,它的出現是為了更好展示UI的設計,讓程式更加得到充分的展示。 的出現,如微信的額主界麵包含多個 ,使得微信功能更加簡潔明瞭。 Fragment組件 是`Android 3.0 Fragment`實現更好的用戶體驗。 Fragment載入 1. 靜態加 ...
  • activity的生命周期 activity的四種狀態 running: 正在運行,處於活動狀態,用戶可以點擊屏幕,是將 處於棧頂的狀態。 paused: 暫停,處於失去焦點的時候,處於 ,可能是被如彈框一樣遮蓋,被通明的 的放置到棧頂, 一起狀態都存在。 stopped: 處於 狀態,是當前的 被 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...