문제

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.

도움이 되었습니까?

해결책

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);
                }                    
            }];
        }
    }];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top