iOS 实现Facebook的分享(调用系统的分享)

http://www.jianshu.com/p/4149ba123b12

在iOS的实际开发中,实现各大平台的分享,是一个很重要的功能,集成分享功能的第三方SDK也有很多,其中使用得最为广泛的有友盟分享和ShareSDK,除此之外各大平台的开发者中心也有自己的SDK开发包。
本文主要针对国外的社交平台分享的一个小技巧,以Facebook为例。

该方法的优点是:

只要不需要到各大社交平台的开发者中心去申请AppKey,不需要做过多的准备,省去了开发过程中的很多麻烦。

该方法的缺点是:

功能相当简单,而且在分享到对应平台之后不会显示分享内容的来源,只是简简单单的把需要分享的内容分享出去。
需要用户在iPhone的设置中绑定相应的平台。
接下来直接上代码 ———>

使用系统方法实现分享,需要#import <Social/Social.h>

1.调用系统自带的分享方法,需要自行选择分享的平台:

 //初始化分享控件
        UIActivityViewController *activeViewController = [[UIActivityViewController alloc]initWithActivityItems:@[@"百度",[NSURL URLWithString:@"http://www.baidu.com"]] applicationActivities:nil];
        //不显示哪些分享平台(具体支持那些平台,可以查看Xcode的api)
        activeViewController.excludedActivityTypes = @[UIActivityTypeAirDrop,UIActivityTypeCopyToPasteboard,UIActivityTypeAddToReadingList];
        [self presentViewController:activeViewController animated:YES completion:nil];
        //分享结果回调方法
        UIActivityViewControllerCompletionHandler myblock = ^(NSString *type,BOOL completed){
            NSLog(@"%d %@",completed,type);
        };
        activeViewController.completionHandler = myblock;

效果图:


IMG_0195.PNG


2.调用系统方法,直接分享到可以支持的分享平台:

// 首先判断某个平台是否可用(如果未绑定账号则不可用)

            if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
                NSLog(@"不可用");
                return;
            }

        /* *****可以分享的平台*****
         SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_AVAILABLE(10_8, 6_0);//Twitter
         SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_AVAILABLE(10_8, 6_0);//Facebook
         SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_AVAILABLE(10_8, 6_0);//新浪微博
         SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_AVAILABLE(10_9, 7_0);//腾讯微博
         SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_AVAILABLE(10_9, NA);//领英
         */

        // 创建控制器,并设置ServiceType(指定分享平台)
        SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
        // 添加要分享的图片
        [composeVC addImage:[UIImage imageNamed:@"Nameless"]];
        // 添加要分享的文字
        [composeVC setInitialText:@"share to PUTClub"];
        // 添加要分享的url
        [composeVC addURL:[NSURL URLWithString:@"http://www.putclub.com"]];
        // 弹出分享控制器
        [self presentViewController:composeVC animated:YES completion:nil];
        // 监听用户点击事件
        composeVC.completionHandler = ^(SLComposeViewControllerResult result){
            if (result == SLComposeViewControllerResultDone) {
                NSLog(@"点击了发送");
            }
            else if (result == SLComposeViewControllerResultCancelled)
            {
                NSLog(@"点击了取消");
            }
        };

效果图:


IMG_0194.PNG

3.完整的Facebook分享实现代码:

//
//  ViewController.m
//  FacebookShare
//
//  Created by WuTongAlvin on 15/10/10.
//  Copyright © 2015年 刘俊彰. All rights reserved.
//

#import "ViewController.h"
#import <Social/Social.h>

@interface ViewController ()

@end
@implementation ViewController

-(void)viewDidLoad {
    [super viewDidLoad];    
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UIActionSheet *action=[[UIActionSheet alloc]initWithTitle:@"系统分享方法" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"系统分享方法一",@"系统分享方法二", nil];
    [action showInView:self.view];

}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex==0) {
        /* **************系统分享方法一************** */
        //初始化分享控件
        UIActivityViewController *avc = [[UIActivityViewController alloc]initWithActivityItems:@[@"百度",[NSURL URLWithString:@"http://www.baidu.com"]] applicationActivities:nil];
        //不显示哪些分享平台
//        avc.excludedActivityTypes = @[UIActivityTypeAirDrop,UIActivityTypeCopyToPasteboard,UIActivityTypeAddToReadingList];

        [self presentViewController:avc animated:YES completion:nil];
        //分享结果回调方法
        UIActivityViewControllerCompletionHandler myblock = ^(NSString *type,BOOL completed){
            NSLog(@"%d %@",completed,type);
        };
        avc.completionHandler = myblock;
    }else if (buttonIndex==1){
        /* **************系统分享方法二************** */

        // 首先判断某个平台是否可用(如果未绑定账号则不可用)

            if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
                NSLog(@"不可用");
                return;
            }

        /* *****可以分享的平台*****
         SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_AVAILABLE(10_8, 6_0);
         SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_AVAILABLE(10_8, 6_0);
         SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_AVAILABLE(10_8, 6_0);
         SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_AVAILABLE(10_9, 7_0);
         SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_AVAILABLE(10_9, NA);
         */

        // 创建控制器,并设置ServiceType
        SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
        // 添加要分享的图片
        [composeVC addImage:[UIImage imageNamed:@"Nameless"]];
        // 添加要分享的文字
        [composeVC setInitialText:@"share to PUTClub"];
        // 添加要分享的url
        [composeVC addURL:[NSURL URLWithString:@"http://www.putclub.com"]];
        // 弹出分享控制器
        [self presentViewController:composeVC animated:YES completion:nil];
        // 监听用户点击事件
        composeVC.completionHandler = ^(SLComposeViewControllerResult result){
            if (result == SLComposeViewControllerResultDone) {
                NSLog(@"点击了发送");
            }
            else if (result == SLComposeViewControllerResultCancelled)
            {
                NSLog(@"点击了取消");
            }
        };

    }else{
        NSLog(@"点击了取消");
    }

}

@end

注:在国内,由于相关的法律规定,使用一般的网络无法访问国外的网站,因此需要连接VPN之后才能访问Facebook等国外网站。

//----

【IOS编程】iOS上如何获取facebook的通知数

要引用两个头文件 Social.h 和 Accounts.h

通过从iPhone上面安装的facebook程序中读取账户信息来访问facebook,并且获取内容。

  1. - (id)init  
  2. {  
  3.     self = [super init];  
  4.     if (self) {  
  5.         self.isRequesting = NO;  
  6.         self.accountStore = [[ACAccountStore alloc] init];  
  7.         ACAccountType *facebookTypeAccount = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];  
  8.           
  9.         NSMutableDictionary *optionsDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"376722425766807",ACFacebookAppIdKey, @[@"email"], ACFacebookPermissionsKey,nil];  
  10.         、  
  11.         [self.accountStore requestAccessToAccountsWithType:facebookTypeAccount  
  12.                                                    options:optionsDict  
  13.                                                 completion:^(BOOL granted, NSError *error)  
  14.         {  
  15.               
  16.             if (granted) {  
  17.                 [optionsDict setObject:@[@"manage_notifications"/*,@"read_mailbox"*/] forKey:ACFacebookPermissionsKey];  
  18.                   
  19.                 [self.accountStore requestAccessToAccountsWithType:facebookTypeAccount  
  20.                                                            options:optionsDict  
  21.                                                         completion:^(BOOL granted, NSError *error)  
  22.                 {  
  23.                       
  24.                     if (granted) {  
  25.                         self.isConnect = YES;  
  26.                         NSArray *accounts = [self.accountStore accountsWithAccountType:facebookTypeAccount];  
  27.                         self.account = [accounts lastObject];  
  28.                     } else {  
  29.                         NSLog(@"Facebook Error:%@", [error localizedDescription]);  
  30.                         self.isConnect = NO;  
  31.                         facebookCount = @"x";  
  32.                     }  
  33.                       
  34.                 }];  
  35.                   
  36.             } else {  
  37.                 //fail  
  38.                 NSLog(@"Facebook Error:%@", [error localizedDescription]);  
  39.                 self.isConnect = NO;  
  40.                 facebookCount = @"x";  
  41.             }  
  42.          }];  
  43.     }  
  44.     return self;  
  45. }  

看到第二个requestAccessToAccountsWithType,大家肯定会感到疑惑,为什么不在上面一次性读取manage_notifications,email呢?这里我也尝试过这种做法,但是总是失败,然后参考了stackoverflow上面的例子,他们都是先访问一下EMail这类主权限,然后再去访问副权限的。事实证明这样做是对的。


接下去就是如何读取通知数了:

  1. - (void)requestForNotifcation  
  2. {  
  3.     if (self.account == nil || self.isRequesting) {  
  4.         return;  
  5.     }  
  6.     self.isRequesting = YES;  
  7.     NSString *urlStr = @"https://graph.facebook.com/fql";  
  8.     NSURL *requestUrl = [NSURL URLWithString:urlStr];  
  9.     NSDictionary *fql = [NSDictionary dictionaryWithObject:@"SELECT title_text FROM notification WHERE recipient_id=me() AND is_unread =1" forKey:@"q"];  
  10.       
  11.     //Token:read_mailbox  
  12.     //SELECT unread_count FROM mailbox_folder WHERE folder_id=0  
  13.       
  14.     SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook  
  15.                                             requestMethod:SLRequestMethodGET  
  16.                                                       URL:requestUrl  
  17.                                                parameters:fql];  
  18.     request.account = self.account;  
  19.     [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {  
  20.         //process  
  21.         //NSLog(@"%@", [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]);  
  22.         self.isRequesting = NO;  
  23.         if (responseData != nil) {  
  24.             if (urlResponse.statusCode >= 200 && urlResponse.statusCode < 300) {  
  25.                 id json = [NSJSONSerialization JSONObjectWithData:responseData  
  26.                                                           options:NSJSONReadingAllowFragments  
  27.                                                             error:nil];  
  28.                   
  29.                 if (json != nil) {  
  30.                     NSDictionary *mainDict = json;  
  31.                     NSDictionary *unreadNotifications = [mainDict objectForKey:@"data"];  
  32.                     NSInteger count = [unreadNotifications count];  
  33.                     if ([self.delegate respondsToSelector:@selector(didGetNotificationCount:)]) {  
  34.                         [self.delegate didGetNotificationCount:count];  
  35.                     }  
  36.                 }  
  37.             }  
  38.         } else {  
  39.             facebookCount = @"x";  
  40.         }  
  41.     }];  
  42. }  

这里的类似SQL的语言是facebook webAPI提供的一种方式,叫做fql,和SQL的用法有点像,具体可以查看facebook的developer网站,里面有比较详细的各种fql,可以获取好友之类更多的东西。


最后,国内的注意用VPN哦,不然永远都访问不了的。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值