获取 NSError 域:“com.google.GTLJSONRPCErrorDomain"在 Swift 中获取 Google 日历事件时 [英] Getting NSError domain: "com.google.GTLJSONRPCErrorDomain" while fetching Google Calendar events in Swift

查看:24
本文介绍了获取 NSError 域:“com.google.GTLJSONRPCErrorDomain"在 Swift 中获取 Google 日历事件时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将日历事件提取到我的 iOS 应用程序.因此,为此我在 Google 开发者控制台中创建了一个项目并获得了客户端 ID ApiKey.

并使用

安装 pod<块引用>

pod 'GoogleAPIClient/Calendar', '~>1.0.2'pod 'GTMOAuth2', '~>1.1.0'吊舱谷歌/登录"

在登录到 Gmail 后,它会请求访问日历的权限,直到一切正常,但是,在获取显示以下错误的事件时.

错误 NSError 域:com.google.GTLJSONRPCErrorDomain" - 代码:401 0x0000604000646330

我的代码如下

private let scopes = [kGTLAuthScopeCalendar]私人让服务 = GTLServiceCalendar()私人让 kApiKey = "someKey"让输出 = UITextView()private let kKeychainItemName = "Google 日历 API"私人让 kClientID = "SomeID"func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError 错误: Error!) {如果(错误==零){} 别的 {print("(error.localizedDescription)")}如果用户 != nil {output.frame = view.boundsoutput.isEditable = falseoutput.contentInset = UIEdgeInsets(上:20,左:0,下:20,右:0)output.autoresizingMask = [.flexibleHeight, .flexibleWidth]view.addSubview(输出);if let auth = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychain(forName: kKeychainItemName,客户端ID:kClientID,客户秘密:无){service.authorizer = 授权}打印((用户)")service.authorizer = user.authentication.fetcherAuthorizer()获取事件()}}函数 fetchEvents() {让查询 = GTLQueryCalendar.queryForEventsList(withCalendarId: "primary")查询?.maxResults = 10查询?.singleEvents = truequery?.orderBy = kGTLCalendarOrderByStartTime服务.executeQuery((询问)!,代表:自己,didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:)))}//在 UITextView 中显示开始日期和事件摘要@objc 函数 displayResultWithTicket(票证:GTLServiceTicket,finishedWithObject 响应:GTLCalendarEvents,错误:NSError?){如果让错误=错误{showAlert(标题:错误",消息:error.localizedDescription)返回}var 事件字符串 = ""如果让事件 = response.items(), !events.isEmpty {对于事件中的事件![GTLCalendarEvent] {打印(事件)}} 别的 {print("没有找到即将发生的事件.")}}func showAlert(标题:字符串,消息:字符串){让警报 = UIAlertController(标题:标题,消息:消息,preferredStyle:UIAlertControllerStyle.alert)alert.addAction(UIAlertAction(title: "Thank You", style: UIAlertActionStyle.default, handler: nil))self.present(警报,动画:真,完成:无)}覆盖 func viewDidLoad() {super.viewDidLoad()GIDSignIn.sharedInstance().clientID = kClientIDGIDSignIn.sharedInstance().uiDelegate = selfGIDSignIn.sharedInstance().scopes = 范围GIDSignIn.sharedInstance().signIn()GIDSignIn.sharedInstance().delegate = selfservice.apiKey = kApiKey}

即使我检查了几个论坛,我也没有得到任何解决方案.

<块引用>

谁能建议我哪里出错了?

解决方案

Swift - 4

我不明白您为什么会收到该错误.我认为您没有使用最新的 pod.请参阅以下代码,我用于获取 google 日历事件.

豆荚:-pod 'GoogleAPIClientForREST/Calendar', '~> 1.2.1'

pod 'Google/SignIn', '~> 3.0.3'

导入 UIKit导入 GoogleAPIClientForREST导入谷歌登录类 ClassForCalEvent:UIViewController,GIDSignInDelegate,GIDSignInUIDelegate {让 eventArray = NSMutableArray()私有让范围 = [kGTLRAuthScopeCalendar]私人让服务 = GTLRCalendarService()覆盖 func viewDidLoad() {super.viewDidLoad()//配置谷歌登录.GIDSignIn.sharedInstance().delegate = selfGIDSignIn.sharedInstance().uiDelegate = selfGIDSignIn.sharedInstance().scopes = 范围GIDSignIn.sharedInstance().signIn()}func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,withError 错误:错误!){如果让错误=错误{showAlert(标题:身份验证错误",消息:error.localizedDescription)self.service.authorizer = nil} 别的 {self.service.authorizer = user.authentication.fetcherAuthorizer()获取事件()}}//构造一个查询并从用户日历中获取即将发生的事件列表函数 fetchEvents() {让查询 = GTLRCalendarQuery_EventsList.query(withCalendarId: "primary")查询.maxResults = 10query.timeMin = GTLRDateTime(日期:日期())query.singleEvents = truequery.orderBy = kGTLRCalendarOrderByStartTime服务.executeQuery(询问,代表:自己,didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:)))}//在 UITextView 中显示开始日期和事件摘要@objc 函数 displayResultWithTicket(票证:GTLRServiceTicket,finishedWithObject 响应:GTLRCalendar_Events,错误:NSError?){如果让错误=错误{showAlert(标题:错误",消息:error.localizedDescription)返回}var outputText = ""如果让事件 = response.items, !events.isEmpty {对于事件中的事件{让开始 = event.start!.dateTime ??event.start!.date!让 startString = DateFormatter.localizedString(从:开始.日期,日期样式:.short,时间样式:.short)让 dataDic = ["start_Time":startString , "tag":"red", "Event_Name":event.summary!]eventArray.add(dataDic)outputText += "(startString) - (event.summary!)
"打印(输出",开始字符串,事件)}UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: eventArray), forKey: "EventArray")UserDefaults.standard.synchronize()} 别的{outputText = "未找到即将发生的事件."}print("输出文本",outputText)showAlert(title: "事件同步成功!", message:"")}

I am trying to fetch Calendar events to my iOS application. So, for that I have create a project in Google developers console and got Client ID, ApiKey.

And installed pods with

pod 'GoogleAPIClient/Calendar', '~> 1.0.2'
pod 'GTMOAuth2', '~> 1.1.0'
pod 'Google/SignIn'

And after signing to Gmail, its asking permission to access Calendar, till that working fine, but, while fetching the events showing following error.

error   NSError domain: "com.google.GTLJSONRPCErrorDomain" - code: 401  0x0000604000646330

And my code is follows

private let scopes = [kGTLAuthScopeCalendar]

private let service = GTLServiceCalendar()

private let kApiKey = "someKey"

let output = UITextView()

private let kKeychainItemName = "Google Calendar API"

private let kClientID = "SomeID"

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

    if (error == nil) {


    } else {
        print("(error.localizedDescription)")
    }

    if user != nil {
        output.frame = view.bounds
        output.isEditable = false
        output.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)
        output.autoresizingMask = [.flexibleHeight, .flexibleWidth]

        view.addSubview(output);

        if let auth = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychain(
            forName: kKeychainItemName,
            clientID: kClientID,
            clientSecret: nil) {
            service.authorizer = auth
        }

        print("(user)")
        service.authorizer = user.authentication.fetcherAuthorizer()
        fetchEvents()
    }

}

func fetchEvents() {

    let query = GTLQueryCalendar.queryForEventsList(withCalendarId: "primary")

    query?.maxResults = 10
    query?.singleEvents = true
    query?.orderBy = kGTLCalendarOrderByStartTime
    service.executeQuery(
        (query)!,
        delegate: self,
        didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:)))
}

// Display the start dates and event summaries in the UITextView

@objc func displayResultWithTicket(

    ticket: GTLServiceTicket,
    finishedWithObject response : GTLCalendarEvents,
    error : NSError?) {

    if let error = error {
        showAlert(title: "Error", message: error.localizedDescription)
        return
    }

    var eventString = ""

    if let events = response.items(), !events.isEmpty {
        for event in events as! [GTLCalendarEvent] {
            print(event)
        }
    } else {
    print("No upcoming events found.")
  }
}

   func showAlert(title: String, message: String) {

    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Thank You", style: UIAlertActionStyle.default, handler: nil))
    self.present(alert, animated: true, completion: nil)

    }    

override func viewDidLoad() {
    super.viewDidLoad()

    GIDSignIn.sharedInstance().clientID = kClientID
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().scopes = scopes
    GIDSignIn.sharedInstance().signIn()
    GIDSignIn.sharedInstance().delegate = self
    service.apiKey = kApiKey
}

Even I checked few forums, I did not get any solution for this.

Can anyone suggest me where I am getting wrong?

解决方案

Swift - 4

I doesn't recognise why you are getting that error. I think you are not using latest pods. Refer following code, that I have used for fetch google calendar events.

Pods: - pod 'GoogleAPIClientForREST/Calendar', '~> 1.2.1'

pod 'Google/SignIn', '~> 3.0.3'

import UIKit
import GoogleAPIClientForREST
import GoogleSignIn
class ClassForCalEvent: UIViewController, GIDSignInDelegate, GIDSignInUIDelegate {

    let eventArray = NSMutableArray()
    private let scopes = [kGTLRAuthScopeCalendar]

    private let service = GTLRCalendarService()
    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
              withError error: Error!) {
        if let error = error {
            showAlert(title: "Authentication Error", message: error.localizedDescription)
            self.service.authorizer = nil
        } else {
                        self.service.authorizer = user.authentication.fetcherAuthorizer()
            fetchEvents()
        }
    }

    // Construct a query and get a list of upcoming events from the user calendar
    func fetchEvents() {
        let query = GTLRCalendarQuery_EventsList.query(withCalendarId: "primary")
        query.maxResults = 10
        query.timeMin = GTLRDateTime(date: Date())
        query.singleEvents = true
        query.orderBy = kGTLRCalendarOrderByStartTime
        service.executeQuery(
            query,
            delegate: self,
            didFinish: #selector(displayResultWithTicket(ticket:finishedWithObject:error:)))
    }

    // Display the start dates and event summaries in the UITextView
    @objc func displayResultWithTicket(
        ticket: GTLRServiceTicket,
        finishedWithObject response : GTLRCalendar_Events,
        error : NSError?) {

        if let error = error {
            showAlert(title: "Error", message: error.localizedDescription)
            return
        }

        var outputText = ""
        if let events = response.items, !events.isEmpty {
            for event in events {
                let start = event.start!.dateTime ?? event.start!.date!
                let startString = DateFormatter.localizedString(
                    from: start.date,
                    dateStyle: .short,
                    timeStyle: .short)

                let dataDic = ["start_Time":startString , "tag":"red", "Event_Name":event.summary!] 
                eventArray.add(dataDic)

                outputText += "(startString) - (event.summary!)
"
                print("Output ", startString , event )
            }
            UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: eventArray), forKey: "EventArray")

            UserDefaults.standard.synchronize()
        } else
        {
            outputText = "No upcoming events found."
        }
        print("Output Text",outputText)
        showAlert(title: "Event Sync Succesfully!", message:"")
    }

这篇关于获取 NSError 域:“com.google.GTLJSONRPCErrorDomain"在 Swift 中获取 Google 日历事件时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆