Я пытаюсь импортировать либо GoogleAPIClient, либо GoogleAPIClientForREST.
Я пытаюсь следовать руководству Google по созданию приложения QuickStart, чтобы узнать, как выполнять вызовы API с помощью Swift. Я полностью следовал этому уроку и получил этот код
import GoogleAPIClient
import GTMOAuth2
import UIKit
class ViewController: UIViewController {
private let kKeychainItemName = "Drive API"
private let kClientID = "592019061169-nmjle7sfv8i8eahplae3cvto2rsj4gev.apps.googleusercontent.com"
// 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()
let output = UITextView()
// When the view loads, create necessary subviews
// and initialize the Drive API service
override func viewDidLoad() {
super.viewDidLoad()
output.frame = view.bounds
output.editable = false
output.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)
output.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
view.addSubview(output);
if let auth = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychainForName(
kKeychainItemName,
clientID: kClientID,
clientSecret: nil) {
service.authorizer = auth
}
}
// When the view appears, ensure that the Drive API service is authorized
// and perform API calls
override func viewDidAppear(animated: Bool) {
if let authorizer = service.authorizer,
let canAuth = authorizer.canAuthorize, canAuth {
fetchFiles()
} else {
presentViewController(
createAuthController(),
animated: true,
completion: nil
)
}
}
// Construct a query to get names and IDs of 10 files using the Google Drive API
func fetchFiles() {
output.text = "Getting files..."
let query = GTLQueryDrive.queryForFilesList()
query.pageSize = 10
query.fields = "nextPageToken, files(id, name)"
service.executeQuery(
query,
delegate: self,
didFinishSelector: "displayResultWithTicket:finishedWithObject:error:"
)
}
// Parse results and display
func displayResultWithTicket(ticket : GTLServiceTicket,
finishedWithObject response : GTLDriveFileList,
error : NSError?) {
if let error = error {
showAlert("Error", message: error.localizedDescription)
return
}
var filesString = ""
if let files = response.files(), !files.isEmpty {
filesString += "Files:\n"
for file in files as! [GTLDriveFile] {
filesString += "\(file.name) (\(file.identifier))\n"
}
} else {
filesString = "No files found."
}
output.text = filesString
}
// Creates the auth controller for authorizing access to Drive API
private func createAuthController() -> GTMOAuth2ViewControllerTouch {
let scopeString = scopes.joinWithSeparator(" ")
return GTMOAuth2ViewControllerTouch(
scope: scopeString,
clientID: kClientID,
clientSecret: nil,
keychainItemName: kKeychainItemName,
delegate: self,
finishedSelector: "viewController:finishedWithAuth:error:"
)
}
// Handle completion of the authorization process, and update the Drive API
// with the new credentials.
func viewController(vc : UIViewController,
finishedWithAuth authResult : GTMOAuth2Authentication, error : NSError?) {
if let error = error {
service.authorizer = nil
showAlert("Authentication Error", message: error.localizedDescription)
return
}
service.authorizer = authResult
dismissViewControllerAnimated(true, completion: nil)
}
// Helper for showing an alert
func showAlert(title : String, message: String) {
let alert = UIAlertController(
title: title,
message: message,
preferredStyle: UIAlertControllerStyle.Alert
)
let ok = UIAlertAction(
title: "OK",
style: UIAlertActionStyle.Default,
handler: nil
)
alert.addAction(ok)
presentViewController(alert, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Моя проблема в том, что для
import GoogleAPIClient
Я получаю сообщение об ошибке "Нет такого модуля GoogleAPIClient", что мне кажется странным, так как GTMOAuth2 не выдает ошибку, хотя я думаю, что это часть того жемодуля(я новичок в этом, так что я, вероятно, убиваю терминология).
Изучив проблему, я обнаружил, что GoogleAPIClientForREST должен заменить GoogleAPIClient. В этом документе на GitHub говорится, что в коде нужно использовать GoogleAPIClientForREST вместо GoogleAPIClient, но я получаю ту же ошибку и с этим.
Тогда я подумал, что, может быть, мне удастся переустановить модули с некоторыми изменениями в руководстве Google. В учебнике говорится, чтобы выполнить этот код в терминале
$ cat << EOF > Podfile &&
> platform :ios, '7.0'
> use_frameworks!
> target 'QuickstartApp' do
> pod 'GoogleAPIClient/Drive', '~> 1.0.2'
> pod 'GTMOAuth2', '~> 1.1.0'
> end
> EOF
> pod install &&
> open QuickstartApp.xcworkspace
Поэтому я подумал, что, возможно, смогу заменить GoogleAPIClient на GoogleAPIClientForREST в коде терминала, но это вызвало у меня ту же ошибку
Как вы можете видеть на скриншоте, фреймворк находится слева, но я все еще получаю ошибку "Нет такого модуля".
Встроенные двоичные файлы и связанные структуры
Пути поиска
Я также нашел несколько предложений, которым я пытался следовать, но я не совсем понял объяснение. Тем не менее, я попытался и сделал это (если я сделал это неправильно, пожалуйста, скажите мне):
Поэтому я пытаюсь заставить работать либо GoogleAPIClient, либо GoogleAPIClientForREST. Спасибо за помощь
4 ответа
Используйте это для вашего Podfile:
platform :ios, '7.0'
use_frameworks!
target 'QuickstartApp' do
pod 'GoogleAPIClientForREST/Drive', '~> 1.1.1'
pod 'GTMOAuth2', '~> 1.1.0'
end
Измените ваш импорт на
import GoogleAPIClientForREST
Затем следуйте инструкциям здесь, чтобы перенести проект: Миграция из GoogleAPIClient в GoogleAPIClientForREST
Это в основном включает в себя изменение GTL-вызовов на GTLR-вызовы с некоторой заменой слов. Например, GTLServiceDrive
становится GTLRDriveService
,
Что касается путей поиска в фреймворке, на этом изображении показан раздел, который вам может потребоваться изменить (обратите внимание, что он работает для меня, используя настройки по умолчанию):
Пути поиска также могут быть для каждой цели. Вот изображение, показывающее цель приложения и пути поиска фреймворка:
Таким образом, я точно следовал учебному пособию Quickstart и смог заставить его работать. Я переместил GoogleAPIClientForRest в Framework Search Paths выше GTMOAuth2:
После успешного включения модуля я столкнулся с ошибкой в коде, и мне пришлось изменить эту строку, чтобы он был собран и запущен:if (result.files!.count
в if (result.files!.count > 0)
,
Конечно, теперь Google отказался от GTMOAuth2 и заменил его на GTMAppAuth, что делает это приложение бесполезным.
Хотя решение, на которое я указываю, может быть для другой библиотеки, но оно вам наверняка поможет. /questions/38100063/ne-udaetsya-ustanovit-alamofire-v-novom-proekte-xcode-net-takogo-modulya-alamofire/38100068#38100068. Пожалуйста, попробуйте и дайте мне знать, если я должен упростить это для вас.
Сначала посмотрите на Pods_QuickstartApp.framework в группе Frameworks вашего проекта Quickstart. Если он все еще красный, как на скриншоте, Xcode его не создавал. Если XCode не создавал фреймворк, XCode не может импортировать его для вас.
Cocoapods создает рабочее пространство, включающее ваш проект приложения, а также еще один проект, который собирает ваши отдельные платформы pod в более крупную структуру.
Кажется, cocoapods создали ваше рабочее пространство, и вы открыли рабочее пространство вместо проекта. Это хорошо.
Проверьте содержимое файла с именем "Podfile". Это должно соответствовать:
platform :ios, '7.0'
use_frameworks!
target 'QuickstartApp' do
pod 'GoogleAPIClient/Drive', '~> 1.0.2'
pod 'GTMOAuth2', '~> 1.1.0'
end
Если это не так, исправьте это, выйдите из Xcode, удалите файл.xcodeworkspace и затем запустите
pod install
с консоли. Это может исправить ваши зависимости, так что XCode создает платформы.
Если вы получили его для компиляции, ваши проблемы только начались. Google отказался от авторизации OAAuth от встроенного пользовательского агента.