Введение
Здравствуйте.Я пытаюсь разрешить своим пользователям входить в свой аккаунт YouTube через Google Sign-in.Я полностью следовал этому уроку .Кажется, как будто это работает.Но это не так.
Настройка
Я хочу, чтобы мои пользователи могли просматривать видео на YouTube с помощью кнопки.Для этого мне нужно разрешение на управление своим аккаунтом YouTube.Итак, я добавляю необходимую область, которую я нашел в документации Rate Video , предоставленной Google.Я добавляю его в AppDelegate следующим образом:
GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]
Затем я нажимаю GIDSignInButton
, который я добавил в свой контроллер представления, появляется страница входа в Google.Он запрашивает разрешение на доступ к моей учетной записи Google и управлению моей учетной записью YouTube.Отлично.
Я разрешаю ему управлять моим каналом YouTube, и он завершается.
Подтверждение
У меня есть UIViewController
, который получает информацию о зарегистрированном канале пользователя на YouTube.Например, изображение профиля, имя и т. Д. Итак, я продолжаю UIViewController
, чтобы убедиться, что я на самом деле вошел в систему, и мое приложение знает, кто я.Оно делает.Он показывает изображение профиля пользователя, имя и т. Д.
Проблема
Так что все работает довольно хорошо.Теперь я хочу, чтобы мой пользователь оценил видео нажатием кнопки.Вот функция кнопки:
@IBAction func likeButtonTapped(_ sender: Any) {
Alamofire.request("https://www.googleapis.com/youtube/v3/videos/rate", method: .post, parameters: ["id":"9T56NNzHE7A","rating":"like","key":API_KEY], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
print("Like Response - \(response)")
}
}
Вот где я получаю свою ошибку.Всякий раз, когда пользователь нажимает кнопку, я получаю следующий ответ (он напечатан в приведенном выше коде):
Like Response - SUCCESS: {
error = {
code = 401;
errors = (
{
domain = global;
location = Authorization;
locationType = header;
message = "Login Required";
reason = required;
}
);
message = "Login Required";
};
}
Я не понимаю, почему это происходит.Я вошел в систему с правильной добавленной областью.Я пытался понять это в течение долгого времени, сейчас.Я был бы очень признателен, если бы кто-нибудь мог мне помочь!Спасибо!
Полный код
Если вам нужен мой полный код о том, как я подписываю пользователя, вот оно.Как я уже сказал, я полностью следовал этому учебнику .
Делегат приложения
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GIDSignIn.sharedInstance().clientID = "xxxxxxxx.apps.googleusercontent.com"
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]
return true
}
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return GIDSignIn.sharedInstance().handle(url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])
}
@available(iOS, introduced: 8.0, deprecated: 9.0)
func application(application: UIApplication,openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: sourceApplication!, annotation: annotation)
}
SignInViewController
@IBOutlet var signInButton: GIDSignInButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
GIDSignIn.sharedInstance().uiDelegate = self
signInButton.style = .wide
}
ОБНОВЛЕНИЕ
Благодаря полезному ответу Аарона Халворсена я узнал, что мне нужно заменить мой ключ API на токен входа в Google.Вот так ...
Alamofire.request("https://www.googleapis.com/youtube/v3/videos/rate", method: .post, parameters: ["access_token":userToken, "id":"9T56NNzHE7A","rating":"like"], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
print("Like Response - \(response)")
}
Но теперь я получаю еще одну ошибку.Вот оно:
Like Response - SUCCESS: {
error = {
code = 401;
errors = (
{
domain = global;
location = Authorization;
locationType = header;
message = "Invalid Credentials";
reason = authError;
}
);
message = "Invalid Credentials";
};
}
Я проверил accessToken.Это маркер, и это не печать.Есть идеи?