You are right: due to changes in iOS 11 you need to log in before calling TWTRComposer .
iOS 11 no longer supports the use of Twitter through the integrated social framework. Instead, you can use Twitter Kit 3 to read, log in, and use the Twitter API. The following guide shows how to migrate old code.
Log in (with the following order, if possible, Twitter for iOS / SFSafariViewController / UIWebView). Check the prerequisites ) and then create:
ObjC:
// Check if current session has users logged in if ([[Twitter sharedInstance].sessionStore hasLoggedInUsers]) { TWTRComposerViewController *composer = [TWTRComposerViewController emptyComposer]; [fromController presentViewController:composer animated:YES completion:nil]; } else { [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) { if (session) { TWTRComposerViewController *composer = [TWTRComposerViewController emptyComposer]; [fromController presentViewController:composer animated:YES completion:nil]; } else { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"No Twitter Accounts Available" message:@"You must log in before presenting a composer." preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController:alert animated:YES completion:nil]; } }]; }
Swift:
if (Twitter.sharedInstance().sessionStore.hasLoggedInUsers()) { // App must have at least one logged-in user to compose a Tweet let composer = TWTRComposerViewController.emptyComposer() present(composer, animated: true, completion: nil) } else { // Log in, and then check again Twitter.sharedInstance().logIn { session, error in if session != nil { // Log in succeeded let composer = TWTRComposerViewController.emptyComposer() self.present(composer, animated: true, completion: nil) } else { let alert = UIAlertController(title: "No Twitter Accounts Available", message: "You must log in before presenting a composer.", preferredStyle: .alert) self.present(alert, animated: false, completion: nil) } } }
Docs:
source share