GoogleドライブAPIへの接続エラー(Swift 5)
ユーザーファイルのリストを表示してデバイスにダウンロードできるようにするために、アプリケーションで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日あたりの制限を超えました。
あなたが許可されていないことを意味します。プライベートユーザーデータを公開するGoogleAPIの呼び出しには、アクセストークンを含む認証ヘッダーベアラートークンを含める必要があります。
ユーザートークンと呼ばれるものを送信しているようですが、これは認証ヘッダーの設定と同じではないと思います。
デバッグの試み
注意してください、私はアップルデバイスを所有したことがありません。私はiOSや迅速な開発者ではありません。私は何年もの間、GoogleAPIとライブラリを使用してきました。
私が見ることができるものからあなたが呼んでいる
fileListTicket = driveService.executeQuery(query,
チュートリアル中、あなたは電話をフォローしています
self.service.executeQuery(query)
あなたは繊細なセットアップを変更しませんでした
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self
なぜ変更したのですか?
解決しました。助けてくれたすべての人に感謝します。私がしなければならなかったのは、ユーザー認証ステータスを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
}()
}
今、コードはあまり良く見えません、私はそれを改善する方法を考えます。しかし、これはすでに機能しています。ユーザーのファイルのリストを取得します。