2016-08-25 14 views
20

Tôi đang cố tạo tiện ích mở rộng chia sẻ cho ứng dụng yêu cầu đăng nhập vào Google từ tiện ích. Tôi đã thiết lập keychain nhóm chia sẻ và có thể viết từ ứng dụng chính và đọc mục tiêu mở rộng. Nhưng tôi không thể đăng nhập vào Google từ tiện ích mở rộng vì GIDSignIn.sharedInstance().hasAuthInKeychain() luôn trả về false.Truy xuất người dùng google từ tiện ích mở rộng ios

Có cách nào để đăng nhập vào Google từ tiện ích hay không và làm cách nào để thực hiện điều đó? Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Bạn cần phải đi với phần mở rộng hành động bạn không thể làm điều đó trong phần mở rộng chia sẻ Có một số hạn chế cho tiện ích mở rộng Vui lòng tham khảo liên kết này ---- http: //stackoverflow.com/questions/35626898/scan-functionality- không làm việc-trên-hành động-mở rộngno-camera-mở-to-scan – Sanju

+0

Hmm, tôi không chắc chắn. Điều duy nhất ở đây là cách google framework xử lý keychain. Nhưng tôi sẽ thử. Cảm ơn – sahara108

Trả lời

0

Để thực hiện việc này, bạn cần bật Keychain Sharing trong ngăn "Khả năng" của dự án. Điều này sẽ cho phép cả tiện ích và ứng dụng chính chia sẻ mật khẩu.

Tài liệu của Apple về Chia sẻ Keychain là here.

+0

Có. Tôi đã làm điều đó. Nhưng vẫn còn vấn đề – sahara108

+0

bạn có thể cung cấp bất kỳ mã mẫu nào không? – Casey

+0

Chắc chắn. Tôi sẽ đăng một số mã ngay khi tôi về nhà – sahara108

4

1. Trong Bridging-Header.h

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

2. Trong AppDelegate.swift

import Google 

Trong application:didFinishLaunchingWithOptionslaunchOptions: cấu hình các GGLContext đối tượng:

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 
} 

Sau đó, thêm một GIDSignInButton xem ứng dụng của bạn.

Cuối cùng, trong trình điều khiển chế độ xem, triển khai phương thức ủy quyền signIn:didSignInForUser: sẽ được gọi khi nút đăng nhập là tapped: khi ủy quyền ứng dụng. Thông tin đăng nhập

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

3. Chia sẻ giữa các ứng dụng/phần mở rộng

Khi bạn đăng ký trong khuôn khổ của Google sẽ phải sử dụng phương pháp iOS mẹ đẻ để thêm các thông tin mới cho iOS Keychain. Vì vậy, họ sẽ sử dụng phương pháp SecItemAdd(_:_:) sẽ thêm một hoặc nhiều mục vào một keychain.

Để truy cập cùng một mục keychain trong cả ứng dụng và tiện ích, bạn cần bật "Chia sẻ Keychain" cho cả ứng dụng và tiện ích mở rộng từ phần Xcode's Capabilities trong cài đặt dự án của bạn. Khi bạn làm điều này, Xcode có thể sẽ muốn cập nhật ID ứng dụng và hồ sơ cấp phép của bạn, vì chúng cần phản ánh khả năng mới này. Có thể bạn sẽ phải ủy quyền lại ứng dụng (Bước 2) để nhận thông tin đăng nhập vào đúng nhóm.

Apple Documentation nêu rõ:

Nếu bạn muốn mục keychain mới được chia sẻ giữa nhiều ứng dụng, bao gồm phím kSecAttrAccessGroup trong các thuộc tính từ điển. Giá trị của khóa này phải là tên của nhóm truy cập keychain mà tất cả các chương trình sẽ chia sẻ mục này thuộc về.

Khi bạn sử dụng Xcode để tạo ứng dụng, Xcode thêm một mã số nhận dạng ứng dụng vào gói ứng dụng. Keychain Dịch vụ sử dụng quyền này để cấp cho ứng dụng quyền truy cập vào các mặt hàng keychain của riêng mình .Bạn cũng có thể thêm nhóm truy cập keychain quyền truy cập vào ứng dụng và trong danh sách thuộc tính quyền lợi tệp, chỉ định một loạt nhóm truy cập keychain mà ứng dụng thuộc về.

4. Các gợi ý bổ sung từ Google mà tôi chưa đề cập ở trên.

Vui lòng xem "Google Sign-In for iOS". Đây là mẫu mã để sử dụng GIDSignIn:

  1. Nhận một tham chiếu đến GIDSignIn dụ chia sẻ: GIDSignIn *signIn = [GIDSignIn sharedInstance];
  2. Đặt OAuth 2.0 phạm vi bạn muốn yêu cầu: [signIn setScopes:[NSArray arrayWithObject:@"https://www.googleapis.com/auth/plus.login"]];
  3. Gọi [signIn setDelegate:self];
  4. Set lên phương thức ủy quyền signIn:didSignInForUser:withError:.
  5. Gọi handleURL trên phiên bản được chia sẻ từ application:openUrl: ... trong ủy quyền ứng dụng của bạn.
  6. Gọi signIn trên phiên bản được chia sẻ;
+0

Cảm ơn bạn đã trả lời. Nhưng phần 3 không liên quan. Tôi đã bật chia sẻ keychain nhưng vấn đề là GIDSignIn bằng cách nào đó không có thông tin xác thực trong phần mở rộng chia sẻ. Có anyway để ghi đè lên hành vi keychain của GIDSignIn? – sahara108

+0

Có một cách nếu bạn định sử dụng Đăng nhập Google Plus thay vì Đăng nhập bằng Google. GPPSignIn lưu thông tin đăng nhập trong keychain nhưng bạn có thể gọi .keychainName trong cả tiện ích mở rộng và ứng dụng để chỉ định cùng một nhóm bạn muốn truy xuất thông tin đăng nhập. Nhưng dù sao, để làm mới mã thông báo và cấp quyền truy cập cho tiện ích bạn cần gọi signInSilently (hoặc nó tương đương với GPPSignIn). Tôi sẽ cho bạn biết nếu tôi tìm thấy bất cứ điều gì khác cụ thể cho GIDSIgnIn. – TechSeeko

+0

Với GIDSignIn tôi có thể sử dụng 'GIDSignIn.sharedInstance(). SetValue (kGoogleClientKeychainname, forKey:" _keychainName ") // GIDSignIn._keychainName'. Nhưng nó không giúp gì cả. – sahara108

0

Không có câu trả lời cho đến bây giờ. Cuối cùng tôi viết lại thông tin đăng nhập Google bằng cách sử dụng Aerogear framework. Bây giờ tôi có thể đăng nhập từ cả mục tiêu chính và mục tiêu mở rộng. Điều này cũng khắc phục điều này google logout issue.

Các vấn đề liên quan