GoogleドライブAPIへの接続エラー(Swift 5)

Sep 15 2020

ユーザーファイルのリストを表示してデバイスにダウンロードできるようにするために、アプリケーションでGoogle DriveAPIに接続したいと思います。私はこのサンプルに従っていますGoogleドライブをiOSアプリに統合する

Google SDKに接続し、ユーザーを正常に承認しました。ただし、ファイルのリストを取得することはできません。次のエラーが発生し続けます。

「認証されていない使用の1日あたりの制限を超えました。継続して使用するにはサインアップが必要です。」

Googleコンソールでアプリと設定を何度もチェックし、すべてを段階的に実行しましたが、それでもこの問題を解決できませんでした。誰かが同じ問題を経験しましたか?

私のコードとスクリーンショット:

//class AppDelegate...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GIDSignIn.sharedInstance().clientID = "Me client ID"
        return true
}

//class myVC: GIDSignInDelegate...
override func viewDidLoad() {
        super.viewDidLoad() 
        GIDSignIn.sharedInstance().presentingViewController = self
        GIDSignIn.sharedInstance().delegate = self
        GIDSignIn.sharedInstance().scopes = [kGTLRAuthScopeDrive]
        GIDSignIn.sharedInstance().restorePreviousSignIn()
}

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if let error = error {
            print("Google autorization error: \(error.localizedDescription)")
            return
        }
        guard let token = user.authentication.accessToken else { return }
    SourceAuthorizationStateManager.shared.addAuthorizedSource(.googleDrive)
    
    let fullName = user.profile.name
    print("Google authorization successful. User name: \(fullName ?? "Error: no user name")\nUser token: \(token)")
}

//class GoogleDriveFileListSource...
private var fileListTicket: GTLRServiceTicket?
var files: [FileModelProtocol] {
        guard let files = fileList?.files else { return [] }
        return files.map { GoogleDriveFileModel($0) }
}

lazy var driveService: GTLRDriveService = {
    let service = GTLRDriveService()
    service.shouldFetchNextPages = true
    service.isRetryEnabled = true
    return service
}()

func fetchFileList(path: String?, _ completion: @escaping () -> Void) {
        let query = GTLRDriveQuery_FilesList.query()
        query.fields = "kind,nextPageToken,files(mimeType,id,kind,name,webViewLink,thumbnailLink,trashed)"
        
        fileListTicket = driveService.executeQuery(query,
                                                   completionHandler: { [weak self] (_, resultObject, error) in
                                                    if let error = error {
                                                        debugPrint("driveService.executeQuery error: \(error.localizedDescription)")
                                                        return
                                                    }
                                                    
                                                    guard let self = self,
                                                        let fileList = resultObject as? GTLRDrive_FileList else { return }
                                                    
                                                    self.fileList = fileList
                                                    self.fileListTicket = nil
                                                    
                                                    completion()
     })
}

回答

1 DaImTo Sep 15 2020 at 14:54

「認証されていない使用の1日あたりの制限を超えました。

あなたが許可されていないことを意味します。プライベートユーザーデータを公開するGoogleAPIの呼び出しには、アクセストークンを含む認証ヘッダーベアラートークンを含める必要があります。

ユーザートークンと呼ばれるものを送信しているようですが、これは認証ヘッダーの設定と同じではないと思います。

デバッグの試み

注意してください、私はアップルデバイスを所有したことがありません。私はiOSや迅速な開発者ではありません。私は何年もの間、GoogleAPIとライブラリを使用してきました。

私が見ることができるものからあなたが呼んでいる

fileListTicket = driveService.executeQuery(query,

チュートリアル中、あなたは電話をフォローしています

self.service.executeQuery(query)

あなたは繊細なセットアップを変更しませんでした

GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self

なぜ変更したのですか?

1 VyacheslavBakinkskiy Sep 16 2020 at 17:31

解決しました。助けてくれたすべての人に感謝します。私がしなければならなかったのは、ユーザー認証ステータスをdriveServiceに転送し、GTMSessionFetcherをファイルにインポートすることだけでした。

var googleUser: GIDGoogleUser?
class myVC: GIDSignInDelegate {
...
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if let error = error {
            print("Google autorization error: \(error.localizedDescription)")
            return
        }
        guard let token = user.authentication.accessToken else { return }
    SourceAuthorizationStateManager.shared.addAuthorizedSource(.googleDrive)
    googleUser = user   //Here I have saved the current user

    let fullName = user.profile.name
    print("Google authorization successful. User name: \(fullName ?? "Error: no user name")\nUser token: \(token)")
}
}

class GoogleDriveFileListSource {
...
lazy var driveService: GTLRDriveService = {
    let service = GTLRDriveService()
    if let user = googleUser {
    service.authorizer = user.authentication.fetcherAuthorizer() //Here I passed the status
    }
    service.shouldFetchNextPages = true
    service.isRetryEnabled = true
    return service
}()
}

今、コードはあまり良く見えません、私はそれを改善する方法を考えます。しかし、これはすでに機能しています。ユーザーのファイルのリストを取得します。