2016-11-17 1682 views
3

我是新来的移动应用程序开发,我正在开发一个iOS应用程序。我正在使用谷歌驱动器从谷歌账户中获取文档文件到我的应用程序中。我做了这个任务,工作得很好。但现在它不工作,现在当我尝试验证它显示403错误:disallowed_useragent在我的应用程序。我GOOGLE了一下,但一些令人困惑,我读了这个stack overflow question从我发现谷歌驱动器已更新,现在我不知道我是否想要重做我的任务或不得不更新任务,只有登录才能完成它,善良任何人建议我关于403错误:disallowed_useragent

由于前请先

+0

显示你的代码或HTTP reuqest什么的? – Liam

+0

http://stackoverflow.com/questions/40233330/cannot-download-file-from-google-drive-in-ios?noredirect=1#comment68213104_40233330 –

+0

@Liam请参阅上面的链接,这是我的问题,而这项任务的一切有我在做什么 –

回答

13

继谷歌驱动API快速启动后,添加这些三线的AppDelegate.m didFinishLaunchingWithOptions代码如下所示..然后它工作正常...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSString *userAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602"; 

    // set default user agent 

    NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:userAgent,@"UserAgent", nil]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:(dictionary)]; 

    return YES; 
} 
+1

这对我有用。谢谢。 – Rachel

+1

它工作真棒。干杯! –

+1

谢谢..它的完美和简单的解决方案。 – Jan

0

谷歌正在改变其端Oauth政策,这个意图是没有原生的Web视图发起的Oauth流,我与iOS应用工作压力太大,并有同样的问题,你应该等待让他们更新SDK和文档,或者找到另一种认证方式来使用用户信息。

-1

另一种方法是使用第三方CloudRail SDK,它可以使用外部浏览器进行身份验证。这blog post涵盖了你提到的问题。

3

最近Google OAuth策略发生变化后,针对此问题有一个解决方法。

集成Google Sign并启用Google Drive API后,我可以使用Google Drive API来获取所有驱动器数据。我们只需设置GTLServiceDrive的授权人,这是在Google登录后获得的。

service.authorizer = user.authentication.fetcherAuthorizer()

下面是谷歌GIDSignIn的代码片断,然后获取日历事件。

import GoogleAPIClient 
    import GTMOAuth2 
    import UIKit 
    import GoogleSignIn 

    class ViewController: UIViewController, GIDSignInUIDelegate, GIDSignInDelegate { 

     private let kApiKey = "AIzaXXXXXXXXXXXXXXXXXXXXXXX" 

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

     override func viewDidLoad() { 
      super.viewDidLoad() 

      service.apiKey = kApiKey 

      GIDSignIn.sharedInstance().uiDelegate = self 
      GIDSignIn.sharedInstance().scopes = scopes 
      GIDSignIn.sharedInstance().signIn() 
      GIDSignIn.sharedInstance().delegate = self 
     } 


     func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { 

      if user != nil { 
       print("\(user)") 
       service.authorizer = user.authentication.fetcherAuthorizer() 
       loadDriveFiles() 
      } 
     } 

    // Construct a query and get a list of upcoming events from the user calendar 
     func loadDriveFiles() { 
      //Googly Drive fetch Query 
     } 

    }