2016-08-25 5 views
20

拡張機能からGoogleにログインする必要がある自分のアプリケーションの共有拡張を作成しようとしています。共有グループのキーチェーンをセットアップして、メインアプリケーションから書き込んで拡張ターゲットを読むことができました。 GIDSignIn.sharedInstance().hasAuthInKeychain()は常にfalseを返すため、私は拡張機能からGoogleにログインできません。iosの拡張機能からgoogleユーザーを取得する

拡張機能からGoogleにログインする方法はありますか?どうすればよいですか?どんな助けもありがとう。

+0

あなたはShare拡張機能ではできないアクション拡張機能が必要です。拡張機能にはいくつかの制限があります。このリンクを参照してください---- http://stackoverflow.com/questions/35626898/scan-functionality-動作していないときの動作 - 拡張 - カメラ - スキャンの開始 – Sanju

+0

うーん、わからない。ここで唯一のことは、Googleのフレームワークがキーチェーンを処理する方法です。しかし、私はそれを試してみましょう。ありがとう – sahara108

答えて

0

これを行うには、プロジェクトの機能枠でKeychain Sharingを有効にする必要があります。これにより、拡張機能とメインアプリの両方でパスワードを共有できます。

キーチェーン共有に関するアップルのマニュアルはhereです。 application:didFinishLaunchingWithOptionslaunchOptions:

+0

はい。私はすでにそれをしました。しかし、まだ問題 – sahara108

+0

すべてのサンプルコードを提供できますか? – Casey

+0

私は家に帰るとすぐにいくつかのコードを投稿します – sahara108

4

ブリッジ-がheader.hにおいて

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

AppDelegate.swift

2.
import Google 

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:のときに呼び出されます。アプリケーション/拡張

あなたがサインインすると、GoogleのフレームワークiOSのキーホルダーに新しい資格情報を追加するためにネイティブのiOSメソッドを使用する必要があります間

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

3.共有資格情報。したがって、彼らはキーチェーンに1つまたは複数の項目を追加する方法を使用しています(SecItemAdd(_:_:))。

アプリと拡張機能の両方で同じキーチェーン項目にアクセスするには、プロジェクト設定のXcode's Capabilitiesセクションのアプリと拡張機能の両方で「キーチェーン共有」を有効にする必要があります。これを行うと、Xcodeはこの新しい機能を反映する必要があるため、アプリIDとプロビジョニングプロファイルを更新したいと考えています。 (ステップ2)のアプリケーションを再認証して、適切なグループに資格情報を取得する必要があります。

Apple Documentationは明確に述べている:

を使用すると、複数の のアプリケーション間で共有するための新しいキーチェーン項目をしたい場合は、属性 辞書でkSecAttrAccessGroupキーが含まれます。このキーの値は、 このアイテムを共有するすべてのプログラムが属するキーチェーンの名前である必要があります。 。

アプリケーションを作成するためのXcodeを使用する場合は、Xcodeのは、アプリケーションバンドルに アプリケーション識別子資格を追加します。キーチェーン サービスはこの資格を使用して、 独自のキーチェーンアイテムへのアプリケーションアクセスを許可します。キーチェーンアクセスグループ 資格をアプリケーションに追加し、資格プロパティーリスト ファイルに アプリケーションが属するキーチェーンアクセスグループの配列を指定することもできます。

4.私が上記で言及していない追加のヒント。

"Google Sign-In for iOS"を参照してください。インスタンスを共有GIDSignInへの参照を取得します

  1. :ここ はGIDSignInを使用するためのサンプルコードです[signIn setScopes:[NSArray arrayWithObject:@"https://www.googleapis.com/auth/plus.login"]];
  2. コール[signIn setDelegate:self];
  3. セット:GIDSignIn *signIn = [GIDSignIn sharedInstance];
  4. はあなたが要求したいOAuth 2.0のスコープを設定します。デリゲートメソッドsignIn:didSignInForUser:withError:
  5. ...の共有インスタンスのhandleURLからアプリデリゲートに電話してください。
  6. 共有インスタンスのsignInを呼び出します。
+0

あなたの答えをありがとう。しかし、セクション3は関係ありません。私はkeychainの共有を有効にしましたが、問題はGIDSignInが共有拡張の認証情報を持っていないことです。とにかくGIDSignInのキーチェーンの動作を上書きすることはできますか? – sahara108

+0

Googleログインの代わりにGoogle Plusログインを使用する方法があります。 GPPSignInは、キーチェーンに資格情報を保存しますが、拡張機能とアプリケーションの両方で.keychainNameを呼び出して、資格情報を取得するグループと同じグループを指定することができます。とにかく、トークンをリフレッシュして、signInSilently(またはGPPSignInに相当する)を呼び出す必要がある拡張機能へのアクセスを与えます。私はGIDSIgnInに特有のものがあればお知らせします。 – TechSeeko

+0

GIDSignInでは、この 'GIDSignIn.sharedInstance()。setValue(kGoogleClientKeychainname、forKey:" _keychainName ")// GIDSignIn._keychainName'を使用できます。しかし、それはまったく役に立たない。 – sahara108

0

これまでの回答はありません。私は最終的にAerogear frameworkを使ってGoogleのログイン情報を書き換えます。これで、メインターゲットと拡張ターゲットの両方からログインできるようになりました。これもこのgoogle logout issueを修正します。

関連する問題