• 分享扩展

注:此教程来源于http://www.raywenderlich.com的《iOS8 by Tutorials》

1.准备

这次例子来源于国外的图片分享网站Imgur.com

首先现在Imgur上注册你的帐号,之后按下面的步骤来,点击settings
选择applications中新建app,即下面的create your own,这里上面的App是我得Demo
之后点击register注册你的应用
输入你App的名字后选择第二项,后面输入你的邮箱与面述,点击submit
这里请记好App的Client ID和Client secret
到此,即注册App成功,可以在你的App中调用Imgur的API

2.设置分享扩展前

首先打开源码JMImgure_original,这是我还未设置分享扩展的源码,你可以自己将下面过程全部演练一遍,但前提是你需要将警告处的Group ID与Client ID更改为你自己的,否则会报错!!!
你需要新建你自己的Group ID需要注意的地方如下:
以及下面的源码部分:
 //AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
#warning 在这里设置成你的CLIENT ID
[RWTImgurService setClientId:@"CLIENT ID"]; [[UITabBar appearance] setTintColor:[UIColor imgvueGreen]];
[[UINavigationBar appearance] setTintColor:[UIColor imgvueGreen]];
[[UIProgressView appearance] setTintColor:[UIColor imgvueGreen]]; return YES;
} //RWTSavedImageService.m
- (NSURL *)URLForDirectoryWithName:(NSString *)name {
#warning 在这里设置你的APP GROUP ID
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.qq100858433.JMImgvue"];
containerURL = [containerURL URLByAppendingPathComponent:name]; if (![[NSFileManager defaultManager] fileExistsAtPath:containerURL.path]) {
[[NSFileManager defaultManager] createDirectoryAtURL:containerURL withIntermediateDirectories:NO attributes:nil error:nil];
} return containerURL;
}

3.正文

如果已经可以正常运行,那么就可以进行分享扩展的设置
首先依然是添加Share Extension
 
接下来输入App分享的名字后点击Finish,点击Activate,之后为分享扩展也设置App Groups
下面我们来看share文件夹下面的Info文件中的NSExtension项,系统默认如下
需要关心的是NSExtensionActivationRule,Apple默认设置为TRUEPREDICATE,意思就是这个扩展将一直有效,这方便与开发,但是实际中Apple不允许这个值默认如此,App扩展最基本的要求就是轻量,因此如果你直接默认的话,提交到App Store是不会过审的,在这里我们做这样的修改
意思是每次选择的附件只能选一个,这里就设置一处即可,更多关于NSExtension请点击此处:App Extension Keys
 
接下来进行扩展的实现,Apple默认提供的类为SLComposeServiceViewController,它做出来与Sina微博类似

直接使用即可,在对SharViewController编程前,由于我们要使用原有的头文件和第三方库,所以将cocoapods的Podfile文件做如下更改,增加你建的扩展项目

 # Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
inhibit_all_warnings! target 'JMImgure' do pod 'SDWebImage'
pod 'AFNetworking' end target 'JMImgure Share' do pod 'SDWebImage'
pod 'AFNetworking' end

之后在命令行重新运行pod install即可,下面是更改后的ShareViewController.m,有注释说明

 //
// ShareViewController.m
// JMImgure Share
//
// Created by JackMa on 15/11/29.
// Copyright © 2015年 JackMa. All rights reserved.
// #import <MobileCoreServices/MobileCoreServices.h>
#import "ShareViewController.h" @interface ShareViewController () @property (nonatomic, strong) UIImage *image; @end @implementation ShareViewController - (void)viewDidLoad {
//获取inputItems,在这里itemProvider是你要分享的图片
NSExtensionItem *firstItem = self.extensionContext.inputItems.firstObject;
NSItemProvider *itemProvider;
if (firstItem) {
itemProvider = firstItem.attachments.firstObject;
} //这里的kUTTypeImage代指@"public.image",也就是从相册获取的图片类型
//这里的kUTTypeURL代指网站链接,如在Safari中打开,则应该拷贝保存当前网页的链接
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) {
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
if (!error) {
//对itemProvider夹带着的URL进行解析
NSURL *url = (NSURL *)item;
[UIPasteboard generalPasteboard].URL = url;
}
}];
}
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
if (!error) {
//对itemProvider夹带着的图片进行解析
NSURL *url = (NSURL *)item;
NSData *imageData = [NSData dataWithContentsOfURL:url];
self.image = [UIImage imageWithData:imageData];
}
}];
}
} //设置Post是否有效,当你每次输入内容的时候,都会调用此方法
- (BOOL)isContentValid {
if (self.image) {
return YES;
} else {
return NO;
}
} //设置点击Post后的动作
- (void)didSelectPost {
[self shareImage];
} //在这里设置弹出sheet的底部,要求用SLComposeSheetConfigurationItem的对象
- (NSArray *)configurationItems {
SLComposeSheetConfigurationItem *configItem = [[SLComposeSheetConfigurationItem alloc] init];
configItem.title = @"链接将被拷贝到剪贴板";
return @[configItem];
} - (void)shareImage {
//在这里写图片上传的代码
}

在运行时选择Photos后Run

至此,完成了分享扩展最基本的设置。
源码有原始版本(original)和设置好的share版本供参考

 源码点击这里

iOS8中添加的extensions总结(二)——分享扩展的更多相关文章

  1. iOS8中添加的extensions总结(一)——今日扩展

    通知栏中的今日扩展 分享扩展 Action扩展 图片编辑扩展 文件管理扩展 第三方键盘扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutor ...

  2. iOS8中添加的extensions总结(三)——图片编辑扩展

    图片编辑扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 与(二)类似的使用Imgur作为图片来源   2. ...

  3. iOS8中添加的extensions总结(四)——Action扩展

    Action扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 本次教程利用网站bitly.com进行 bit ...

  4. FastReport 中添加二维码功能.(Delphi)

    http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi)   在实际 ...

  5. iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释

    一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...

  6. iOS8中提示框的使用UIAlertController(UIAlertView和UIActionSheet二合一)

     本文转载至 http://blog.csdn.net/liuwuguigui/article/details/39494597       IOS8UIAlertViewUIActionSheet ...

  7. C#/VB.NET 在Word中添加条码、二维码

    本文介绍如何通过C# 和VB.NET代码实现在Word文档中添加条码和二维码.代码中将分为在Word正文段落中.页眉页脚中等情况来添加. 使用工具:Free Spire.Office for .NET ...

  8. Web开发从零单排之二:在自制电子请帖中添加留言板功能,SAE+PHP+MySql

    在上一篇博客中介绍怎样在SAE平台搭建一个html5的电子请帖网站,收到很多反馈,也有很多人送上婚礼的祝福,十分感谢! web开发从零学起,记录自己学习过程,各种前端大神们可以绕道不要围观啦 大婚将至 ...

  9. 在网页中添加分享到微信、QQ、微博

    参考地址:http://www.bshare.cn/help/installAction 在上面的地址中: 1.可选择分享到的位置,如QQ.微信.微博等 2.按钮的样式.悬浮或者以横幅的方式自己找位置 ...

随机推荐

  1. mongodb3.0 db.addUser报错

    > db.addUser("ydkt","ydkt") --19T09:: E QUERY TypeError: Property 'addUser' o ...

  2. 32位vs2010的项目如何在64位系统上运行

    64位注册 1. 关闭Visual Studio.2. 在Visual Studio Tools目录,以管理员身份运行Visual Studio Command Prompt (2010),[注:这个 ...

  3. ajax 分页控件,基于jquery

    /* 分页插件,依赖jQuery库 version: 1.1.0 author: Harrison Cao release date: 2013-09-23 相对 v1.0版本 修正了分页居中 使用方 ...

  4. C++ STL之vector常用指令

    只记载本人在ACM中常用的函数. vector,相当于动态数组,数组大小可变.声明vector以后,自动在内存中分配一块连续的内存空间进行数据存储. vector在内部进行插入.删除操作时间复杂度O( ...

  5. P - 奔小康赚大钱 - hdu 2255(带权值的匹配)

    分析:这是一个KM的模板题,也就不多说了,KM最复杂的情况都能过,下面是没有优化过的代码: ****************************************************** ...

  6. WKWebview点击图片查看大图

    大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...

  7. tomcat : Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException:

    错误 严重: Error configuring application listener of class org.springframework.web.context.ContextLoader ...

  8. Markdown入门指南-指间阁

    宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...

  9. XML (DOM解析) 看看就行

    000000000000000000000000000000000000000 ------------------------------------------------------------ ...

  10. 双slave的server_uuid同样问题

    早上做数据迁移,部署完slave2,发现3台机子的日志狂刷: 旧slave: 2014-05-29 14:35:35 996 [Note] Slave: received end packet fro ...