I wanted to consume the Google Photos API in Swift but at the time of writing there is no framework that does it in a simple way.
So why not share my own take?
List of implemented methods:
-
Authentication
- Auto-refresh token
- Auto-request authorization
-
Albums
- addEnrichment - Adds an enrichment at a specified position in a defined album.
- batchAddMediaItems - Adds one or more media items in a user's Google Photos library to an album.
- batchRemoveMediaItems - Removes one or more media items from a specified album.
- create - Creates an album in a user's Google Photos library.
- get - Returns the album based on the specified albumId.
- list - Lists all albums shown to a user in the Albums tab of the Google Photos app.
- share - Marks an album as shared and accessible to other users.
- unshare - Marks a previously shared album as private.
-
Shared albums
- get - Returns the album based on the specified shareToken.
- join - Joins a shared album on behalf of the Google Photos user.
- leave - Leaves a previously-joined shared album on behalf of the Google Photos user.
- list - Lists all shared albums available in the Sharing tab of the user's Google Photos app.
-
MediaItems
- batchCreate - Creates one or more media items in a user's Google Photos library.
- batchGet - Returns the list of media items for the specified media item identifiers.
- get - Returns the media item for the specified media item identifier.
- list - List all media items from a user's Google Photos library.
- search - Searches for media items in a user's Google Photos library.
To run the example project, clone the repo, and run pod install
from the Example directory first.
To install through CocoaPods add pod 'GPhotos'
to your Podfile and run pod install
.
-
Setup a OAuth 2.0 client ID as described here, download the
.plist
file and add it to the project. -
In
AppDelegate.swift
configure GPhotos when the application finishes launching
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
var config = Config()
config.printLogs = false
GPhotos.initialize(with: config)
// Other configs
}
- To handle redirects during the authorization process add or edit the following method.
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let gphotosHandled = GPhotos.continueAuthorizationFlow(with: url)
// other app links
return gphotosHandled
}
-
GPhotos.isAuthorized
will return true if a user is already authorized. -
GPhotos.logout()
clears the session information and invalidates any token saved. -
GPhotos.authorize(with scopes:)
by default starts the authentication process withopenid
scope. Will be executed only if there are new scopes. As per Google recommendation, you should gradually add scopes when you need to use them, not on the first run. The method will return a boolean indicating the success status, and an error if any. -
GPhotos.switchAccount(with scopes:)
by default starts the authentication process withopenid
scope. Will ignore current authentication scopes. The method will return a boolean indicating the success status, and an error if any.
Save an instance of GPhotosApi
to be able to use pagination between different features.
create(album:)
returns the newly created album object
list()
loads sequential pages of items every time it is called.reloadList()
loads always the first page.
get(id:)
returns theAlbum
for the provided id.
share(id:options:)
shares an album with the provided id with possible options and returns theShareInfo
of the album.unshare(id:)
returns a boolean indicating the success status.
addEnrichment(id:enrichment:position)
Adding or removing items from an album only requires the set of media items ids.
addMediaItems(id:mediaIds:)
removeMediaItems(id:mediaIds:)
list()
andreloadList()
have the same use as in Albums
get(id:)
returns theMediaItem
for the provided id.getBatch(ids:)
returns theMediaItems
for the provided array of ids.
search(with request:)
loads sequential pages of items every time it is called. Results are based on filters in the request. If no filters are applied it will return the same results aslist()
reloadSearch(with request:)
loads always the first page.
upload(images:)
takes an array ofUIImage
and uploads them one by one to the user's library. These uploads will count towards storage in the user's Google Account.
get(token:)
returns the details of the shared album.
join(token:)
andleave(token:)
take the sharing token as argument and either join or leave the shared album if the token is correct.
list()
andreloadList()
have the same use as in Albums
GPhotos is available under the MIT license. See the LICENSE file for more info.