Twitter integration issue using ACAccountStore (iOS 5)

When I run the code below with iOS 6.0, its working

ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { //MY CODE } }); }]; 

and when I run this code with iOS 5.0 or 5.1, it comes out with the following output,

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ACAccountStore requestAccessToAccountsWithType:options:completion:]: unrecognized selector sent to instance 0x68a57c0' 

I don't know about this weird crash log.

Please tell me how to get rid of this.

+4
source share
4 answers

Use the method below:

 [account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { if (granted) { //Your code } } }]; 
+5
source

Try updating for this:

 ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // iOS 6 if ( [account respondsToSelector:@selector(requestAccessToAccountsWithType: options: completion:)] ) { [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { //MY CODE } }); }]; } // iOS 5 else if ( [account respondsToSelector:@selector(requestAccessToAccountsWithType: withCompletionHandler:)] ) { [account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { //MY CODE } }); }]; } else { // iOS 4 or less } 
+1
source

It's a bit late, but the reason you get this error is because requestAccessToAccountsWithType: options: completion: new in iOS 6.

In iOS 5 and earlier, the requestAccessToAccountsWithType: withCompletionHandler method is used instead (this method has been deprecated in iOS 6)

See the docs: https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountStoreClassRef/Reference/Reference.html#//apple_ref/doc/uid/TP40011021-CH1-SW12

+1
source

Thanks @CReaTuS, I want to clear this up to some bit. Please note that in the case of iOS6 we are doing SLRequest, where in iOS5 we have to execute the request using TWRequest. See below -

  ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; if ( [accountStore respondsToSelector:@selector(requestAccessToAccountsWithType: options: completion:)] ) { [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; // For the sake of brevity, we'll assume there is only one Twitter account present. // You would ideally ask the user which account they want to tweet from, if there is more than one Twitter account present. if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; [tempDict setValue:@"Twitter_Name" forKey:@"screen_name"]; [tempDict setValue:@"true" forKey:@"follow"]; //Code specific to iOS6 or later SLRequest *followRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/friendships/create.json"] parameters:tempDict]; // To unfollow hit URL-https://api.twitter.com/1.1/friendships/destroy.json [followRequest setAccount:twitterAccount]; [followRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSString *output = [NSString stringWithFormat:@"HTTP response status: %i", [urlResponse statusCode]]; NSLog(@"%@", output); if (error) { dispatch_async(dispatch_get_main_queue(), ^{ //Update UI to show follow request failed }); } else { dispatch_async(dispatch_get_main_queue(), ^{ //Update UI to show success }); } }]; } } }); }]; } else if ( [accountStore respondsToSelector:@selector(requestAccessToAccountsWithType: withCompletionHandler:)] ) { [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; // For the sake of brevity, we'll assume there is only one Twitter account present. // You would ideally ask the user which account they want to tweet from, if there is more than one Twitter account present. if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; [tempDict setValue:@"Twitter_Name" forKey:@"screen_name"]; [tempDict setValue:@"true" forKey:@"follow"]; //Code specific to iOS5 TWRequest *followRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.twitter.com/1/friendships/create.json"] parameters:tempDict requestMethod:TWRequestMethodPOST]; [followRequest setAccount:twitterAccount]; [followRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSString *output = [NSString stringWithFormat:@"HTTP response status: %i", [urlResponse statusCode]]; NSLog(@"%@", output); if (error) { dispatch_async(dispatch_get_main_queue(), ^{ //Update UI to show follow request failed }); } else { dispatch_async(dispatch_get_main_queue(), ^{ //Update UI to show success }); } }]; } } }); }]; } else { dispatch_async(dispatch_get_main_queue(), ^{ //Update UI to show follow request completely failed }); } 

Happy coding :)

+1
source

Source: https://habr.com/ru/post/927431/


All Articles