创建一个 share extension
默认继承 SLComposeViewController 则弹跳框也是固定死的 如果要diy 请继承uiviewcontroller 可以在storyboard或者代码写布局 实现 NSURLSessionDelegate,NSURLSessionDownloadDelegate
如需要则在general-linked frameworks and libraries 配置libpods
修改info App Transport Security Settings 使可访问http 最好在target里的info改 直接在plist改会报错
修改displayname 必须改的
增加extension 规则
如需要重新关联storyboard
info 里配置 NSExtensionJavaScriptPreprocessingFile nssting DemoPreprocessor
在develop官方网站增加group共享
在capabilities 开启app group 选择group
在host app里同样开启app group 选择同一个group
在host app里的 info里 加入share extension 的identifier and url schemes
extension修改build settings里deployment-iOS deployment target =iOS 8.0+
修改共享target需要调用到的model 等的target membership 勾上 使其可以访问
网上找一下demo preprocessor.js 非必需
代码如下 导入到share extension里
var MyPreprocessor = function() {};
MyPreprocessor.prototype = {
run: function(arguments) {
arguments.completionFunction({"URL": document.URL, "pageSource": document.documentElement.outerHTML, "title": document.title, "selection": window.getSelection().toString()});
}
};
var ExtensionPreprocessingJS = new MyPreprocessor;
获取网址和网站名称
share extension 核心代码
@property (strong, nonatomic, readonly) NSURLSession *backgroundSession;
@property (strong, nonatomic) NSURLSessionDownloadTask *backgroundTask;
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) {
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *jsDict, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *jsPreprocessingResults = jsDict[NSExtensionJavaScriptPreprocessingResultsKey];
NSString *selectedText = jsPreprocessingResults[@"selection"];
NSString *pageTitle = jsPreprocessingResults[@"title"];
if ([selectedText length] > 0) {
self.lblTitle.text = selectedText;
self.strTitle = selectedText;
} else if ([pageTitle length] > 0) {
self.lblTitle.text = pageTitle;
self.strTitle = pageTitle;
}
});
}];
break;
}
}
}
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) {
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *jsDict, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *jsPreprocessingResults = jsDict[NSExtensionJavaScriptPreprocessingResultsKey];
NSString *selectedText = jsPreprocessingResults[@"URL"];
if ([selectedText length] > 0) {
self.lblWeb.text = selectedText;
self.strURL = selectedText;
NSURLSessionTask *mytask = [self.backgroundSession downloadTaskWithURL:[NSURL URLWithString:[self GetImgUrl:self.strURL]]];
[mytask resume];
}
});
}];
break;
}
}
}
转换url变成根目录下的icon
#pragma mark - Privite Methods
- (NSString *)GetImgUrl:(NSString *)url
{
NSString *temp = nil;
NSInteger s = 0;
NSString *strneed = nil;
for(int i =0; i < [url length]; i++)
{
temp = [url substringWithRange:NSMakeRange(i, 1)];
if ([temp isEqualToString:@"/"]) {
s ++;
if (s == 3)
{
strneed = [url substringWithRange:NSMakeRange(0, i+1)];
}
}
}
if (strneed == nil)
{
strneed = [NSString stringWithFormat:@"%@/",url];
}
strneed = [NSString stringWithFormat:@"%@favicon.ico",strneed];
if ([strneed containsString:@"http://"] || [strneed containsString:@"https://"])
{
}
else
{
strneed = [NSString stringWithFormat:@"http://%@",strneed];
}
return strneed;
}
获取图片回调
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *imgage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
[self.imgView setImage:imgage];
});
}
初始化session
- (NSURLSession *)backgroundSession {
static NSURLSession *backgroundSess = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"shareextension.backgroundsession"];
config.sharedContainerIdentifier = @"group.com.1call.shareextension";
backgroundSess = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
});
return backgroundSess;
}
共享数据设置group 备注:如果需要存储的数据是model数组 model必须share extension 可以访问的 并且继承 NSCopying
实现以下两个必须实现的方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self._headPic forKey:@"headPic"];
[aCoder encodeObject:self._target forKey:@"target"];
[aCoder encodeObject:self._nickName forKey:@"nickName"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self)
{
self._headPic = [aDecoder decodeObjectForKey:@"headPic"];
self._target = [aDecoder decodeObjectForKey:@"target"];
self._nickName = [aDecoder decodeObjectForKey:@"nickName"];
}
return self;
}
存数据
NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.1call.shareextension"];
[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.1call.shareextension"];
NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:arrneed];
[mySharedDefaults setObject:archiveCarPriceData forKey:@"chatviewcontrollerdata"];
[mySharedDefaults synchronize];
取数据
NSUserDefaults *mydefalut = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.1call.shareextension"];
NSData *myEncodedObject = [mydefalut objectForKey:@"chatviewcontrollerdata"];
self.arrModels = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
需要申请一个id Explicit类型的 前缀必须和容器id一致 配置group
若需要让app extension 使用 cocoa pods
必须配置cocoapod
如果要断点或者控制台输出必须在容器里跑
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。