2016-07-29 12 views
5

के साथ एकीकृत है, मेरा उद्देश्य उद्देश्य-सी में एक आईओएस ऐप है और लॉगिन कार्यक्षमता के लिए फेसबुक एसडीके एकीकृत किया है।फेसबुक लॉगिन पेज का इंटरमीटेंट बंद जो आईओएस ऐप

मेरे पास एक मुख्यदृश्य नियंत्रक है जहां मैं अपना बटन प्रदर्शित करता हूं। बटन पर बटन बटन हैंडलर पर नीचे दिए गए कोड को निष्पादित किया गया है क्लिक करें।

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
    [login 
    logInWithReadPermissions: @[@"public_profile", @"email"] 
    fromViewController:self 
    handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
     if (error) { 
      NSLog(@"Process error %@",error.description); 
     } 
     else if (result.isCancelled) { 
      NSLog(@"Cancelled"); 
     } 
     else { 
      if ([result.grantedPermissions containsObject:kEmail]) { 
       [self fetchfbUserInfo]; 
      } 
      else { 
       NSLog(@"User Declined permissions"); 
      } 
     } 
    }]; 

जब फेसबुक से प्रवेश पृष्ठ, हमारे अनुप्रयोग के भीतर वेबव्यू में प्रदर्शित किया जाता है फेसबुक लॉगइन पेज छोड़ दिया है, तो के रूप में/कुछ समय के लिए पहुंच से बाहर है, यह रुक-रुक कर कंसोल में निम्न त्रुटि के साथ बंद कर देता है।

FBSDKLog: त्रुटि: SFSafariViewController के माता-पिता को देखने नियंत्रक बर्खास्त कर दिया गया। यह तब हो सकता है जब आप UIAlertController से लॉगिन को ट्रिगर कर रहे हों। इसके बजाए, सुनिश्चित करें कि आपका सबसे ज्यादा दृश्य नियंत्रक को समय-समय पर बर्खास्त नहीं किया जाएगा।

कुछ रिवर्स इंजीनियरिंग किया और पाया कि FBSDKApplicationDelegate वर्ग के इस प्रतिनिधि विधि त्रुटि संदेश के लिए लागू हो रही किया जाना चाहिए।

- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated 
{ 
    if (_safariViewController) { 
    [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors 
          logEntry:@"**ERROR**:\n The SFSafariViewController's parent view controller was dismissed.\n" 
    "This can happen if you are triggering login from a UIAlertController. Instead, make sure your top most view " 
    "controller will not be prematurely dismissed."]; 
    [self safariViewControllerDidFinish:_safariViewController]; 
    } 
} 

किसी भी संभावित कारण प्रवेश पृष्ठ (या एप्लिकेशन प्राधिकरण पेज अगर alreay लॉग-इन) बंद कर देता है/करने के लिए के रूप में यह के दम पर खारिज?

+1

क्या आपको पता चला? मेरे पास एक ही समस्या है – Laurent

+1

मेरे पास एक ही समस्या है, क्या आपको पता चला है? – erdemgc

+1

मेरे पास एक ही समस्या है, इसके लिए कोई समाधान? –

उत्तर

1

आईओएस 9 के बाद से एफबी आईओएस एसडीके में डिफ़ॉल्ट व्यवहार उपयोगकर्ता को प्रमाणीकृत करने के लिए मोबाइल सफारी का उपयोग करना है (मूल आईओएस एफबी ऐप के विपरीत)। जब कोई उपयोगकर्ता फेसबुक के साथ आपके ऐप में लॉगिन करने का प्रयास करता है लेकिन मोबाइल सफारी (कोई कुकी) में फेसबुक में कभी भी लॉग इन नहीं किया है, तो सफारी एक पृष्ठ लोड करता है जिसमें उपयोगकर्ता को "फेसबुक ऐप के साथ लॉग इन" करने की पेशकश की जाती है। उस बटन को टैप करने से उपयोगकर्ता को एफबी मूल ऐप पर ले जाता है, जिससे सफारी पेज को खारिज कर दिया जाता है (और आपका ऐप पृष्ठभूमि में जाने के लिए)। यह वास्तव में लॉगिन प्रवाह को रद्द करता है और isCancelled == true के साथ FBSDKLoginManagerLoginResult ब्लॉक पर लौटाता है।

जब उपयोगकर्ता मूल एफबी ऐप में अनुमति स्वीकार करता है और आपके ऐप पर लौटाता है, तो application:openURL:options: को fb<your-fb-app-id>:// यूआरएल (जिसमें एक्सेस टोकन होता है) के साथ कहा जाता है। अमेरिकन प्लान एसडीके लॉगिन दिशा-निर्देशों के अनुसार, इस यूआरएल को भेज दिया जाना चाहिए:

[[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 

हालांकि FBSDKApplicationDelegate सिर्फ यूआरएल ध्यान नहीं देता और NO रिटर्न दिया गया था क्योंकि प्रवेश प्रवाह को पहले से "रद्द"।

मेरे लिए यह एफबी एसडीके में एक गंभीर बग की तरह दिखता है।

- (BOOL) application:(UIApplication*)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options 
{ 
    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 
    if (!handled) { 
     NSMutableDictionary *launchOptions = [NSMutableDictionary new]; 
     launchOptions[UIApplicationLaunchOptionsSourceApplicationKey] = options[UIApplicationOpenURLOptionsSourceApplicationKey]; 
     launchOptions[UIApplicationLaunchOptionsAnnotationKey] = options[UIApplicationOpenURLOptionsAnnotationKey]; 
     launchOptions[UIApplicationLaunchOptionsURLKey] = url; 
     return [[FBSDKApplicationDelegate sharedInstance] application:application 
           didFinishLaunchingWithOptions:launchOptions]; 
    } 

    return handled; 
} 

ऊपर वास्तव में अमेरिकन प्लान एसडीके अंदर पहुँच टोकन स्टोर करेगा:

केवल वैकल्पिक हल मैं इस समस्या का पता चला है यह है।

अपना लॉगिन प्रवाह जारी रखने के लिए, आप FBSDKAccessTokenDidChange अधिसूचना देख सकते हैं, जिसे ऊपर एफबी यूआरएल की प्रसंस्करण के बाद बुलाया जाएगा।

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