iOS Widget开发

2024-06-06 14:18
文章标签 开发 ios widget

本文主要是介绍iOS Widget开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

好久没有更新博客了,我现在是做阅读APP的,产品经理让我加一个widget书架功能,在widget的列表中添加我们自己分栏,分栏显示最近阅读三本小说的信息,由于是临时加的功能所以一开始没有调研走了很多弯路,现在开发完成,所以与大家分享下,希望可以你其他猿们有所帮助,如果有建议可以通过以下方式回复我

联系方式:

QQ:931637933  

163邮箱:jutiefeng123@163.com  

微信:j136845  

如果大家有意向可以加入我的 QQ群:255217300


好了言归正传,上码。

首先我们先新建一个工程,这一步就省略了,接下来我们增加一个target,选择Today Extension

图1

 

图2

创建完之后如图



这个时候运行会看到



Xcode默认创建MainInterface.storyboard来构建UI。

采用Xcode默认模板创建Widget时会自动把ViewController文件命名设置为“TodayViewController”.当然这个ViewController命名其实是可以修改的,唯一值得注意的修改该ViewController文件命名后还需要设置NSExtensionPrincipalClass的值与其保持一致即可.不然Widget编译时会报找不到对应入口.

如果想纯代码编写UI,可以删除storyboard文件采用纯代码方式来进行构建,删除完后之后注意需要找到Supporting Files下面的Info.plist中NSExtension字段做如下两个操作:

A:直接删除NSExtensionMainStoryboard字段

B:添加NSExtensionPrincipalClass字段 并设为TodayViewController

调整布局

Widget里面的视图默认居左居下都会有一定距离的间隔,可以采用如下方式取消间隔,使布局区域填充整个Widget

//一般默认的View是从图标的右边开始的...如果你想变换,就要实现这个方法

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {

//    系统默认的布局是 UIEdgeInsetsMake(0.0,48, 39, 0);

NSLog(NSStringFromUIEdgeInsets(defaultMarginInsets));

returnUIEdgeInsetsZero;

}


NEXT

我们看下containing app跟extension如何共享数据,例如我containing app里的数据,我要在extension显示。在这之前,我们要先讲下app groups,它主要用于同一group下的app共享同一份读写空间,以实现数据共享。我们看下工程中如何开启app groups,首先们选择targets,然后选择containing app,->Capabilities,打开app groups的开关,如下图:


点下面的加号按钮,新建一个group,例如:group.com.kedll.TestWight,如下图:


创建完后如下图:


同理,选择targets为extension,同样创建一个app groups,选择跟containing app一样的名字,就是containing app里的app groups跟extension里的app groups名字相同,如下图:


app groups创建好后,就可以实现数据共享了,

第一种方法是通过NSUserDefaults,存数据代码如下:

注意事项:

因为Widget和APP相当于两个项目,所以呢,在创建文件的时候,要注意如果你创建的文件是处理Widget和APP之间数据共通的,那么请记住以下选择


一定要两个都勾选


代码呢就很简单了,那我个人是比较喜欢数据封装到一个manager类里面

注意事项:这个groupID 一定要和刚才你项目plist表中的名字一样不然你是无法正确操作数据的

App中保存数据调用save方法,

在Widget的todayviewController(Widget默认视图控制器)里面,这个controller的didloadview方法一开始运行的时候运行一次,willapear里面是下拉一次today走一次,所以你的getWidgetData方法可以写在这个里面,那么页面刷新就可以写在这个getWidgetData方法调用后面,记得

        self.preferredContentSize = CGSizeMake(SCREEN_WIDTH, self.widgetArr.count*70);

这行代码一定要写,除非你不想显示你Widget你app分组下的页面,不然你必须要设置这个值


那么怎么从Widget进入app?

首先设置白名单,URLtype,设置scheme:KentWidget

答案只有一句API

    NSString *widgetURL = [NSString stringWithFormat:@"KentWidget://"];

    NSURL*url = [NSURL URLWithString:widgetURL];

  

    [self.extensionContext openURL:url completionHandler:^(BOOL success) {

     

    }];}

//后面可以传一些你要的参数,不好意思的是只能传递string

那么它的回调方法,和回调数据在哪怎么处理呢

毫无疑问白名单的回调一定在appdelegate里

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

    ELog(@"url:%@",url);


    return [self appCallbackWithopenUrl:url];

}


- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)option

{

    return [self appCallbackWithopenUrl:url];

}

以上两个方法区别于不同版本,具体的大家自己试一下,这里给大家一个小小的悬念吧,勿喷啊

-(BOOL)appCallbackWithopenUrl:(NSURL *)url{

 if ([url.schemeisEqualToString:@"KentWidget"]){

            if (!_homeController.isWidgetFlag)

            {

                self.widgetHost = url.host;


                [self pushReadForWidget];

            }

    }

    return YES;

}


总结一下,大家需要注意以下几点:

1,groupID保持一致

2,添加文件和创建类的时候记得勾选Widget

3,刷新数据需要在todayviewController的didload和willapear里面都要写

4,self.preferredContentSize一定要设置

5,打包出来后,widget的icon一直不显示,找了半天,后来把widget隐藏,在弄出来,妹的,icon又显示了。原来我是通过itools导进手机的,widget默认显示,widget没加载,所以icon就显示不出来了这个只是尝试设置,和这个没关系


联系方式:

QQ:931637933  

163邮箱:jutiefeng123@163.com  

微信:j136845  

如果大家有意向可以加入我的 QQ群:255217300




这篇关于iOS Widget开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036349

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁