5

मैं AppDelegate.swift से गूगल लॉगिन लांच और फिर लॉगिन सफलता पर मेरे ऐप की मुख्य स्क्रीन शुरू करने के लिए कोशिश कर रहा हूँ बुलाया जा रहा है।आईओएस firebase: FIRAuthUIDelegate.authUI नहीं

enter image description here

मैं

  1. करने में सक्षम हूँ, जैसा कि ऊपर

  2. दिखाया गूगल प्रवेश बटन दिखाने उपयोगकर्ता

  3. उपयोगकर्ता के प्रवेश करने के लिए Google को भेजा जाता मूल पर वापस भेजा गया (चरण 1)

कदम 3. के बाद मैं अपने ऐप के मुख्य पृष्ठ पर उपयोगकर्ता को भेजना चाहते हैं।

मेरे कोड के नीचे है। मेरी समस्या यह है कि authUI नहीं कहा जा रहा है।

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    var authUI: FIRAuthUI? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI = FIRAuthUI.defaultAuthUI() 
     authUI?.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI?.providers = providers 

     // show google login button 
     let authViewController = authUI?.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 

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

    func authUI(authUI: FIRAuthUI, didSignInWithUser user: FIRUser?, error: NSError?) { 
     // launch main view controller 
    } 
} 

संपादित करें: यह another question का डुप्लिकेट प्रतीत होता है। अन्य प्रश्न का शीर्षक काफी सामान्य है और केवल विवरणों को गहराई से प्राप्त करता है। किसी भी मामले में, मेरा मानना ​​है कि क्रिस का जवाब वहां से कहीं अधिक व्यापक है। मुझे लगता है कि यहां प्रश्न और उत्तर दोनों स्पष्ट, अधिक स्पष्ट और अधिक गहन हैं, इसलिए लोगों को यहां जाने के लिए यहां एक गलती होगी, जैसे कि यह डुप्लिकेट के रूप में चिह्नित किया गया था।

+0

क्या आप स्टोरीबोर्ड का उपयोग कर रहे हैं? –

+0

@ टारवो, हाँ मैं – lf215

+0

हूं जब आप कहते हैं कि आपका ऑथूआई नहीं बुलाया जा रहा है, तो आप का अर्थ है औथूआई प्रतिनिधि विधि हाँ? – Chris

उत्तर

5

मैं आपकी समस्या निहित है here, - (void)signInWithProviderUI:(id<FIRAuthProviderUI>)providerUI विधि में लगता है।

प्रतिनिधि विधि dismissViewControllerAnimated:completion: पूरा होने के ब्लॉक में कहा जाता है।

[self.navigationController dismissViewControllerAnimated:YES completion:^{ 
     [self.authUI invokeResultCallbackWithUser:user error:error]; 
     }]; 

एप्पल डॉक्स से As you can see, इस विधि प्रस्तुत ViewController एक रीति पर कहा जा सकता है। आप इसे रूट व्यू कंट्रोलर के रूप में प्रदर्शित कर रहे हैं। इसे UIViewController से एक मॉडल के साथ प्रदर्शित करने का प्रयास करें, और चीजों को काम करना चाहिए। इस प्रयास को डीबग करने और line 193 पर एक ब्रेकपॉइंट सेट करने के लिए यह देखने के लिए कि यह हिट नहीं होगा। अगर आप ऑथ कंट्रोलर को सामान्य रूप से प्रदर्शित करते हैं तो यह बहुत ही आश्चर्यचकित होगा।

आपकी समस्या के संभावित समाधान के साथ आने के लिए (मुझे लगता है कि आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता आपके ऐप का उपयोग करने से पहले साइन इन हो)। नीचे वर्तमान में एक ऐप में जो मैं उपयोग कर रहा हूं उसका एक सरलीकरण है।

संपादित: नई 1.0.0 FirebaseUI वाक्य रचना के लिए अपडेट किया गया।

class MainTabController: UITabBarController, FIRAuthUIDelegate { 

    let authUI: FUIAuth? = FUIAuth.defaultAuthUI() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     var authProviders = [FUIFacebookAuth(), FUIGoogleAuth()] 
     authUI.delegate = self 
     authUI.providers = authProviders 

     //I use this method for signing out when I'm developing 
     //try! FIRAuth.auth()?.signOut() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     if !isUserSignedIn() { 
      showLoginView() 
     } 
    } 

    private func isUserSignedIn() -> Bool { 
     guard FIRAuth.auth()?.currentUser != nil else { return false } 
     return true 
    } 

    private func showLoginView() { 
     if let authVC = FUIAuth.defaultAuthUI()?.authViewController() { 
     present(authVC, animated: true, completion: nil) 
     } 
    } 
    func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) { 
     guard let user = user else { 
      print(error) 
      return 
     } 

     ... 
    } 
+0

क्या आप उपरोक्त कोड को उद्देश्य सी में कर सकते हैं? http://stackoverflow.com/questions/42340641/firauthuidelegate-authui-not-being-called-in-objective-c – shamila

+1

डर @ S.Sallay नहीं:/ – Chris

+0

यहाँ कोई समस्या हुई थी जहां FUIAuth को authUI स्थापित करने के लिए कोशिश कर रहा। defaultAuthUI(), क्योंकि यह विधि FirebaseApp.configure() applicationDidFinishLaunchingWithOptions में मार डाला से पहले निष्पादित किया जा रहा था आप एक अपवाद का कारण है जिस तरह से। थोड़ा अजीब, लेकिन देखने में मूल्य को प्रारंभ करना DidLoad() ने इसके बजाय समस्या को ठीक किया। – Cognitio

1

यह संदर्भ की एक समस्या होना चाहिए।

class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    let authUI = FIRAuthUI.defaultAuthUI() 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI.providers = providers 

     // show google login button 
     let authViewController = authUI.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 
} 

इसे आजमाएं। AppDelegate authUI और इसके delegate का संदर्भ रखेगा।

+0

सटीक परिवर्तन आप ने लिखा बनाने 'दें authUI = FIRAuthUI.defaultAuthUI()' 'वजह से authUI' नहीं के बराबर है, जो परिणामस्वरूप में" अनुप्रयोग आवेदन लांच के अंत में एक रूट दृश्य नियंत्रक की अपेक्षा की जाती "। मैं एक उच्च स्तर के संदर्भ खींच कर मेरी कोड बदल दिया है ** लेकिन 'authUI' अभी भी नहीं चलाया जा रहा है **। – lf215

+0

चेतावनी का मतलब यह नहीं है कि uthuI शून्य है। इसका मतलब है कि एप्लिकेशन लॉन्च होने तक विंडो में रूट व्यू कंट्रोलर नहीं है। दो संभावनाएं हैं एक 'authUI.authViewController()' रिटर्न नहीं के बराबर है और अन्य संभावना() 'async है और बहुत लंबा समय लगता है' है authUI.authViewController। 'AuthUI.authViewController() की वापसी की जांच करें शून्य नहीं है। – Ryan

संबंधित मुद्दे