我正在尝试编写执行以下操作的应用程序:
我设法将GoogleAPi设置为我的项目并启用了相关的APi。但是我不完全确定如何去获取所述信息。
任何指导或材料链接都非常有用
答案 0 :(得分:1)
尽管Google拥有相当不错的API文档,但在Swift中几乎没有任何示例,特别是在涉及Calendar API时。所以我理解你的沮丧。
首先,您很幸运,因为库可用,您无需为登录和日历API手动实施网络调用。如果您使用Cocoapods(我强烈建议)添加以下pod:
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
属性。
为了获取其他数据,如日历列表,忙/闲信息,创建事件等,您将需要像我上面提到的那样进行一些逆向工程。