前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >share extension

share extension

原创
作者头像
conanma
修改2021-05-11 14:38:20
8670
修改2021-05-11 14:38:20
举报
文章被收录于专栏:正则正则

创建一个 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

  1. 项目下 选择project 并非target  选择-info-configurations-配置 debug 和 release
  2. 在app extension里的general-linked frameworks and libraries 添加libpods静态库

如果要断点或者控制台输出必须在容器里跑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档