2012-09-16 9 views
7

Sto usando il seguente codice (indicato sulle WWDC 2012 video):Facebook integrazione Error (Accounts.framework) in iOS6

self.accountStore = [[ACAccountStore alloc] init]; 

    ACAccountType *facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

    [self.accountStore requestAccessToAccountsWithType:facebookAccountType 
           withCompletionHandler:^(BOOL granted, NSError *e) { 
            if (granted) 
            { 
             NSArray *accounts = [self.accountStore 
                   accountsWithAccountType:facebookAccountType]; 
             self.facebookAccount = [accounts lastObject]; 
            } else { 
             // Fail gracefully... 
            } 
           }]; 

Ho anche aggiunto il NSDictionary alla mia .plist lima:

enter image description here

Quindi, il mio problema è che sto ricevendo la seguente eccezione:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Access options are required for this account type.' 

Ho provato con questo ACAccountTypeIdentifierTwitter e ACAccountTypeIdentifierSinaWeibo. Non si ricevono alcuna eccezione anche se sono sempre tornando granted == NO

risposta

17

Ebbene, il WWDC 2012 mostra una cosa, ma la documentation mostra un altro ... Il metodo che stanno utilizzando è ora sconsigliato:

– requestAccessToAccountsWithType:withCompletionHandler: Deprecated in iOS 6.0 

Cosa si dovrebbe fare:

ACAccountType *facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

    NSDictionary *options = @{ 
    @"ACFacebookAppIdKey" : @"123456789", 
    @"ACFacebookPermissionsKey" : @[@"publish_stream"], 
    @"ACFacebookAudienceKey" : ACFacebookAudienceEveryone}; // Needed only when write permissions are requested 

    [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:options 
           completion:^(BOOL granted, NSError *error) { 
            if (granted) 
            { 
             NSArray *accounts = [self.accountStore 
                   accountsWithAccountType:facebookAccountType]; 
             self.facebookAccount = [accounts lastObject]; 
            } else { 
             NSLog(@"%@",error); 
             // Fail gracefully... 
            } 
           }]; 
+0

sua funziona bene. Ma se usiamo in questo modo, la mia app ha aggiunto le impostazioni predefinite di Facebook. Quindi il problema è che è in stato OFF. C'è qualche soluzione per questo? – sathiamoorthy

0

Swift 3

let account = ACAccountStore() 
let accountType = account.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierFacebook) 
let options: [AnyHashable : Any] = [ACFacebookAppIdKey: "Your App ID on FB", ACFacebookPermissionsKey: ["publish_stream", "publish_actions"], ACFacebookAudienceKey: ACFacebookAudienceEveryone] 

account.requestAccessToAccounts(with: accountType, options: options) { (success, error) in 
    if success { 
    if let accounts = account.accounts(with: accountType) { 
     if accounts.isEmpty { 
     print("No facebook account found, please add your facebook account in phone settings") 
     } else { 
     let facebookAccount = accounts.first as! ACAccount 

     let message = ["status": "My first Facebook posting "] 
     let requestURL = URL(string: "https://graph.facebook.com/me/feed") 

     let postRequest = SLRequest(forServiceType: SLServiceTypeFacebook, 
            requestMethod: SLRequestMethod.POST, 
            url: requestURL, 
            parameters: message) 
     postRequest?.account = facebookAccount 

     postRequest?.perform(handler: {(_, urlResponse, 
      error) in 

      if let err = error { 
      print("Error : \(err.localizedDescription)") 
      } 
      print("Facebook HTTP response \(String(describing: urlResponse?.statusCode))") 
     }) 
     } 
    } 
    } else { 
    print("Facebook account error: \(String(describing: error))") 
    } 
}