自iOS8之后,苹果支撑了扩展(Extension)的开发,开发者能够经过体系供给给咱们的扩展接入点 (Extension point) 来为体系特定的服务供给某些附加的功用。苹果摊上新诉讼

但iOS14后,苹果更新了扩展组件,引入了新的UI组件:WidgetKit 而放弃了iOS14以下版别的Today Extension组件

开发须知

  • WidgetExtension 运用的是新的WidgetKit不同于Today W苹果13idget,它只能运用 SwiftUI 进行开发,所以需求SwiftUI和Swift根底变量值
  • Widg变量泵et只支撑3种标准systemSmall (2×2)、 systemMedium (4×2)苹果13systemLarge(4×4)
  • 默许点击Widget翻开主运用程序
  • Widget类似于Today Widget是一个独立工作的程序,json文件是干什么的需求在项目中进行swift代码是什么意思 App Groups 的设http协议置才干使其与主程序互通数据,这点与Tjson是什么意思oday Widget相同
  • Apple官方现已swift世界结算体系弃用json数据Today Extension,Xcode12现已不再供给Today Extension的增加,现已有Today Widget的运用则会闪现到一个特定的区域进行展现

WiSwiftdget官方阐明


Widget完毕

1.创立增加Widgjson数据et Extension

File -> New -> Target -> Widg变量名的命名规矩et Extension
iOS14 Widget小组件开发(Widget Extension)

Inclujson解析de Con变量英文figuration Intent

假定你所创立的Widget需求支撑用户自界说装备特色,则需求勾选这个(例如气json是什么意思候组件,用户能够选择城市;记事本组件,用户http署理记载信息等),不支撑的话则不用勾选

本文首要以json格局怎样翻开勾选用户装备特色的状况阐明

iOS14 Widget小组件开发(Widget Extension)

2.Widget文件函数解析

Provider

为小组件展现供给悉数必要信息的结构体,遵循TimelineProvid苹果xrer协议,发生一个时刻线,告诉 WidgetKit 何时烘托与改写 Widget,时刻线包括一个你界说的自界说Timejson格局转化lineEntry类型。时刻线条目标识了你期望WidgetKit更新Widget内容的日期。在自界说类型中包括你的Widget的视图需求烘托的特色。

struct Provider:json数据 TimelineProvider {
// 占位视图
func placeholder(in context: Contex苹果12t) -> SimpleEntry {
SimpleEntry(date: Date())
}
// 批改屏幕在左上角选择增加Widget、第一次展现时会调用该办法
func get苹果xrSnapshot(in context: Conte苹果12xt, comswift怎样读pletion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
completion(entry)
}
// 进行数据的预处理,转化成Entry
func getTimeline(in con变量的界说text: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the cu苹果官网rrent date.
let currentDate = Date()
for hourOffset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .hjson格局怎样翻开our, value: hourOfswifterfset, to: cuswifterrrentDate)!
let entry = SimpleEntry(date: entryDatehttp 404)
entries.append(entry)
}
let timeline = Timeline(swift体系entries: entries, policy: .atEnd)
completion(timeline)
}
}
  • placeholder:供给一个默许的视图,例如网络央求失利、发生不知道差错、第一次展现swifter小组件json格局转化都会展现这个view
  • getSswift体系napshot:为了在小部件库中闪现json数据jsonp部件http协议,WidgetKit要求供给者供给预览快照,在组件的增加页面能够看到作用
  • getTimeline:在这个办法内能够进行网络央求,拿到的数据保存在对应的entry中,调用completion之后会到改写小组件

    • 参数poli苹果官网cy:改写的机遇
    `.never`:不改写
    `.atEnd`:Timeline 中终究变量是什么意思一个 Entry 闪现完毕之后主动改写。Timeline 办法会从头调用
    `.after(date变量泵)`:抵达某个特定时刻后主动改写
    
    • !!!Widget 改写的时刻由体体系一抉择,假定需求强制改写Wswift体系idget,能够在 App 中运用 WidgetCenter 来从头加载全部时刻线:WidgetCenter.shhttp://www.baidu.comared.reloadAllTimelines()

Timeline的改写策http://192.168.1.1登录略是会推迟的,并不一定依据你设定的时刻精确改写。变量类型有哪些一起官方阐明晰每个widget窗口小部件每天接纳的改写都会有数量约束
TimelineProvjson数据ider官方阐明

Entry

烘托 Widget 所需的数据模型,需求遵循TimelineEntry协议。

struct SimpleEswiftlyntry: TimelineEntry {
let date: Date
}

EntryView

屏幕上 Widget 闪现的内容,能够针对不http://192.168.1.1登录同标准的 Widget 设置不同的 View。

st变量与函数ruct NowWidgetEntryView : View {swift体系
var entry: Provider.Entry
//针对不同标准的 Widget 设置不同的 View
@EnHTTPvironment(.widgetFamily)swift世界结算体系 var family // 标准环境变https和http的差异
@ViewBuijson解析lder
var body: some View {
switch family {
case .systemhttp://www.baidu.comSmall:
// 小标准
Text(entry.date, stylhttp://www.baidu.come: .time)
case .systemMedium:
// 中标准
default:
// 大标准
}
}
}

@main 主进口

@main
struct NowWidget: Widget {
let kind: String = "NowWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
No变量类型有哪些wWidgetEntjson数据ryView(entry: entry)
}
.c变量泵on苹果11figu苹果rationDisplayName("My Widget")
.description("This is a苹果13n eSwiftxample widget.")
//.supportedFamilies([.systemSmall,.systemMedium])
}
}
  • @main:代表着Widget的主进口,体系从这里加载,可用于多Widget完毕
  • kind:是Widget的仅有标识
  • WidgetConfiguration :初始化装备代码

    • StaticConfiguration : 能够在不需求用户json是什么意思任何输入的httpwatch状况下自行解析,能够在 Widget 的 App 中获 取相关数据并发送给 Widget
    • IntentConfiguration首要针对于具有用户可装备特色的Widget

,依赖于 App 的 Siri Intent,会主动接纳这些 Int变量泵ent 并用于更新 Widget,用于构建动苹果11态 Widget

  • c变量onfigurationDisplayName:增加批改界面展现的标题
  • description苹果x增加批改界面展现的描述内容
  • supportedFamilies:设置Widget支撑的控件巨细,不设置则默许三个样式都完毕
Widget控件标准巨细
屏幕标准(portrait) Small widget Medium widget Large widget
414×896 pt 169×169 pt 360×169 pt 360×376 pt
375×812http://www.baidu.com pt 155×155 pt 329×155 pjson格局转化t 329×345 pt
414x变量名的命名规矩736 pt 159×159 pt 348×15json9 pt 348×357 pt
375×667 pt 148×148 pt 322×148 pt 322×324json数据 pt
320×568 pt 141×14变量1 pt 291×141 pt 291×299 pt

3.多Widget组件完毕

一个Widhttpclientget只能完毕大中小三个不同标准的组件办法苹果xr,假定现有需求要做不同功用并苹果12且相同标准标准的组件JSON则需求完毕多组件

1.经过批改原Widget进口文件办法增加更多装备来支撑变量名多个Widget

@main
str苹果13uct NowS苹果wiftWidget: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
NowPosterWidget()
Nowjson是什么意思RecommendWidget()
NowDailyWidget()
}
}

2.另建SwiftUI文件结json解析束组件功用,并去除@main,批改相同函数名

struct NowPosterWidget: Widget {
private let kind: String =swiftcode是什么意思中文 "NowPosterWidget"
public var body: some WidgeswiftstacktConfiguration {
StaticConfiguration(kind: kind, provider: PosterProvider()) { entry in
NowPosterWidgetEntryView(entry: entry)
}
.configurationDisplayName("格言")
.description("Now冥想每日海报、日签小组件")
.supportedF变量名的命名规矩amilies([.systemSmall,.systemMedium])
}
}

4.Widget数据央求及网络图片加载

1).新建一个swift文件,用于单独处理数据
2)swiftly.创立网络央求的数据模型
struct Poster {
let author: String
let content: String
var posterImage: UIImage? =变量的指针其意义是指该变量的 UIImage(named: "plan_collect")
}

并在Widget页面中Entry中绑定对应的模型swift世界结算体系

struct PosterEntry: TimelineEntry {
let date: Date
let poster: Poster
}
3).创立央求函数,并且回调央求参数http 500,声明一个央求东西,完毕数据央求并将网络图片同步变量的指针其意义是指该变量的苹果摊上新诉讼

假定主APP用的swift编写,能够将网络央求模块文件同json数据享或pods库同享(办法后文会介绍swiftly
posterFromJs苹果电影on此数据模苹果x型转化办法仅适用简易接口(为了偷闲‍♀️),杂乱数据模型仍是用HandyJSONKaKaJson解析

若用第三方模型转化办法,图片的同步央求处理放置于getTodayPoster的央求中同步处理即可

strhttpclientuct PosterData {
static func苹果手机 getTodayPoster(completion: @escapi变量名的命名规矩ng (Res变量名的命名规矩ult<Poster, Error>苹果手机) -> Void) {苹果手机
let url = URL(sjson是什么意思tring: "https:https和http的差异//nowapi.navoinfo.cnjson格局怎样翻开/get/now/today")!
let tajsonsk = URLSes苹果xrsion.shared.dataTask(with: urljson格局怎样翻开) { (变量名的命名规矩dhttp协议ata, response, error) in
guard error==nil else{
completion(.failure(error!))
return
}
let poster=phttp://www.baidu.comosterFromJson(fromData: data!)
completion(.succhttpclientess(postjson格局转化er))
}
task.resume()
}
static func posterFromJson(fromData data:Data) -> Poster {
let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Ahttp://192.168.1.1登录ny]
guard let result = json["result"]苹果 as? [String: Any] else{
return Poster(author: "Nhttp 404ow", content: "加载失利")
}
let authorHTTP = result["author"] as! String
let content = result["celebrated"] as! String
let posterImage = result["poster_image"] as! String
//图片同步央求
var image: UII变量泵mage? = nil
if l变量值et imageData = tryhttp协议? Data(contentsOf: URL(string: posterImage)!) {
image = UIImage(data: imageData)
}
return Pojson数据sterswifter(author: author, contenthttp://192.168.1.1登录: content, posterImage: image)
}
}

SwiftUI中的Image没有供给直接加载URjsonpL办法的图片闪现

getTimeline中进行数据央求中completion(timelinjson解析e)实行完之后苹果11,不再支撑图片的异步回调,用异步加载json格局的办法苹果电影就无法加载网络图片,所以有必要在数据央求回来的处理中选用同步办法,将图片的data获取,转化成UIImage,在赋值给Image展现

4).数据加载处理
func getTimeline(in context: Context, co变量是什么意思mpletion: @escaping (Timeline<Entry变量类型有哪些>) -> ()) {
let currentDate = Date()
//设定1小时更新一次数据
let updateDate = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
PosterData.getToswift体系dayPoster { result in
let poster: Poster
if case .success(let fetchedData) = result{
poster = fetchedData
}else{
poster=Poster(author: "Now", content: "Nswiftstackow格言")变量是什么意思;
}
let entry = Entry(date: currentDate, poster: poster)
let timeline = Timeline(entries: [entry], policy: .after(苹果xupdateDate苹果官网))
completion(timeline)
}
}
5).页面建立展现
struct NowPosterWidgetEntryView : View {
var entry: PosterProvider.Entry
var body: some View {
ZSta苹果13ck{
Image(uiImage: entry.postehttpclientr.posterImhttp署理age!)
.resizable()
.frame(minWidth: 169, maxWidth: .infinity, minHeight: 169, maxHeight: .infinity, alignment: .center)
.scaledToFill()
.edgesIgnoringSafeArehttp 404a(.all)
.aspectRatio(contentMode: .fill)
Text(entry.poster.content)
.foregroundColor(Coswiftcode是什么意思中文lor.white苹果xr)
.lineLimit(4)swiftcode是什么意思中文
.fohttp://www.baidu.comnt(.system(size: 14))
.pswiftcode是什么意思中文addingjson是什么意思(.horizontal)
}
.widgetURL(URL(string: "跳转链接"))
}
}

然后更新补全placeholder getSnapshot Previews处相应的Entry即完毕Widget内容展现

iOS14 Widget小组件开发(Widget Extension)

5.Widget点击交互

点击Widget窗口引发APP进行交互指定跳转支撑两种办法:

  • widgetURL:点击区域是Widget的全部区域,适宜元素、逻辑json是什么意思简略的小部件
  • Link:经过Link修饰,容许让界面上不同元素发生点击呼应

Widgswift代码et三种标准标准中

  • systemSmall只能用widgetURL完毕URL传递接https和http的差异
var body: some View {
ZStack{
//UI编写
}
.widgetURL(URL(string: "跳转链接widgetURL苹果13"))
}
  • systemMediumsystemLarge能够用Link或许widgetUrl处理
var body: some View {
Link(destination: URL(string: "跳转链接Link")!){
VStac苹果k{
//UI编写
}
}
}

接纳办法
APPDelegate中接纳回来的URL

//swift
func application(_ app: UIApplication, open url: URL, options变量的界说: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
}
//OC
-(BOOL)applicjsonpation:(UIApplication *)app openURL:(json文件是干什么的NSURL *变量名)url options:(NSDictionary<jsonUIApplicationOpenURLOpthttp署理ionsKey,id> *)options{
if ([url.scheme苹果电影 isEqualToString:@swift体系"NowWidget"]){
//实行跳转后变量泵的操作
}json解析
ret苹果11urn YES;
}

假定项目完毕了SceneDelegate 则需求在SceneDelegate里面完毕跳转处理

func scene(_ scene: UIScene, openURLCojson格局怎样翻开ntexts URLContexts: Set<UIOpenUjson格局怎样翻开Rjson格局转化LContext>) {
for context in URLConSwifttexts {
print(context.url)
}
}


数据同享

由于widget跟APP间互相独立,假定想用相同的数据则需求两者间数据同享,创立 App Group
主APP中 Target -> Siswift体系gning & Capability -> +Capability -&json数据gt; 增加 App Group
iOS14 Widget小组件开发(Widget Extension)

ps:网上说的还需创立恳求 APPID 但在开启主动处理 Automatically mana苹果12ge signing的状况下xcode会主动给你创立相关联的APPID

两者间的数据同享首要经过UserDefaults FileManager 两种办法。
以OC中运用UserDefaults同享数据为例

//存苹果官网数据
Njson文件是干什么的SUserDefaults *userDefaultsswift代码 = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.imoblife.now"];
[userDefaults setObject:@"content" forKey:@"widget"];
[userDefaults sy苹果官网nchronize];
//取数据
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.imoblife.now"];
NSStrin变量与函数g *content = [userDefaultjson解析s objectForKey:@"widget"];

oc、swift混编调用


文件同享及pods同享
  • 文件同享

iOS14 Widget小组件开发(Widget Extension)
勾选同享w变量是什么意思idget选项即可

  • pods同享

正常运用下widget中无法运用pods导入的第三Swift方SDK如Masonry等,会构成布局等极点不方便,因此需求同享pods,在Podfile中需求另设置并从头install

source 'https://github.com/CocoaPods/Specs.giswiftstackt'
platform :ios,swift世界结算体系 '9.0'
inhibit_allswift怎样读_w变量类型有哪些arnings!
use_frameworks!
#同享Hanjson格局转化dyJSON
def share_pods
pod 'HandyJSON'
end
targe变量英文t "targetName" do
pod 'Alamofire'
share_pods
end
target "widgetTargetNswift代码是什么意思ame" do
share_pods
end

完毕后即可运用pods中的第三方SDK了

Pods第三方SDK运用差错提示
假定在pods导入同享第三方库,或许运用[UIApplication sharedApplication]办法报错如下时

not available on iOS (App Extension) – Use view controller based solutions where变量是什么意思 appropriate instead.

则需求在pods Target里面,选中犯错的SDK并点击buildSettings 搜索Require
然后把Require Only App-Extension-Safe API 然后把YES改为**NO**即可
iOS14 Widget小组件开发(Widget Extension)
ps:工程项目里也可按照这个办法去排查原因