2015-06-16 14 views
8

Tôi đang sử dụng Google Sign-In for iOS và khi sử dụng trình mô phỏng hoạt động tốt vì không có ứng dụng google được cài đặt và người dùng tìm nạp. với một số tài khoản đã đăng ký bên trong chúng) cho xử lý đăng nhập Sau đó, khi quay trở lại trên các mã ứng dụng không nhập vào chức năng này:.Không tìm nạp người dùng Google khi xử lý đăng nhập bằng ứng dụng Google khác bằng GIDSignIn

-(void)signIn:(GIDSignIn *) signIn 
    didSignInForUser:(GIDGoogleUser *) 
    user withError:(NSError *) error 

Bất cứ ai có thể giúp tôi tôi không thể sử dụng chức năng khác để đăng nhập tôi phải gọi [[GIDSignIn sharedIstance] signIn] và chức năng này phát hiện xem có ứng dụng google khác được cài đặt và tự động mở một ứng dụng google hoặc Webview khác không.

+0

Có may mắn không? Tôi không thể làm việc này .. – Chicken

+0

Tôi cũng đang gặp vấn đề tương tự, nếu bạn có câu trả lời đó, vui lòng cho tôi biết cách giải quyết. –

Trả lời

1
import UIKit 
import GoogleSignIn 
import Google 

class ViewController: UIViewController,GIDSignInUIDelegate, GIDSignInDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let gidSingIn = GIDSignIn() 

    GIDSignIn.sharedInstance().uiDelegate = self 
     gidSingIn.delegate = self 
    GIDSignIn.sharedInstance().delegate = self 

    var configureError:NSError? 
    GGLContext.sharedInstance().configureWithError(&configureError) 

    assert(configureError == nil, "Error configuring Google services: \(configureError)") 


    let button = GIDSignInButton(frame:CGRectMake(0,0,30, 200)) 
     button.center = self.view.center 
     button.backgroundColor = UIColor.blueColor() 
     self.view.addSubview(button) 



    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func signInGoogle(sender: AnyObject) { 

    print("pressed") 

} 

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, 
      withError error: NSError!) { 
    if (error == nil) { 
     // Perform any operations on signed in user here. 
     print(user.userID)    // For client-side use only! 
     print(user.authentication.idToken) // Safe to send to the server 
     print(user.profile.name) 
     print(user.profile.givenName) 
     print(user.profile.familyName) 
     print(user.profile.email) 
     print(user.authentication.accessToken) 
     print(user.profile) 
    } else { 
     print("\(error.localizedDescription)") 
    } 
} 
func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!, 
      withError error: NSError!) { 
} 

} // đây là đăng nhập bằng tài khoản gmail không dành cho googleplus. chỉ cần sao chép và quá khứ trong bộ điều khiển của bạn. và thêm func sau trong appdelegate Class

func application(application: UIApplication, 
       openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { 
    var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication!,UIApplicationOpenURLOptionsAnnotationKey: annotation] 
    return GIDSignIn.sharedInstance().handleURL(url, 
               sourceApplication: sourceApplication, 
               annotation: annotation) 
} 
4

Tôi đã giải quyết vấn đề bằng cách đặt đúng một số thuộc tính cho GIDSignIn Instance. Ví dụ:

GIDSignIn*sigNIn=[GIDSignIn sharedInstance]; 
[sigNIn setDelegate:self]; 
[sigNIn setUiDelegate:self]; 
sigNIn.shouldFetchBasicProfile = YES; 
sigNIn.allowsSignInWithBrowser = NO; 
sigNIn.allowsSignInWithWebView = YES; 
sigNIn.scopes = @[@"https://www.googleapis.com/auth/plus.login",@"https://www.googleapis.com/auth/userinfo.email",@"https://www.googleapis.com/auth/userinfo.profile"]; 
sigNIn.clientID [email protected]"xxxxxxxxxxxxxxxxxxxxxxxgai.apps.googleusercontent.com"; 
[sigNIn signIn]; 
2

Tôi sẽ giả sử bạn đang sử dụng GIDSignin với máy chủ của riêng bạn, yêu cầu bạn bao gồm serverclientID với GIDSignin của bạn. Điều này sẽ buộc ứng dụng của tôi cố gắng sử dụng youtube hoặc google plus để đăng nhập thay vì mở một chế độ xem web hoặc thậm chí là một trình duyệt. Điều này sẽ trả về GIDSigninError = -1 "một lỗi có khả năng phục hồi .." và sẽ không cho phép người dùng đăng nhập.

Cách tôi giải quyết điều này bằng cách chặn URL từ google hoặc youtube trước khi chúng được mở bằng cách ghi đè lên UIApplication's Hàm canOpenURL. Tôi đã làm điều này bằng cách subclassing UIApplication và thực hiện canOpenURL như thế này:

@interface MyApp : UIApplication 
- (BOOL)canOpenURL:(NSURL *)url; 
@end 

@implementation MyApp 
- (BOOL)canOpenURL:(NSURL *)url 
{ 
    if ([[url scheme] hasPrefix:@"com-google-gidconsent"] || [[url scheme] hasPrefix:@"com.google.gppconsent"]) { 
     return NO; 
    } 
    return [super canOpenURL:url]; 
} 
@end 

int main(int argc, char * argv[]) { 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, NSStringFromClass([MyApp class]), NSStringFromClass([AppDelegate class])); 
    } 
} 

ý rằng thường sẽ có một con số không sau argv nhưng đây là nơi bạn đặt lớp con lại UIApplication. Đây cũng là cách bạn có thể sử dụng phân lớp AppDelegate của riêng bạn.

Giải pháp khác sẽ là tạo danh mục trên UIApplication ghi đè canOpenURL và sử dụng sự gian lận để gọi triển khai ban đầu trong canOpenURL tùy chỉnh của bạn. Đây là một bài viết hay về sự nổi loạn: https://blog.newrelic.com/2014/04/16/right-way-to-swizzle/

Tôi phải cảnh báo bạn, hai giải pháp này là hack và bạn phải thực sự cẩn thận về những tác dụng phụ có thể có trên ứng dụng của bạn. Tôi thậm chí không chắc táo sẽ ổn với điều này.

0

Vấn đề đối với tôi là

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!)

không hiện nữa, sử dụng thay vì

public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)

Lưu ý sự khác biệt didSignInForUserdidSignInFor. Có thể sau khi cập nhật SDK lên nhanh nhất 3.

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