SLComposeViewController分享教程

77

使用iOS 6的新 SLComposeViewController 发布内容到Facebook、Twitter或Sina Weibo,需要遵循哪些步骤?

3个回答

141

若要了解此框架的详细信息,请参阅Apple的Social Framework Class Reference

其他教程:

  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

在本示例中,我们将使用SLComposeViewControllerSLServiceTypeFacebook。如果您希望使用Twitter或SinaWeibo,请将SLServiceType更改为以下之一:

  • SLServiceTypeFacebook
  • SLServiceTypeSinaWeibo
  • SLServiceTypeTwitter

iOS 6使得使用SLComposeViewController直接发布到Facebook、Twitter或Sina Weibo非常容易。这与iOS 5的TWTweetComposeViewController非常相似。

首先,在您的视图控制器的头文件(.h)中#import Social Framework和Accounts Framework。

#import <Social/Social.h>

#import <Accounts/Accounts.h>

在这里,我们将声明一个简单的UIButton和一个IBAction,稍后将链接到该按钮,以及一个void(sharingStatus),用于检查所选共享服务是否可用。

@interface ViewController : UIViewController

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

@implementation ViewController

接下来,在您的实现文件(.m)中,我们将从在头文件中声明的 (sharingStatus) void 开始实现。 sharingStatus 使用 SLComposeViewControllerisAvailableForServiceType BOOL 来返回您是否可以发布到其参数中指定的服务。 在这种情况下,我们将使用服务类型 SLServiceTypeFacebook。 如果该服务可用,则会启用带有 alpha 值1.0f 的“发布”按钮;如果该服务不可用,则按钮将被禁用,alpha 值设置为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;
    }
}

在这里,我们将设置一个IBAction来调用composer。为了良好的实践,我们将再次检查isAvailableForServiceType,以避免为不可用的服务类型调用composer。(以防上次检查出现问题,或者在点击发布按钮和初始化composers之间的几分之一秒内可用性发生变化)下面的代码已经设置为显示带有文本、图像和链接的Facebook composers sheet。此操作还利用了composer的取消和完成结果的完成处理程序。

- (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://dev59.com/8Wcs5IYBdhLWcg3w433H"]];

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

viewWillAppear方法中,我们将注册一个观察者来监听ACAccountStoreDidChangeNotification通知,以便当帐户信息更改时可以通知应用程序。然后在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];
}

最后,打开接口构建器并添加一个UIButton,这将是提交按钮。然后在连接检查器中将先前创建的IBOutletIBAction链接到该按钮即可完成!

输入图像描述


1
你好,这是一个不错的回答,但我有一个小疑问,如果用户没有设置Twitter/Facebook账户,我们是否也可以提供登录界面呢? - Abhinandan Sahgal
3
@AbhinandanSahgal 不行,这个类无法实现。然而,当composer正常工作时,它会检测到用户未登录,并提示用户进入相应服务的设置界面以登录他们的账户。 - Mick MacCallum
1
@AbhinandanSahgal 抱歉,我不能这样做。这是内置行为,如果您尚未登录,则应自动工作。此外,苹果曾经提供将用户发送到首选项应用程序的API,但在iOS 5.1中已删除 :( - Mick MacCallum
7
使用Social.framework时无需链接到Accounts.framework。同时,检查服务是否可用可能会带来不利影响,因为操作系统会自动执行此操作并失败,并显示一个带有“设置”按钮的警报。 - martinjbaker
1
不要进行 [SLComposeViewController isAvailableForServiceType:...] 检查,如果该服务未在设置应用中设置,则框架将弹出警报并显示一个按钮以进入设置。 - Surpher
显示剩余4条评论

25

只需使用此代码即可在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];

如果您想要用于Twitter,则只需更改SLServiceTypeTwitter。


我在你的代码中遇到了设置页面问题。 - sabir
@sabir 我没听懂你的意思。你能否请解释一下? - Desert Rose
1
当您的设备中Facebook账户为空时,它会显示带有设置和取消按钮的警告。当我点击设置按钮时,应该进入设置页面,在IOS 6.01及以下版本中运行良好,但在IOS 7中,设置按钮无法将我带到设置页面。所以您有任何想法吗? - sabir
1
你在设备上测试过吗?在模拟器中,这个问题也出现在iOS 6中。 - Desert Rose
[controllerSLC setInitialText:@".."]; 现在已经过时了。 - Vicky
为什么图片无法上传? - Kishore Kumar

13

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接