Tutorial for SLComposeViewController sharing [closed]
Asked Answered
R

3

77

What are the steps I need to follow to use iOS 6's new SLComposeViewController to post to Facebook, Twitter or Sina Weibo?

Ruscher answered 19/9, 2012 at 21:37 Comment(0)
R
141

For details on this framework please see Apple's Social Framework Class Reference

Additional tutorials:

  1. http://soulwithmobiletechnology.blogspot.com/2012/07/tutorial-how-to-use-inbuilt.html
  2. http://www.mobile.safilsunny.com/iphone/integrating-facebook-ios/
  3. https://rudeboy-quickies.blogspot.com/2012/06/steps-to-integrate-facebook-in-ios6.html

For this example, we will be using the SLComposeViewController's SLServiceTypeFacebook. If you wish to use Twitter or SinaWeibo just change out the SLServiceType to one of the following:

  • SLServiceTypeFacebook
  • SLServiceTypeSinaWeibo
  • SLServiceTypeTwitter

iOS 6 has made it very easy to post directly to Facebook, Twitter or Sina Weibo using the SLComposeViewController. This works very similarly to iOS 5's TWTweetComposeViewController.

First, in your view controller's header file (.h) #import the Social Framework and the Accounts Framework.

#import <Social/Social.h>

#import <Accounts/Accounts.h>

Here we will declare a simple UIButton and an IBAction that we will later link to that button and a void (sharingStatus) which will be used to check that the selected sharing service is available.

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *easyFacebookButton;
- (IBAction)facebookPost:(id)sender;
- (void)sharingStatus;
@end

@implementation ViewController

Then, in your implementation file (.m), we'll start by implementing the (sharingStatus) void that we declared in the header file. sharingStatus uses SLComposeViewController's isAvailableForServiceType BOOL to return whether or not you can post to the service specified in its argument. In this case, we will use the service type SLServiceTypeFacebook. If the service is available the post button will be enabled with an alpha value of 1.0f, and if the service isn't available the button will be disabled its alpha value set to 0.5f.

- (void)sharingStatus {
    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
        NSLog(@"service available");
        self.easyFacebookButton.enabled = YES;
        self.easyFacebookButton.alpha = 1.0f;
    } else {
        self.easyFacebookButton.enabled = NO;
        self.easyFacebookButton.alpha = 0.5f;
    }
}

Here we will set up the IBAction that will call up the composer. For good practice, we will check isAvailableForServiceType again to avoid calling up the composer for a service type that isn't available. (Incase something went wrong during the last check, or if availability somehow changed in the fraction of a second in between tapping the post button and the composers all/init. The code below has been set up to display a Facebook composers sheet with text, an image, and a link. This action also utilises a completion handler for the composer's cancelled and done results.

- (IBAction)facebookPost:(id)sender {

    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {

        SLComposeViewController *mySLComposerSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

        [mySLComposerSheet setInitialText:@"iOS 6 Social Framework test!"];

        [mySLComposerSheet addImage:[UIImage imageNamed:@"myImage.png"]];

        [mySLComposerSheet addURL:[NSURL URLWithString:@"https://mcmap.net/q/264745/-tutorial-for-slcomposeviewcontroller-sharing-closed"]];

        [mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) {

             switch (result) {
                 case SLComposeViewControllerResultCancelled:
                     NSLog(@"Post Canceled");
                     break;
                 case SLComposeViewControllerResultDone:
                     NSLog(@"Post Sucessful");
                     break;

                 default:
                     break;
             }
         }];

        [self presentViewController:mySLComposerSheet animated:YES completion:nil];
    }
}

In viewWillAppear we will register an observer to ACAccountStoreDidChangeNotification so the application can be notified when account information changes. This observer will then be removed in viewDidDisappear.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sharingStatus) name:ACAccountStoreDidChangeNotification object:nil];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:ACAccountStoreDidChangeNotification];
}

And finally, open up interface builder and add a UIButton which will be the post button. Then in the connections inspector link the IBOutlet and IBAction we created earlier to the button, and that's it! You're done!

enter image description here

Ruscher answered 19/9, 2012 at 21:37 Comment(9)
Hi, It was a nice answer,though i have small doubt,can we also present Login interface in case user's twitter/Facebook account is not set up?Barron
@AbhinandanSahgal no, not with this class. However, when working properly the composer will detect if the user isn't logged in and present an alert to take them to the settings for the appropriate service to log in to their account.Ruscher
Can you put a sample to take them to settings?Barron
@AbhinandanSahgal Sorry, but no I can't. This is build in behavior that should be working automatically if you aren't already logged in. Additionally, Apple used to offer API for sending the user to the preferences app, but it was removed in iOS 5.1 :(Ruscher
There's no need to link to Accounts.framework when using Social.framework. Also it can be a disadvantage to check if a service is available since the OS will do this automatically and fail with an alert that has a Settings button.Gabardine
Don't do the [SLComposeViewController isAvailableForServiceType:...] check and if that service is not set up in the Settings app, the framework will popup an alert stating that issue along with a button to go into settings.Scenography
how to hide location and audience option from this pop up?Dilapidation
@0x7fffffff why image is not getting upload in this code ?Coveney
In iOS 11, remove this line: if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {Tomekatomes
G
25

Just use this code to share on Facebook.

SLComposeViewController *controllerSLC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[controllerSLC setInitialText:@"First post from my iPhone app"];
[controllerSLC addURL:[NSURL URLWithString:@"http://www.appcoda.com"]];
[controllerSLC addImage:[UIImage imageNamed:@"test.jpg"]];
[self presentViewController:controllerSLC animated:YES completion:Nil];

If you want this for Twitter then just change SLServiceTypeTwitter.

Gelation answered 15/2, 2013 at 9:6 Comment(6)
am getting Settings page issue with your code.Phyla
@Phyla I didnt get you.Can you please explain it?Gelation
when Facebook Account is empty in your device it shows the alert with settings and cancel button when i click on settings button it should go to settings page its working fine in up to IOS 6.01 but in IOS 7 settings button doesn't take me to settings page.so do u have any idea about thisPhyla
Have you tested it on device?In simulator this issue comes in ios 6 too.Gelation
[controllerSLC setInitialText:@".."]; is deprecated now .Balder
why image is not getting uploadCoveney
W
13

Safe Use of SLComposeViewController

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])
    {
        SLComposeViewController *fbPost = [SLComposeViewController
                                               composeViewControllerForServiceType: SLServiceTypeFacebook];
        [fbPost setInitialText:@"Text You want to Share"];
        [fbPost addImage:[UIImage imageNamed:@"shareImage.png"]];
        [self presentViewController:fbPost animated:YES completion:nil];
        [fbPost setCompletionHandler:^(SLComposeViewControllerResult result) {
            switch (result) {
                case SLComposeViewControllerResultCancelled:
                    NSLog(@"Post Canceled");
                    break;
                case SLComposeViewControllerResultDone:
                    NSLog(@"Post Sucessful");
                    break;
                default:
                    break;
            }
            [self dismissViewControllerAnimated:YES completion:nil];
        }];
    }
Wilda answered 20/6, 2013 at 6:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.