質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

apple認証でのサインイン状態を監視したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 137

po_tato

score 67

こちらの記事を参考にして、
apple認証の実装を行いました。

一通り、ログインまでの処理は正常に行えております。

■試したいこと
1.ユーザーがアプリを起動しapple認証でログインする
2.ログイン状態でアプリをバックグラウンドにしてホーム画面の「設定」でサインアウトする
3.バックグラウンドのアプリを再度開いたときに認証処理を再度実行したい。

■現時点
1.成功
2.成功
3.認証処理が呼ばれず認証後に表示されるはずのメイン画面が表示される。

バックグラウンドから復帰したときに、addCredentialObserverメソッドが呼ばれるだろうと思ったのですが、
呼ばれていないみたいです。

ちなみに、1の後にアプリをバックグラウンド状態ではなく、一度終了させてからサインアウトして立ち上げると認証処理は実行されます。
ですが、ユーザー側の操作として■試したいことに記載した動きは必ず出てくるものだと思うので修正したいです。

なぜ期待通りに動作しないのかご指摘いただきたいです。

AppDelegate

import UIKit
import NCMB
import AuthenticationServices

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // APIキー
        let applicationKey = "~~~"
        let clientKey = "~~~"

        // APIキーの設定とSDK初期化
        NCMB.initialize(applicationKey: applicationKey, clientKey: clientKey);

        // on the initial view controller or somewhere else, check the userdefaults
        if let userID = UserDefaults.standard.string(forKey: "userID") {
            // move to main view
            print("以前にログイン済み")
            print(userID)


            self.handleASCredential(userId: userID)


        }else{
            goLoginViewConroller()
        }

        return true
    }

    //Appleのサインイン状態の確認
    private func handleASCredential(userId:String) {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        appleIDProvider.getCredentialState(forUserID: userId) { (credentialState, error) in
            switch credentialState {
            case .authorized:
                print("user remain logged in, proceed to another view")
            //self.performSegue(withIdentifier: "LoginToUserSegue", sender: nil)
            case .revoked:
                print("user logged in before but revoked")
                self.goLoginViewConroller()
            case .notFound:
                print("user haven't log in before")
                self.goLoginViewConroller()
            default:
                print("unknown state")
                self.goLoginViewConroller()
            }
        }
    }

    //サインイン状態を監視する
    private func addCredentialObserver() {
        let userID = UserDefaults.standard.string(forKey: "userID")
        let center = NotificationCenter.default
        let name = ASAuthorizationAppleIDProvider.credentialRevokedNotification
        let _ = center.addObserver(forName: name, object: nil, queue: nil) { (Notification) in
            // サインアウトして、再度サインインフローを表示するなど
            self.handleASCredential(userId: userID!)
        }
    }

    //ログインコントローラーに遷移
    func goLoginViewConroller(){

        DispatchQueue.main.async {
            //画面遷移させたい部分に以下の処理を記述
            // windowを生成
            self.window = UIWindow(frame: UIScreen.main.bounds)
            // Storyboardを指定
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            // Viewcontrollerを指定
            let loginViewController = storyboard.instantiateViewController(withIdentifier:"login")
            // rootViewControllerに入れる
            self.window?.rootViewController = loginViewController
            // 表示
            self.window?.makeKeyAndVisible()
        }
    }

}

環境 
Xcode: Version 11.3.1 (11C504)
実機 :     iPhone7 Version 13.3.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る