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;
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/7b59dbf0d5ecef43daa0e84172fe71f5.webp?x-image-process=image/format,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(@"点击了取消");
}
};
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/2bab0492422eb560a6393cdb0c3aa043.webp?x-image-process=image/format,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,并且获取内容。
- - (id)init
- {
- self = [super init];
- if (self) {
- self.isRequesting = NO;
- self.accountStore = [[ACAccountStore alloc] init];
- ACAccountType *facebookTypeAccount = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
- NSMutableDictionary *optionsDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"376722425766807",ACFacebookAppIdKey, @[@"email"], ACFacebookPermissionsKey,nil];
- 、
- [self.accountStore requestAccessToAccountsWithType:facebookTypeAccount
- options:optionsDict
- completion:^(BOOL granted, NSError *error)
- {
- if (granted) {
- [optionsDict setObject:@[@"manage_notifications"/*,@"read_mailbox"*/] forKey:ACFacebookPermissionsKey];
- [self.accountStore requestAccessToAccountsWithType:facebookTypeAccount
- options:optionsDict
- completion:^(BOOL granted, NSError *error)
- {
- if (granted) {
- self.isConnect = YES;
- NSArray *accounts = [self.accountStore accountsWithAccountType:facebookTypeAccount];
- self.account = [accounts lastObject];
- } else {
- NSLog(@"Facebook Error:%@", [error localizedDescription]);
- self.isConnect = NO;
- facebookCount = @"x";
- }
- }];
- } else {
- //fail
- NSLog(@"Facebook Error:%@", [error localizedDescription]);
- self.isConnect = NO;
- facebookCount = @"x";
- }
- }];
- }
- return self;
- }
看到第二个requestAccessToAccountsWithType,大家肯定会感到疑惑,为什么不在上面一次性读取manage_notifications,email呢?这里我也尝试过这种做法,但是总是失败,然后参考了stackoverflow上面的例子,他们都是先访问一下EMail这类主权限,然后再去访问副权限的。事实证明这样做是对的。
接下去就是如何读取通知数了:
- - (void)requestForNotifcation
- {
- if (self.account == nil || self.isRequesting) {
- return;
- }
- self.isRequesting = YES;
- NSString *urlStr = @"https://graph.facebook.com/fql";
- NSURL *requestUrl = [NSURL URLWithString:urlStr];
- NSDictionary *fql = [NSDictionary dictionaryWithObject:@"SELECT title_text FROM notification WHERE recipient_id=me() AND is_unread =1" forKey:@"q"];
- //Token:read_mailbox
- //SELECT unread_count FROM mailbox_folder WHERE folder_id=0
- SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
- requestMethod:SLRequestMethodGET
- URL:requestUrl
- parameters:fql];
- request.account = self.account;
- [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
- //process
- //NSLog(@"%@", [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]);
- self.isRequesting = NO;
- if (responseData != nil) {
- if (urlResponse.statusCode >= 200 && urlResponse.statusCode < 300) {
- id json = [NSJSONSerialization JSONObjectWithData:responseData
- options:NSJSONReadingAllowFragments
- error:nil];
- if (json != nil) {
- NSDictionary *mainDict = json;
- NSDictionary *unreadNotifications = [mainDict objectForKey:@"data"];
- NSInteger count = [unreadNotifications count];
- if ([self.delegate respondsToSelector:@selector(didGetNotificationCount:)]) {
- [self.delegate didGetNotificationCount:count];
- }
- }
- }
- } else {
- facebookCount = @"x";
- }
- }];
- }
这里的类似SQL的语言是facebook webAPI提供的一种方式,叫做fql,和SQL的用法有点像,具体可以查看facebook的developer网站,里面有比较详细的各种fql,可以获取好友之类更多的东西。