Получить пользователя Google из расширения IOS

Я пытаюсь создать расширение общего доступа для своего приложения, которое требует входа в Google из расширения. Я настроил брелок для группы совместного использования и могу писать из основного приложения и читать цель расширения. Но я не могу войти в Google с расширением, потому что GIDSignIn.sharedInstance().hasAuthInKeychain() всегда возвращает ложь.

Есть ли способ войти в Google с расширением и как мне это сделать? Любая помощь будет оценена.

3 ответа

1. В Bridging-Header.h

import <GoogleSignIn/GoogleSignIn.h>
import <Google/Core.h>

2. В AppDelegate.swift

import Google

В application:didFinishLaunchingWithOptionslaunchOptions: настроить GGLContext объект:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
var configureError: NSError?
        GGLContext.sharedInstance().configureWithError(&configureError)
        assert(configureError == nil, "Error configuring Google services: \(configureError)")
        GIDSignIn.sharedInstance().clientID = "client id"
        GIDSignIn.sharedInstance.shouldFetchBasicProfile = true
        GIDSignIn.sharedInstance().delegate = self
}

Затем добавьте GIDSignInButton просмотр вашего приложения.

Наконец, в контроллере представления реализуйте signIn:didSignInForUser: метод делегата, который будет вызван, когда кнопка входа tapped: при авторизации приложения.

- (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
           withError:(NSError *)error {
  // Perform any operations on signed in user here.
  // ...
}

3. Обмен учетными данными между приложениями / расширениями

При входе в Google Framework придется использовать собственные методы iOS, чтобы добавить новые учетные данные в связку ключей iOS. Таким образом, они будут использовать SecItemAdd(_:_:) метод, который добавит один или несколько элементов в цепочку для ключей.

Чтобы получить доступ к одному и тому же элементу цепочки для ключей как в приложении, так и в расширении, вам необходимо включить "Совместное использование цепочки для ключей" как для приложения, так и для расширения в разделе "Возможности XCode " в настройках вашего проекта. Когда вы сделаете это, Xcode, вероятно, захочет обновить идентификатор вашего приложения и профили обеспечения, поскольку они должны отражать эту новую возможность. Вам, вероятно, придется повторно авторизовать приложение (шаг 2), чтобы ввести учетные данные в нужную группу.

Документация Apple четко гласит:

Если вы хотите, чтобы новый элемент цепочки для ключей был общим для нескольких приложений, включите ключ kSecAttrAccessGroup в словарь атрибутов. Значение этого ключа должно быть именем группы доступа цепочки для ключей, к которой принадлежат все программы, которые будут совместно использовать этот элемент.

Когда вы используете XCode для создания приложения, XCode добавляет право идентификатора приложения в комплект приложения. Keychain Services использует это право для предоставления приложению доступа к своим собственным элементам цепочки для ключей. Вы также можете добавить разрешение keychain-access-groups к приложению и в файле списка свойств полномочий указать массив групп доступа Keychain, к которым принадлежит приложение.

4. Дополнительные подсказки от Google, которые я не упомянул выше.

Пожалуйста, смотрите "Вход в Google для iOS". Вот пример кода для использования GIDSignIn:

  1. Получить ссылку на GIDSignIn общий экземпляр: GIDSignIn *signIn = [GIDSignIn sharedInstance];
  2. Установите области OAuth 2.0, которые вы хотите запросить: [signIn setScopes:[NSArray arrayWithObject:@"https://www.googleapis.com/auth/plus.login"]];
  3. Вызов [signIn setDelegate:self];
  4. Установить метод делегата signIn:didSignInForUser:withError:,
  5. Вызов handleURL на общем экземпляре из application:openUrl: ... в вашем приложении делегат.
  6. Вызов signIn на общем экземпляре;

Нет ответа до сих пор. Наконец-то я переписал логин Google с помощью фреймворка Aerogear. Теперь я могу войти как из основной цели, так и из расширения. Это также решает эту проблему выхода из Google.

Для этого нужно включить Keychain Sharing в панели "Возможности" вашего проекта. Это позволит как расширению, так и основному приложению совместно использовать пароль.

Документация Apple по обмену ключами находится здесь.

Другие вопросы по тегам