普段アプリを使う時、このような画面を見たことがあります。

どう実現しているのかをいろいろ調べて自分でも実現したかったですが、いくつ注意しないといけないところを見つかりました。
最初に怒られたのはこのエラーですね
Error: The operation couldn’t be completed. No credentials available for login.
ASAuthorizationController credential request failed with error:
Error Domain=com.apple.AuthenticationServices.AuthorizationError Code=1001 "(null)"
いろいろ調べてアプリだけの実装はできないことが分かりました。
まずは自分のサイトに以下のファイルをデプロイする。
.well-known/apple-app-site-association
apple-app-site-associationの中身
{
"webcredentials": {
"apps": ["2282XXXXXX.com.company.product" ]
}
}
次はアプリのCapabilitiesのAssociated domainsに以下を追加する。
webcredentials:www.company.com
以上を設定してもすぐに使えなかった。その理由を探してみたら、Appleのドキュメントに記載してあります。
Important
Apple’s content delivery network requests the apple-app-site-association file for your domain within 24 hours. Devices check for updates approximately once per week after app installation.
import UIKit
import AuthenticationServices
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
// Don't forget to add a button in Storyboard
@IBAction func passwordButtonPressed(_ sender: UIButton) {
showPasswordPicker()
}
func showPasswordPicker() {
let passwordProvider = ASAuthorizationPasswordProvider()
let request = passwordProvider.createRequest()
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
}
}
extension ViewController: ASAuthorizationControllerDelegate {
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
if let passwordCredential = authorization.credential as? ASPasswordCredential {
let username = passwordCredential.user
let password = passwordCredential.password
print("Username: \(username)")
print("Password: \(password)")
}
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
print("Error: \(error.localizedDescription)")
}
}
extension ViewController: ASAuthorizationControllerPresentationContextProviding {
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
return self.view.window!
}
}
おまけに
- 自分のサイトと言っても持っていないならGithub Pages を利用すれば最速でサイトを作れる
- アプリのバンドルIDなどを確認するにはProvisionQLがおすすめです
最後に
.well-known/apple-app-site-association
が反映するまでのタイムラグを考慮して次の手順で実施していくといいでしょう。
- 自分のサイトに
.well-known/apple-app-site-association
をデプロイする - 設定->パスワードに自分のサイトのパスワードを登録しておく
- パスワードPicker対応のアプリをインストール