玩转iOS开发:iOS 8新特性《Share Extension》
2016-08-01 10:49
507 查看
作者感言
简介
创建新工程
创建ShareExtension
配置主应用
配置ShareExtension
配置NSExtension
ShareExtension逻辑
填写限制字数长度的逻辑
填写上传信息的逻辑
自定义UI
补充篇文章
最后:
如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考你们的意见再进行修改, 联系我时, 请备注
Cain(罗家辉)
zhebushimengfei@qq.com: 联系方式
350116542: 腾讯QQ
拖一个
现在让我们来看看对应的效果吧~~
现在我们看到了
其实这个表格在官网文档都是可以找到的~~
这里特别需要强调一点哈, 因为http://requestb.in/1hx20w61这个链接是需要自己去手动申请的, 而且是居然时效性的, 如果失效了, 那就自己去http://requestb.in再申请一个就好了.
声明完了字数长度, 我们需要去
在写逻辑之前, 我们需要打开App的一个Group功能, 并且填写对应的参数, 不然没法传送数据.
同样的,
首先, 我们需要封装一个返回
然后在
这样子就完事了, 由于我这里不知道为啥用模拟器一直没法进行网络请求, 只能用真机测试了, 不知道是不是我配置的问题, 如果有知道的大神麻烦请告知一声, 谢谢啦~~现在我们再来重复一下刚开始的操作, 发送请求到指定的
酱紫我们就搞定了
iOS8 Day-by-Day– Day2 — 分享应用扩展
简介
创建新工程
创建ShareExtension
配置主应用
配置ShareExtension
配置NSExtension
ShareExtension逻辑
填写限制字数长度的逻辑
填写上传信息的逻辑
自定义UI
补充篇文章
作者感言
在前阵子我写了另外一篇文章也是关于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相关文章推荐
- 玩转iOS开发:iOS 11 新特性《UIKit新特性的基本认识》
- 玩转iOS开发:iOS 11 新特性《Layout的新特性》
- iOS开发之玩转字符串
- ios开发之UITextField特性
- ios开发之UITextField特性
- ios开发之UITextField特性
- ios开发xcode4.4(ios6)的一些新特性
- iOS开发概述UIkit动力学,讲述UIKit的Dynamic特性。以及手势和动力结合使用的案例
- iOS 8 中新特性 - Swift 编程语言,一种接近自然语言的开发语言
- ios开发之UITextField特性
- IOS开发之三大特性(继承)
- 黑马程序员_iOS开发之OC之面向对象之三大特性封装、继承和多态
- iOS开发 - Block块的使用(二)内存管理和特性
- ios开发之UITextField特性
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
- iOS应用开发新手教程:iOS5 UIKit新特性
- ios开发之UITextField特性
- iOS开发之路--微博新特性页面