Получение календаря Google в Swift - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь закодировать приложение, которое выполняет следующее:

  • Извлекает события календаря Google
  • Использует Местоположение в событии Google и сохраняет его локально

Мне удалось настроить GoogleAPi для моего проекта и включить соответствующие APi. Однако я не совсем уверен, как обойти эту информацию.

Любые указания или ссылки на материалы будут чрезвычайно полезны

1 Ответ

0 голосов
/ 08 мая 2018

Хотя Google имеет довольно хорошую документацию по API, в Swift практически нет примеров, особенно когда речь идет о Calendar API. Так что я понимаю ваше разочарование.

Прежде всего, вам повезло, потому что библиотеки доступны, и вам не нужно вручную реализовывать сетевые вызовы для входа и API календаря. Если вы используете Cocoapods (я настоятельно рекомендую), добавьте следующие капсулы:

target 'YourApp' do
    pod 'GoogleAPIClientForREST/Calendar'
    pod 'GoogleSignIn'
end

Если вы не используете Cocoapods, вы можете найти их на github. Названия библиотек говорят сами за себя. GoogleAPIClientForREST/Calendar написано в Objective-C, и, по крайней мере, в моем случае мне пришлось создать файл заголовка моста со следующим импортом:

#ifndef MyApp_Bridging_Header_h
#define MyApp_Bridging_Header_h

#import <GTMSessionFetcher/GTMSessionFetcher.h>
#import <GTMSessionFetcher/GTMSessionFetcherService.h>

#endif 

Чтобы библиотека календарей могла получать календари, события и т. Д., Вам необходимо войти в систему. Итак, сначала вам нужно реализовать логин. Убедитесь, что вы правильно настроили службу входа в Google. Не забудьте установить прицелы.

import GoogleSignIn

func initGoogle() {
    // Initialize sign-in
    var configureError: NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(String(describing: configureError))")
    GIDSignIn.sharedInstance().clientID = "your_client_id_string"
    GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/calendar"]
    GIDSignIn.sharedInstance().delegate = self
}

Реализуйте GIDSignInDelegate методы и соответственно обрабатывайте их обратные вызовы (потому что вы можете получать календари только тогда, когда пользователь вошел в систему). Чтобы запустить поток входа в систему:

GIDSignIn.sharedInstance().signIn()

Предполагая, что все конфигурации были правильными, вы сможете успешно войти в систему.

Если у вас есть сеанс Google, загрузите данные календаря. Именно здесь произойдет много обратного проектирования, потому что библиотека календаря не очень хорошо документирована. Обратитесь к справочнику API, чтобы понять взаимосвязи между различными моделями: https://developers.google.com/calendar/v3/reference/

Но прежде чем вы получите данные календаря, вам нужно создать объект службы календаря:

import GoogleAPIClientForREST
import GoogleSignIn

/// Creates calendar service with current authentication
fileprivate lazy var calendarService: GTLRCalendarService? = {
    let service = GTLRCalendarService()
    // Have the service object set tickets to fetch consecutive pages
    // of the feed so we do not need to manually fetch them
    service.shouldFetchNextPages = true
    // Have the service object set tickets to retry temporary error conditions
    // automatically
    service.isRetryEnabled = true
    service.maxRetryInterval = 15

    guard let currentUser = GIDSignIn.sharedInstance().currentUser,
        let authentication = currentUser.authentication else {
            return nil
    }

    service.authorizer = authentication.fetcherAuthorizer()
    return service
}()

И, наконец, получить события для календаря ID:

// you will probably want to add a completion handler here
func getEvents(for calendarId: String) {
    guard let service = self.calendarService else {
        return
    }

    // You can pass start and end dates with function parameters
    let startDateTime = GTLRDateTime(date: Calendar.current.startOfDay(for: Date()))
    let endDateTime = GTLRDateTime(date: Date().addingTimeInterval(60*60*24))

    let eventsListQuery = GTLRCalendarQuery_EventsList.query(withCalendarId: calendarId)
    eventsListQuery.timeMin = startDateTime
    eventsListQuery.timeMax = endDateTime

    _ = service.executeQuery(eventsListQuery, completionHandler: { (ticket, result, error) in
        guard error == nil, let items = (result as? GTLRCalendar_Events)?.items else {
            return
        }

        if items.count > 0 {
            print(items)
            // Do stuff with your events
        } else {
            // No events
        }
    })
}

GTLRCalendar_Event среди прочих имеет location свойство.

Чтобы получить другие данные, такие как список календаря, информация о занятости, создать события и т. Д., Вам придется выполнить немного обратного инжиниринга, как я упоминал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...