玩转iOS开发:iOS 8新特性《Share Extension》

本文介绍如何在iOS 8中创建和配置Share Extension,包括创建新工程、设置ShareExtension、配置主应用和NSExtension,以及实现分享逻辑和自定义UI。通过实例展示了如何限制字数、发送网络请求,并提供了GitHub源码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


作者感言

在前阵子我写了另外一篇文章也是关于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罢了, 说那么多道理, 还不如直接上代码~

1


创建新工程

首先我们需要先创建一个新的工程, 由于Share Extension不是一个独立的应用, 它是需要依赖于主程序, 创建新工程的顺序我就省略了, 这里的新工程叫做ShareExtensionDemo.

2


创建ShareExtension

创建完新工程之后, 我们现在来创建Share ExtensionToday Extension一样, 系统是有自带的模板给我们自己选择

3

4

5

6


配置主应用

现在新工程和Share Extension已经创建完成, 现在我们可以在主应用当中调起Share Extension来看看效果, 这里我为了方便, 所以使用的是StoryBoard.

拖一个UIButtonStoryBoard, 改名为Share, 然后关联Action事件到ViewController, 添加对应的代码.

7

8

9

10

- (IBAction)ShareAction:(UIButton *)sender {

    NSString *string = @"您好";

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[string]
                                                                                     applicationActivities:nil];

    [self presentViewController:activityController
                       animated:YES
                     completion:nil];
}

现在让我们来看看对应的效果吧~~

11

12

13

现在我们看到了Share Extension展示出来的效果, 但酱紫还是不够的, 继续继续~


配置ShareExtension

在配置Share Extension之前, 我们需要看看里面的几个方法, 不然我们完全都是蒙圈的

14

// 如果是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]中才显示扩展插件图标
NSExtensionActivationSupportsWebURLWithMaxCountWeb链接最多限制: default=0默认不支持分享超链接,例如[Safari]
NSExtensionActivationSupportsFileWithMaxCount文件最多限制: 20单一、多选均不超过20
NSExtensionActivationSupportsWebPageWithMaxCountWeb页面最多限制: default=0默认不支持Web页面分享,例如[Safari]
NSExtensionActivationSupportsImageWithMaxCount图片最多限制: 20单一、多选均不超过20
NSExtensionActivationSupportsVideoWithMaxCount视频最多限制: 20单一、多选均不超过20
NSExtensionActivationSupportsText文本类型: default=0默认不支持文本分享,例如[备忘录]

其实这个表格在官网文档都是可以找到的~~

15


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功能, 并且填写对应的参数, 不然没法传送数据.

16

17

同样的, Share Extension也需要同样的操作, 这里就不做重复的操作了, 现在我们继续来填写对应的网络操作逻辑

18

首先, 我们需要封装一个返回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里去.

19

20

酱紫我们就搞定了Share Extension, 灰常的简单


自定义UI

这里补充一点, 其实Share Extension说白了就是一个UIViewController, 所以你可以根据你的喜好来进行UI定制, 详细资料大家可以去苹果官网或者Google搜搜, 百度的话, 你们懂得


补充篇文章

这里再补充篇文章, 关于Share Extension的, 是用Swift写的, 里面有一些问题, 会导致NSURLRequest返回为nil, 大家单步调试一下就知道为什么了

iOS8 Day-by-Day– Day2 — 分享应用扩展


GitHub地址

Share Extension工程地址: https://github.com/CainRun/ShareExtensionDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值