自iOS8开始,苹果支持应用扩展,这里说下ShareExtension
一、环境配置篇
1、用XCode打开要添加扩展的工程,点击File ->New Target -> Application Extension -> Share Extension
完成后会看到多了一个扩展文件夹
2、共享沙盒,开启App Groups。
分别在原target和extension下开启AppGroups,选中同一个group。
注意:在开发者中心的该appid下编辑一下,勾选同一个组,保证统一。
通过AppGroups 的建立,就可以共享同一个沙盒的数据。
3、共享沙盒数据的存取
存:
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxxxx"];
[shared setObject:@"value" forKey:@"key"];
[shared synchronize];
取:
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxxxx"];
NSString *value = [shared objectForKey:@"key"];
二、界面交互篇
1、至上一步,打开浏览器,点击分享图标就可以看到自己的应用,点击后出现下面界面
2、获取到链接和文字
文字: NSString *textStr = self.contentText;
链接比较复杂:
NSExtensionItem * imageItem = [self.extensionContext.inputItems firstObject];
NSItemProvider * imageItemProvider = [[imageItem attachments] firstObject];
if([imageItemProvider hasItemConformingToTypeIdentifier:(NSString*)kUTTypeURL])
{
[imageItemProvider loadItemForTypeIdentifier:(NSString*)kUTTypeURL options:nil completionHandler:^(NSURL* imageUrl, NSError *error) {
//在这儿做自己的工作
NSString* urlString = imageUrl.absoluteString;
}];
}
3、点击发送键将会调用方法
- (void)didSelectPost {
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
4、自定义界面的思路,把默认的界面隐藏掉,然后在viewDidLoad中添加自定义的界面。隐藏的方法:
- (void)viewDidLoad{
UIView *sup = self.textView.superview;
sup.hidden = YES;
}
三、重要重要重要
1、在实际开发中,要进行处理免不了要使用AFNetWorking库。直接包含引用会变异错误,原因在于ShareExtension中不存在UIApplication。而在AFNetWorking中是用到这个的。不过AFNetWorking自身有考虑到这方面,只需在预编译文件PrefixHeader.pch中添加代码:
#define AF_APP_EXTENSION
但是xcode6之后这个文件是没有的,需要自己添加:新建pch文件,在Build Setting 中搜索pch 在Prefix Header 中进行关联
$(SRCROOT)/Extension/PrefixHeader.pch
2、针对变异报错的问题还有一个 x86
方法:在extension 的target中的Build Phases的Complile Sources中添加报错的.m文件