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

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件