作者感言
在前阵子我写了另外一篇文章也是关于iOS 8新特性的, 叫做玩转iOS开发:iOS 8 新特性《Today Extension》, 这里面讲解就是iOS 8其中一个特性, 由于工作比较忙, 所以一直在拖着, 没有继续往下研究, 现在终于有时间抽出来可以研究一下
最后:
如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考你们的意见再进行修改, 联系我时, 请备注Share Extension
, 祝大家学习愉快~谢谢~
Cain(罗家辉)
zhebushimengfei@qq.com: 联系方式
350116542: 腾讯QQ
简介
什么是
Share Extension
? 在iOS 8的时候, 苹果开放了几个新特性, 其中一个就是Share Extension
, 大家可以打开苹果自己自带的浏览器Safari
, 随便选中一个网站, 点击分享, 就会出现一个分享界面, 中间的那条iCon
栏目就是系统自带的Share Extension
(如图所示), 说白了就是把Safari
的网站地址分享出去罢了, 所以说Share Extension
其实就是系统自带的社会化SDK罢了, 说那么多道理, 还不如直接上代码~
创建新工程
首先我们需要先创建一个新的工程, 由于
Share Extension
不是一个独立的应用, 它是需要依赖于主程序, 创建新工程的顺序我就省略了, 这里的新工程叫做ShareExtensionDemo
.
创建ShareExtension
创建完新工程之后, 我们现在来创建
Share Extension
和Today Extension
一样, 系统是有自带的模板给我们自己选择
配置主应用
现在新工程和
Share Extension
已经创建完成, 现在我们可以在主应用当中调起Share Extension
来看看效果, 这里我为了方便, 所以使用的是StoryBoard
.拖一个
UIButton
到StoryBoard
, 改名为Share
, 然后关联Action
事件到ViewController
, 添加对应的代码.
- (IBAction)ShareAction:(UIButton *)sender {
NSString *string = @"您好";
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[string]
applicationActivities:nil];
[self presentViewController:activityController
animated:YES
completion:nil];
}
现在让我们来看看对应的效果吧~~
现在我们看到了
Share Extension
展示出来的效果, 但酱紫还是不够的, 继续继续~
配置ShareExtension
在配置
Share Extension
之前, 我们需要看看里面的几个方法, 不然我们完全都是蒙圈的
// 如果是return No, 那么发送按钮就无法点击, 如果return YES, 那么发送按钮就可以点击
- (BOOL)isContentValid {
// Do validation of contentText and/or NSExtensionContext attachments here
return YES;
}
// 发送按钮的Action事件
- (void)didSelectPost {
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
// Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
// 这个方法是用来返回items的一个方法, 而且返回值是数组
- (NSArray *)configurationItems {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
return @[];
}
配置NSExtension
我们知道了上面那几个方法之后, 现在来配置一下我们可传送的内容规则, 这些规则分别是
iOS扩展插件支持媒体类型配置键 | 描述 | 说明 |
---|---|---|
NSExtensionActivationSupportsAttachmentsWithMaxCount | 附件最多限制: 20 | 附件包括下面的File、Image和Movie三大类,单一、混选总量不超过20 |
NSExtensionActivationSupportsAttachmentsWithMinCount | 附件最多限制: 上面非零时default=1 | 默认至少选择1个附件,[Share Extension]中才显示扩展插件图标 |
NSExtensionActivationSupportsWebURLWithMaxCount | Web链接最多限制: default=0 | 默认不支持分享超链接,例如[Safari] |
NSExtensionActivationSupportsFileWithMaxCount | 文件最多限制: 20 | 单一、多选均不超过20 |
NSExtensionActivationSupportsWebPageWithMaxCount | Web页面最多限制: default=0 | 默认不支持Web页面分享,例如[Safari] |
NSExtensionActivationSupportsImageWithMaxCount | 图片最多限制: 20 | 单一、多选均不超过20 |
NSExtensionActivationSupportsVideoWithMaxCount | 视频最多限制: 20 | 单一、多选均不超过20 |
NSExtensionActivationSupportsText | 文本类型: default=0 | 默认不支持文本分享,例如[备忘录] |
其实这个表格在官网文档都是可以找到的~~
ShareExtension逻辑
填写限制字数长度的逻辑
首先我们来填写一个东东, 就是限制
Share Extension
的可输入字数长度, 然后添加一个分享路径这里特别需要强调一点哈, 因为http://requestb.in/1hx20w61这个链接是需要自己去手动申请的, 而且是居然时效性的, 如果失效了, 那就自己去http://requestb.in再申请一个就好了.
// 限制字数, 最多只能输入40个
static NSInteger const maxCharactersAllowed = 40;
// 这是一个测试连接, 并不是固定的, 你可以去http://requestb.in申请, 然后替换到你最新申请的连接即可
static NSString *uploadURL = @"http://requestb.in/1hx20w61";
声明完了字数长度, 我们需要去
- (BOOL)isContentValid
方法中实现
- (BOOL)isContentValid {
NSInteger length = self.contentText.length;
self.charactersRemaining = @(maxCharactersAllowed - length);
return self.charactersRemaining.integerValue < 0 ? NO : YES;
}
填写上传信息的逻辑
在这里我用原生的网络请求进行请求发送, 大家也可以去使用AFNetWorking, Swift的话可以去使用另外一个网络请求框架Alamofire, 作者都是同一个大神
在写逻辑之前, 我们需要打开App的一个Group功能, 并且填写对应的参数, 不然没法传送数据.
同样的,
Share Extension
也需要同样的操作, 这里就不做重复的操作了, 现在我们继续来填写对应的网络操作逻辑
首先, 我们需要封装一个返回
NSURLRequest
的方法
/**
* 返回一个NSURLRequest方法, 需要传入一个NSString对象
*
* @param string 需要发送出去的字符串
*
* @return NSURLRequest
*/
- (NSURLRequest *)urlRequestWithString:(NSString *)string {
NSURL *url = [NSURL URLWithString:uploadURL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
request.HTTPMethod = @"POST";
NSMutableDictionary *jsonObject = [NSMutableDictionary dictionary];
jsonObject[@"text"] = string;
NSError *jsonError;
NSData *jsonData;
jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&jsonError];
if (jsonData) {
request.HTTPBody = jsonData;
} else {
NSLog(@"JSON Error: %@", jsonError.localizedDescription);
}
return request;
}
然后在
- (void)didSelectPost
点击事件中去调用
- (void)didSelectPost {
NSString *configName = @"com.shareExtension.ShareExtensionDemo.BackgroundSessionConfig";
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configName];
sessionConfig.sharedContainerIdentifier = @"group.ShareExtension";
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
NSURLRequest *urlRequest = [self urlRequestWithString:self.contentText];
NSURLSessionTask *task = [session dataTaskWithRequest:urlRequest];
[task resume];
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
这样子就完事了, 由于我这里不知道为啥用模拟器一直没法进行网络请求, 只能用真机测试了, 不知道是不是我配置的问题, 如果有知道的大神麻烦请告知一声, 谢谢啦~~现在我们再来重复一下刚开始的操作, 发送请求到指定的
URL
里去.
酱紫我们就搞定了
Share Extension
, 灰常的简单
自定义UI
这里补充一点, 其实
Share Extension
说白了就是一个UIViewController
, 所以你可以根据你的喜好来进行UI定制, 详细资料大家可以去苹果官网或者
补充篇文章
这里再补充篇文章, 关于Share Extension的, 是用Swift写的, 里面有一些问题, 会导致
NSURLRequest
返回为nil
, 大家单步调试一下就知道为什么了
iOS8 Day-by-Day– Day2 — 分享应用扩展
GitHub地址
Share Extension工程地址: https://github.com/CainRun/ShareExtensionDemo