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

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

ただいまの
回答率

90.52%

  • Swift

    7240questions

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

  • Xcode

    4096questions

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

  • API

    1524questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

[Swift]Googleドライブ サンプルがうごかない[Xcode9]

解決済

回答 1

投稿

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

moe_1023

score 3

 前提・実現したいこと

こんにちは。
作成しているアプリケーションに、保存や保存データの取得を目的にGoogleドライブAPIを利用したいと考えています。しかし、
iOS Quickstart通りにしているつもりなのですが動作してくれません。
コードはビルドできるのですが、Sign Inボタンを押したところで
SIGABRTエラーがでてしまいます。
vi Podfileの内容は以下の通りです。
イメージ説明

 該当のソースコード

iOS Quickstart通りのものとなります。
手順としては、
pod init→pod Install→open testD.xcworkspace→イメージ説明
へplistを挿入→infoのURL TypesへREVERSED_CLIENT_IDをかきこむ→Clean+Builed→ソースコードを書き込む↓

■AppDelegate

import GoogleSignIn
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func applicationDidFinishLaunching(_ application: UIApplication) {
        // Initialize Google sign-in.
        GIDSignIn.sharedInstance().clientID = "<CLIENT_IDをいれている>"
    }

    func application(_ application: UIApplication,
                     open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication: sourceApplication,
                                                 annotation: annotation)
    }

    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
        let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String
        let annotation = options[UIApplicationOpenURLOptionsKey.annotation]
        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication: sourceApplication,
                                                 annotation: annotation)
    }

}

■ViewCOntroller

import GoogleAPIClientForREST
import GoogleSignIn
import UIKit

class ViewController: UIViewController, GIDSignInDelegate, GIDSignInUIDelegate {


    // If modifying these scopes, delete your previously saved credentials by
    // resetting the iOS simulator or uninstall the app.
    private let scopes = [kGTLRAuthScopeDriveReadonly]

    private let service = GTLRDriveService()
    let signInButton = GIDSignInButton()
    let output = UITextView()

    override func viewDidLoad() {
        super.viewDidLoad()
        print("hoge1")

        // Configure Google Sign-in.
        GIDSignIn.sharedInstance().delegate = self
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().scopes = scopes
        GIDSignIn.sharedInstance().signInSilently()

        // Add the sign-in button.
        view.addSubview(signInButton)

        // Add a UITextView to display output.
        output.frame = view.bounds
        output.isEditable = false
        output.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)
        output.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        output.isHidden = true
        view.addSubview(output);
                print("hoge2")
    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if let error = error {
                    print("hoge3")
            showAlert(title: "Authentication Error", message: error.localizedDescription)
            self.service.authorizer = nil
        } else {
                    print("hoge4")
            self.signInButton.isHidden = true
            self.output.isHidden = false
            self.service.authorizer = user.authentication.fetcherAuthorizer()
            listFiles()
        }
    }

    // List up to 10 files in Drive
    func listFiles() {
                print("hoge5")
        let query = GTLRDriveQuery_FilesList.query()
        query.pageSize = 10
        service.executeQuery(query,
                             delegate: self,
                             didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:))
        )
    }

    // Process the response and display output
    @objc func displayResultWithTicket(ticket: GTLRServiceTicket,
                                 finishedWithObject result : GTLRDrive_FileList,
                                 error : NSError?) {
                print("hoge6")
        if let error = error {
            showAlert(title: "Error", message: error.localizedDescription)
                    print("hoge7")
            return
        }

        var text = "";
        if let files = result.files, !files.isEmpty {
            text += "Files:\n"
            for file in files {
                        print("hoge8")
                text += "\(file.name!) (\(file.identifier!))\n"
            }
        } else {
                    print("hoge9")
            text += "No files found."
        }
        output.text = text
    }


    // Helper for showing an alert
    func showAlert(title : String, message: String) {
        let alert = UIAlertController(
            title: title,
            message: message,
            preferredStyle: UIAlertControllerStyle.alert
        )
        let ok = UIAlertAction(
            title: "OK",
            style: UIAlertActionStyle.default,
            handler: nil
        )
        alert.addAction(ok)
        present(alert, animated: true, completion: nil)
    }
}

 試したこと

Printしてどこに異常があるのか確かめたところ、ボタンを押した後にViewControllerのif let error = errorの部分で、showAlert()に飛ばされていることはわかりました。
それからSIGABRTエラーになってしまいます。

ほんとうにどこが悪いのかがわからず困っています。
CocoaPodを使用したのもはじめてですので、Podfileの画像もあげさせていただきました。
ひとつきになるのは、pod initの際にiOS Quickstartではplatform8.0と記載してありましたが、サンプルコードでは9.0となっていたので、上記画像のままで実行しています。もしかするとそれが通らない理由なのでしょうか?

現在のバージョンでGoogleAPIを利用しているかたがおられましたら、参考にされたサイトや方法をお教え願えないでしょうか。
初学者の質問となり、申し訳ありませんがよろしくおねがいいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

func showAlert()の中にもprint()を記載して、
どこまで実際にコードが走ってるか確認して見てはどうでしょうか?

また、showAlert()の中身に問題がないか
(見た感じないとは思いますが、)
変数に適当に値を導入して、
viewDidLoadで一度呼び出して
問題なく動くか確認して見てはどうでしょう?

自分としては、
error.localizedDescriptionがStringなのかが、
気になる所です。
それもString型の変数を用意して代入し、
printできるか確認して見てはどうですか?
(errorが出てないと確認できないかもしれませんが。。。)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/06 09:05

    error.localizedDescriptionに関しては問題ないですね。エラー出力の常套手段です。
    https://developer.apple.com/documentation/swift/error/2292912-localizeddescription

    キャンセル

  • 2018/06/07 14:40

    まず、さっそくのご回答ありがとうございました。エラー文を載せていなくてもうしわけありません。
    show Alret()ですが、アプリを起動した際に一度動作していました。最初と最後にprintを挿入したところ、

    printhogeshowAlertStart
    2018-06-07 14:23:40.651576+0900 testDrive[4045:290791] Warning: Attempt to present <UIAlertController: 0x7fb456052a00> on <testDrive.ViewController: 0x7fb45540dee0> whose view is not in the window hierarchy!
    printhogeshowAlertEnd

    なります。
    Sign Inボタンを押した際はshow Alret()は起動せず、

    2018-06-07 14:25:58.007050+0900 testDrive[4045:290791] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Your app is missing support for the following URL schemes: com>.googleusercontent.apps.<541254043248-br393m2f2edm3epandnlijiv65t3sqe9'
    *** First throw call stack:
    (
    0 CoreFoundation 0x000000010e5c21e6 __exceptionPreprocess + 294
    1 libobjc.A.dylib 0x000000010dc57031 objc_exception_throw + 48
    2 CoreFoundation 0x000000010e637975 +[NSException raise:format:] + 197
    3 testDrive 0x000000010cb745f8 -[GIDSignIn signInWithOptions:] + 242
    4 testDrive 0x000000010cb7864d -[GIDSignInButton pressed] + 240
    5 UIKit 0x000000010f155448 -[UIApplication sendAction:to:from:forEvent:] + 83
    6 UIKit 0x000000010f2d0804 -[UIControl sendAction:to:forEvent:] + 67
    7 UIKit 0x000000010f2d0b21 -[UIControl _sendActionsForEvents:withEvent:] + 450
    8 UIKit 0x000000010f2cfa69 -[UIControl touchesEnded:withEvent:] + 580
    9 UIKit 0x000000010f1ca11f -[UIWindow _sendTouchesForEvent:] + 2729
    10 UIKit 0x000000010f1cb821 -[UIWindow sendEvent:] + 4086
    11 UIKit 0x000000010f16f370 -[UIApplication sendEvent:] + 352
    12 UIKit 0x000000010fab057f __dispatchPreprocessedEventFromEventQueue + 2796
    13 UIKit 0x000000010fab3194 __handleEventQueueInternal + 5949
    14 CoreFoundation 0x000000010e564bb1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    15 CoreFoundation 0x000000010e5494af __CFRunLoopDoSources0 + 271
    16 CoreFoundation 0x000000010e548a6f __CFRunLoopRun + 1263
    17 CoreFoundation 0x000000010e54830b CFRunLoopRunSpecific + 635
    18 GraphicsServices 0x000000011236ca73 GSEventRunModal + 62
    19 UIKit 0x000000010f1540b7 UIApplicationMain + 159
    20 testDrive 0x000000010cb6ca87 main + 55
    21 libdyld.dylib 0x0000000112d6f955 start + 1
    22 ??? 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb)

    となって終了します。このエラーメッセージから調べてみます。いまだ解決していないのでもしなにかお気付きの点があればお教え願えれば幸いです。

    キャンセル

  • 2018/06/07 18:37

    whose view is not in the window hierarchy! はつまづきやすいとこですね。
    呼び出し元がUIViewControllerでなければならないとこを
    間違ったとこから呼び出しているよってことです。

    正しく設定するにはshowAlertの引数にcontroller: UIViewControllerを追加し、
    呼び出す時に、controller: selfを追加すれば改善すると思います。

    https://stackoverflow.com/questions/29257670/alertcontroller-is-not-in-the-window-hierarchy
    1個目の答えの class AlertHelper 以下を参考にしてください。

    キャンセル

  • 2018/06/09 10:16

    ご回答ありがとうございます。早速試したところ、showAlert()が正常に動作するようになりました!ありがとうございます!

    しかし、以下の
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Your app is missing support for the following URL schemes: com>.googleusercontent.apps.<541254043248-br393m2f2edm3epandnlijiv65t3sqe9'

    が動作せず、URLタイプスキーマが根本の問題であるようです。
    ターゲットプロジェクトのURLタイプにはREVERSED_CLIENT_ID(google.com...)とBundle_ID(組織名.プロジェクト名)を設定しているのですがこのようなエラーが出てしまいます。

    キャンセル

  • 2018/06/10 14:31

    質問内容がタイトルより具体的になってきたので、新たに質問します。Alertの件につきまして、解決にご尽力していただきありがとうございました!

    キャンセル

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

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

関連した質問

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

  • Swift

    7240questions

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

  • Xcode

    4096questions

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

  • API

    1524questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。