Search code examples
iosfacebooktwitterslcomposeviewcontroller

How to disable completion sounds from SLComposeViewController (Facebook, Twitter, ...)?


Does anyone know how to disable the completion sounds of the SLComposeViewController in iOS?

The sound is played after the user posted a message to e.g. Facebook or Twitter.


Solution

  • You can do following:

    Make SLComposeViewController not to send tweet when pressed "Send". And send tweet manually.

    1. Walk through all views recursively and find button "Send"
    // UIButton with width 50px
    - (UIButton *)tweetSendButton:(UIView *)view
    {
        for (UIView * subview in view.subviews)
        {
            if ([subview isKindOfClass:[UIButton class]]
                && subview.bounds.size.width == 50)
            {
                return (UIButton *)subview;
            }
            UIButton * button = [self tweetSendButton:subview];
            if (button) return button;
        }
        return nil;
    }
    
    ...
    UIButton * sendButton = [self tweetSendButton:_tweetController.view];
    
    2. Remove all actions for target SLComposeViewController
    NSArray * actions = [sendButton actionsForTarget:_tweetController forControlEvent:UIControlEventTouchUpInside];
    for (NSString * action in actions)
        [sendButton removeTarget:_tweetController action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside];
    
    3. Add own action for UIControlEventTouchUpInside event
    [sendButton addTarget:self action:@selector(sendCustomTweet:) forControlEvents:UIControlEventTouchUpInside];
    
    4. When "Send" button was pressed use this methods to get text and account (if necessary):
    ....
    UITextView * textView = [self tweetTextView:self.tweetController.view];
    UIButton * accountButton = [self twitterAccountButton:self.tweetController.view];
    
    NSString * tweetText = textView.text;
    NSString * tweetAccount = [accountButton.titleLabel.text substringFromIndex:1]; // skip @ char
    ....
    
    5. Here are this methods:
    // Single UITextView
    - (UITextView *)tweetTextView:(UIView *)view
    {
        for (UIView * subview in view.subviews)
        {
            if ([subview isMemberOfClass:[UITextView class]])
                return (UITextView *)subview;
            UITextView * textView = [self tweetTextView:subview];
            if (textView) return textView;
        }
        return nil;
    }
    
    // UIButton witch starts from @
    - (UIButton *)twitterAccountButton:(UIView *)view
    {
        for (UIView * subview in view.subviews)
        {
            if ([subview isKindOfClass:[UIButton class]])
            {
                UIButton * button = (UIButton *)subview;
                if (button.titleLabel.text && [button.titleLabel.text rangeOfString:@"@"].location == 0)
                    return button;
            }
            UIButton * button = [self twitterAccountButton:subview];
            if (button) return button;
        }
        return nil;
    }
    
    6. Send tweet manually
    - (void)sendTweet:(NSString *)text fromAccount:(NSString *)account withArtwork:(UIImage *)artwork
    {
        // Create an account store object.
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    
        // Create an account type that ensures Twitter accounts are retrieved.
        ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
        // Request access from the user to use their Twitter accounts.
        [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
            if(!granted) return;
    
            // 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.
            for(ACAccount *twitterAccount in accountsArray)
            {
                if (account && ([account compare:twitterAccount.username options:(NSCaseInsensitiveSearch)] != 0))
                    continue;
    
                // Create a request, which in this example, posts a tweet to the user's timeline.
                // This example uses version 1 of the Twitter API.
                // This may need to be changed to whichever version is currently appropriate.
                NSString * method = artwork ? @"update_with_media" : @"update";
                NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/%@.json",method,nil]];
                TWRequest *postRequest = [[TWRequest alloc] initWithURL:url parameters:@{@"status":text} requestMethod:TWRequestMethodPOST];
    
                // Set the account used to post the tweet.
                [postRequest setAccount:twitterAccount];
    
                if (artwork)
                {
                    NSData * data = UIImageJPEGRepresentation(artwork, 0.8);
                    [postRequest addMultiPartData:data withName:@"media" type:@"JPG"];
                }
    
                // Perform the request created above and create a handler block to handle the response.
                [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                    if (urlResponse.statusCode == 200)
                    {
                        NSLog(@"Tweet sent successfully!");
                    }
                    else
                    {
                        NSDictionary * json = [NSJSONSerialization JSONObjectWithData:responseData
                                                                              options:kNilOptions
                                                                                error:&error];
                        NSLog(@"Tweet sending failed with error: %@", json);
                    }                    
                }];
            }
        }];
    }