Tutorial für die Freigabe von SLComposeViewController [geschlossen]

76

Welche Schritte muss ich ausführen, um mit iOS 6 neu SLComposeViewControllerauf Facebook, Twitter oder Sina Weibo zu posten?

Mick MacCallum
quelle

Antworten:

141

Weitere Informationen zu diesem Framework finden Sie in der Apple Social Framework Class Reference

Zusätzliche 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

In diesem Beispiel verwenden wir die SLComposeViewController's SLServiceTypeFacebook. Wenn Sie Twitter oder SinaWeibo verwenden möchten, ändern Sie einfach den SLServiceType in einen der folgenden Werte:

  • SLServiceTypeFacebook
  • SLServiceTypeSinaWeibo
  • SLServiceTypeTwitter

iOS 6 hat es sehr einfach gemacht, mit dem direkt auf Facebook, Twitter oder Sina Weibo zu posten SLComposeViewController. Dies funktioniert sehr ähnlich wie bei iOS 5 TWTweetComposeViewController.

Zunächst in der Header-Datei Ihres View Controllers (.h) #importdas Social Framework und das Accounts Framework.

#import <Social/Social.h>

#import <Accounts/Accounts.h>

Hier erklären wir einen einfachen UIButtonund einen IBAction, den wir später mit dieser Schaltfläche verknüpfen, und einen void(sharedStatus), mit dem überprüft wird, ob der ausgewählte Freigabedienst verfügbar ist.

@interface ViewController : UIViewController

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

@implementation ViewController

Anschließend implementieren wir in Ihrer Implementierungsdatei (.m) zunächst die (sharedStatus) void, die wir in der Header-Datei deklariert haben. sharingStatus Verwendungen SLComposeViewController‚s isAvailableForServiceTypeBOOL zurückzukehren , ob Sie auf den Dienst in seinem Argument angegeben veröffentlichen können. In diesem Fall verwenden wir den Servicetyp SLServiceTypeFacebook. Wenn der Dienst verfügbar ist, wird die Post-Schaltfläche mit einem Alpha-Wert von 1,0 f aktiviert. Wenn der Dienst nicht verfügbar ist, wird die Schaltfläche deaktiviert und der Alpha-Wert auf 0,5 f festgelegt.

- (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;
    }
}

Hier werden wir das einrichten, das IBActionden Komponisten aufruft. Für eine gute Vorgehensweise werden wir isAvailableForServiceTypeerneut prüfen , um zu vermeiden, dass der Composer für einen Diensttyp aufgerufen wird, der nicht verfügbar ist. (Falls bei der letzten Überprüfung ein Fehler aufgetreten ist oder wenn sich die Verfügbarkeit im Bruchteil einer Sekunde zwischen dem Tippen auf den Post-Button und dem Komponisten all / init geändert hat. Der folgende Code wurde so eingerichtet, dass ein Facebook-Komponistenblatt mit Text angezeigt wird. Ein Bild und ein Link. Diese Aktion verwendet auch einen Abschluss-Handler für die abgebrochenen und erledigten Ergebnisse des Komponisten.

- (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:@"http://stackoverflow.com/questions/12503287/tutorial-for-slcomposeviewcontroller-sharing"]];

        [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 werden viewWillAppearwir einen Beobachter registrieren, ACAccountStoreDidChangeNotificationdamit die Anwendung benachrichtigt werden kann, wenn sich die Kontoinformationen ändern. Dieser Beobachter wird dann entfernt 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];
}

Öffnen Sie abschließend den Interface Builder und fügen Sie einen hinzu, UIButtonder die Post-Schaltfläche sein wird. Dann verlinken Sie im Verbindungsinspektor das IBOutletund IBActionwir haben es zuvor mit der Schaltfläche erstellt, und das war's! Du bist fertig!

Geben Sie hier die Bildbeschreibung ein

Mick MacCallum
quelle
1
Hallo, es war eine nette Antwort, obwohl ich kleine Zweifel habe, können wir auch die Anmeldeschnittstelle präsentieren, falls das Twitter / Facebook-Konto des Benutzers nicht eingerichtet ist?
Abhinandan Sahgal
3
@AbhinandanSahgal nein, nicht mit dieser Klasse. Bei ordnungsgemäßer Arbeit erkennt der Composer jedoch, ob der Benutzer nicht angemeldet ist, und zeigt eine Warnung an, um ihn zu den Einstellungen für den entsprechenden Dienst zu führen, der sich bei seinem Konto anmeldet.
Mick MacCallum
1
@AbhinandanSahgal Sorry, aber nein, ich kann nicht. Dies ist ein integriertes Verhalten, das automatisch funktionieren sollte, wenn Sie noch nicht angemeldet sind. Außerdem bot Apple eine API zum Senden des Benutzers an die Voreinstellungs-App an, die jedoch in iOS 5.1 entfernt wurde :(
Mick MacCallum
7
Bei Verwendung von Social.framework muss kein Link zu Accounts.framework erstellt werden. Es kann auch ein Nachteil sein, zu überprüfen, ob ein Dienst verfügbar ist, da das Betriebssystem dies automatisch ausführt und mit einer Warnung mit einer Schaltfläche "Einstellungen" fehlschlägt.
Martinjbaker
1
Führen Sie nicht die Überprüfung [SLComposeViewController isAvailableForServiceType: ...] durch. Wenn dieser Dienst nicht in der Einstellungen-App eingerichtet ist, zeigt das Framework eine Warnung an, die dieses Problem zusammen mit einer Schaltfläche zum Aufrufen der Einstellungen angibt.
Surpher
25

Verwenden Sie einfach diesen Code, um auf Facebook zu teilen.

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];

Wenn Sie dies für Twitter möchten, ändern Sie einfach SLServiceTypeTwitter.

Wüstenrose
quelle
Ich erhalte ein Problem mit der Einstellungsseite mit Ihrem Code.
Sabir
@ Sabir Ich habe dich nicht bekommen. Kannst du es bitte erklären?
Desert Rose
1
Wenn das Facebook-Konto auf Ihrem Gerät leer ist, wird die Warnung mit den Einstellungen und der Schaltfläche "Abbrechen" angezeigt. Wenn ich auf die Schaltfläche "Einstellungen" klicke, sollte es zur Einstellungsseite gehen. Es funktioniert bis zu IOS 6.01, aber in der IOS 7-Einstellungsschaltfläche gelangen Sie nicht zu den Einstellungen Seite. Also hast du eine Idee dazu
Sabir
1
Haben Sie es auf dem Gerät getestet? Im Simulator tritt dieses Problem auch in iOS 6 auf.
Desert Rose
[controllerSLC setInitialText: @ ".."]; ist jetzt veraltet.
Vicky
13

Sichere Verwendung von 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];
        }];
    }
AR
quelle