iOS Widget开发,这可能是目前最全的,前端开发

*/

  • (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {

if(activeDisplayMode == NCWidgetDisplayModeCompact) {

// 尺寸只设置高度即可,因为宽度是固定的,设置了也不会有效果

self.preferredContentSize = CGSizeMake(0, 110);

} else {

self.preferredContentSize = CGSizeMake(0, 310);

}

}

  • 在设置 UI 的过程中,若想使用本体 Target 中的类:

在对应类的 Target Membership 勾选 Widget 即可

  • 如果想使用Pod 管理的第三方库,那么只需要以下三步就可以愉快地玩耍了(比如我想使用 Masonry 布局)

1、 在podfile文件中

2、 按照如图所示配置configurations

3、 最后分别配置两个 Target 的 link Binanry

当然有些第三方包含 source 文件的可能还需要别的操作,最简单粗暴的方式就是–>拖进去!

  • 使用图片也是必不可少,然而 imageNamed: 和 imageWithContentsOfFile: 两种方式加载都不行,即使设置了文件的 target 为 Widget Extension,后来在其target 内部建立一个 .xcassets 文件即可加载图片

  • 然而在 Widget Extension 里面新建类又出现了如下报错

  • 造成这个的原因是新建的时候默认是 C header,而且没有指向对应的target,按照下图所示修改一下type,选一下target,再次编译就木有问题了

  • 如果需要网络请求,记住在 Extension 的plist文件中添加App Transport Security Settings 属性

  • 在开发过程中,那么怎么一直有个“Hello World”显示,最后看了一下原来是 Storyboard 加载,去 Storyboard 文件删除对应 label 即可

  • 如果你的项目中要求纯代码

  • 删除 Storyboard 文件和plist 对应键值对

  • 添加 NSExtensionPrincipalClass 字段并设置为 TodayViewController


三、与 App 本体交互

与本体 app 进行交互之前,要明白的一个概念是:Widget 与 app 本身 是两个target,appId 也是独立的,因此 Widget 与本体 app 是通过 app group 进行交互

1、设置群组关系

在 本体 App 的 target > Capabilities添加 container 标识符

这个写好之后,再去扩展的target做相同的操作,标识符一定要一样!!

切换 target 的方法在这里

  • 报错信息:[_NCWidgetExtensionContext openURL:completionHandler:]_block_invoke failed: Error Domain=NSOSStatusErrorDomain Code=-50 "(null) 如果报这个错说明 urlScheme有问题,没有标准对应,比如下划线识别等
2、设置 scheme 进行交互
  • 设置 app 的 scheme 标识符

在plist 文件内添加以下键值对

  • 然后!就可以在 Widget 对应的点击事件里面

// 扫一扫按钮的点击事件

  • (void)scanBtnTapped:(UIButton *)sender {

[self.extensionContext openURL:[NSURL URLWithString:@“wpfWidgetTest://action=richScan”] completionHandler:^(BOOL success) {

NSLog(@“scanBtnTapped open url result:%d”,success);

}];

}

  • 在 app 本体的 AppDelegate 方法里面

// 处理 Widget 相关事件

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

NSString* prefix = @“wpfWidgetTest://action=”;

NSString *urlString = [url absoluteString];

if ([urlString rangeOfString:prefix].location != NSNotFound) {

NSString *action = [urlString substringFromIndex:prefix.length];

if ([action isEqualToString:@“richScan”]) {

// 进入到扫一扫页面

[self.rootVC transferToRichScanVC];

} else if ([action isEqualToString:@“web”]) {

// 进入到 web 活动页

[self.rootVC transferToWebVCWithUrlString:@“webTest”];

}

}

return YES;

}

  • 数据共享:widget项目必然经常要和主项目共享数据,可以通过NSUserDefault,注意和平时用有些不同,创建UserDefault的时候,要指定groupid。上代码:

// widget项目里取数据

  • (NSString*)widgetStringForKey:(NSString*)defaultName {

NSUserDefaults*shared = [[NSUserDefaultsalloc] initWithSuiteName:@“group.com.widgetTest”];

return[shared stringForKey:defaultName];

}

// 主项目里存数据

  • (void)widgetSetObject:(id)value forKey:(NSString*)defaultName {

NSUserDefaults*shared = [[NSUserDefaultsalloc] initWithSuiteName:@“group.com.widgetTest”];

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

性能优化

1.webpack打包文件体积过大?(最终打包为一个js文件)

2.如何优化webpack构建的性能

3.移动端的性能优化

4.Vue的SPA 如何优化加载速度

5.移动端300ms延迟

6.页面的重构

所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】


e_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1Z28yMzM=,size_16,color_FFFFFF,t_70)

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值