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

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

ただいまの
回答率

91.06%

  • Swift

    5898questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3377questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • JSON

    896questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Firebase

    386questions

    Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Firebase.jsonを応答させる方法。

解決済

回答 1

投稿 編集

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

tanaka_atsushi

score 17

Swift 4
Xcode 9.1

howto動画で勉強しています。
(サインイン→ホーム画面に遷移する流れの内容)

SignInViewController 、RegisterUserViewController 、HomePageViewController を作り、
howto動画の作成者と全く同じコードを書いて真似ています。
(main.Storybord上も真似てコネクト済み。)

ですが、いざRUNしてシミュレーター上でサインインをクリックしても、
作成したホーム画面(HomepageviewController)に遷移しません。

作成者に聞くと、JSONが応答していないからと回答がありました。
(本人がFirebaseを使っているかは不明)

私はJSONというものを知らなかったので、
Firebaseで初めてのデプロイを見ながら一応最後まで設定し、Deploy complete!しました。
(index.htmlはよくわからなかったので未設定)

フォルダ構成
myApp/
├ .firebaserc  ← initコマンド時に自動生成された
├ firebase.json ← initコマンド時に自動生成された
└ public/
└ index.html

このフォルダ構成がホームディレクトリ内に自動生成されたので、

firebase.jsonのみ、

{
"hosting": {
"public": "public"
}
}

に変更しました。

そして再度RUNしましたが、
ホーム画面(HomepageviewController)に遷移しませんでした。

Firebaseの場合のJSONは、このJSONで間違いないのでしょうか?
現在応答させるには設定が足りない状況なので、
方法をご存知の方がいらっしゃいましたら、
教えて頂きたいです。

よろしくお願いします。

import UIKit

class SignInViewController: UIViewController {


    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var userPasswordTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func signInButtonTapped(_ sender: Any) {
        print ("サインインボタンをタップ")
        //意味 Sign in button tapped 。

        // Read values from text fields
        let userName = userNameTextField.text
        let userPassword = userPasswordTextField.text

        // Check if required fields are not empty
        if (userName?.isEmpty)! || (userPassword?.isEmpty)!
        {
        //Display alent message here
        print("User name \(String(describing: userName)) or password \(String(describing: userPassword)) is empty")

        displayMessage(userMessage: "必須フィールドの1つが見つかりません")
        //意味 One of the required fields is missing 。

        return

    }

        //Create Activity Indicator
        let myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle:
            UIActivityIndicatorViewStyle.gray)

        // Position Activity Indicator in the center of the main view
        myActivityIndicator.center = view.center

        /* If needed, you can prevent Activity Indicator from hiding when
         stopAnimating() is called*/
        myActivityIndicator.hidesWhenStopped = false

        //Start Activity Indicator
        myActivityIndicator.startAnimating()

        view.addSubview(myActivityIndicator)

        // Send HTTP Request to peform Sign in
        let myUrl = URL(string: "http//localhost:8080/api/authentication")
        var request = URLRequest(url:myUrl!)

        request.httpMethod = "POST"// Compose a query string
        request.addValue("application/json", forHTTPHeaderField:  "content-type")
        request.addValue("application/json", forHTTPHeaderField:  "Accept")

        let postString = ["userName": userName!, "userPassword": userPassword!] as [String: String]

        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: postString,options: .prettyPrinted)

        }

        catch let error {
             print(error.localizedDescription)
          displayMessage(userMessage: "申し訳ありません。何かが間違っているか、現在エラーが発生しています。")
            // 意味 Someting went wrong... 。
          return

        }

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            self.removeActivityIndicator(activityIndicator: myActivityIndicator)

            if error != nil

        {
                self.displayMessage(userMessage: "この要求を正常に実行できませんでした。もう一度お試しください")
                //意味 Could not successfully perform this request. Please try again later 。
                print("error=\(String(describing: error))")
                return

        }

            //Let's convert response sent from a server side code to a NSDictionary object:
            do {
                let json = try JSONSerialization.jsonObject(with: data!,options: .mutableContainers) as? NSDictionary

                if let parseJSON = json {

                // Now we can access value of first Name by its key
                let accessToken = parseJSON["token"] as? String
                let userId = parseJSON["id"] as? String
                    print("Access token: \(String(describing: accessToken!))")


                if (accessToken?.isEmpty)!

        {

            // Display an Alent dialog with a friendly error message
                    self.displayMessage(userMessage: "この要求を正常に実行できませんでした。もう一度お試しください")
                    // 意味 Could not successfully perform this request. Please try again later 。
                    return
                    }

                    DispatchQueue.main.async
                        {
                let homePage =
                   self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomePageViewController
                    let appDelegate = UIApplication.shared.delegate
                    appDelegate?.window??.rootViewController = homePage

                    }

                } else {
                    //Display an Alent dialog with a friendly error message
                    self.displayMessage(userMessage: "この要求を正常に実行できませんでした。もう一度お試しください")
                    //意味 Could not successfully perform this request. please try again later 。
                }

            } catch {

                self.removeActivityIndicator(activityIndicator: myActivityIndicator)

                // Display an Alent dialog with a friendly error message
                self.displayMessage(userMessage: "この要求を正常に実行できませんでした。もう一度お試しください")
                //意味 Could not successfully perform this request. please try again later 。

                print(error)
            }


        }
            task.resume()

    }

    @IBAction func registerNewAccountButtonTapped(_ sender: Any) {
        print ("登録アカウントボタンをタップ")
        //意味 Register account button tapped 。

    //動画ではnewが無かったので無い↑

    let registerViewController =
        self.storyboard?.instantiateViewController(withIdentifier: "RegisterUserViewController") as!
        RegisterUserViewController

        self.present(registerViewController, animated: true)
}

    func displayMessage(userMessage:String) -> Void {
        DispatchQueue.main.async
            {
                let alertController = UIAlertController(title: "Alent", message:userMessage, preferredStyle: .alert)

                let OKAction = UIAlertAction(title: "OK", style: .default)
                {  (action:UIAlertAction!) in
                    // Code in this block will trigger when OK button tapped.
                    print("OKボタンをタップ")
                    //意味 Ok button tapped 。
                    DispatchQueue.main.async
                        {
                            self.dismiss(animated: true, completion: nil)
                    }
                }
                alertController.addAction(OKAction)
                self.present(alertController, animated: true, completion:nil)
        }
    }

    func removeActivityIndicator(activityIndicator: UIActivityIndicatorView)
    {
        DispatchQueue.main.async
            {
                activityIndicator.stopAnimating()
                activityIndicator.removeFromSuperview()
        }
    }


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

調べたところ、まずiOS でカスタム認証システムを使用して Firebase 認証を行う事と、
サーバーに Firebase Admin SDK を追加する事が必要だったので、
そちらから実装していきたいと思います。
閲覧していただいた皆様、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

関連した質問

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

  • Swift

    5898questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3377questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • JSON

    896questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Firebase

    386questions

    Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。