Swift:不使用WidgetBundle时如何调整组件库中Widget的顺序?
场景
我的应用包含多个Widget,其中仅部分需要访问位置信息。为了让系统只对需要位置权限的Widget发起权限请求,我将Widget拆分到了两个独立的扩展目标中,但这样就无法通过WidgetBundle来控制组件库中Widget的显示顺序了。
问题
在拥有两个Widget扩展的情况下,有没有其他方法可以指定组件库中Widget的排列顺序?
已尝试方案
- 创建一个Swift文件并添加到两个扩展的目标成员中,参考WidgetBundle的实现方式,将该类设为两个扩展的唯一
@main,希望按类中列表顺序显示Widget,但Xcode提示Widget超出作用域,即便目标成员设置正确。 - 调整项目中的目标顺序,期望Widget顺序随之改变,但未达到预期效果。
可行解决方案
目前苹果官方并未提供直接控制多扩展Widget排序的API,以下是开发者社区总结的可行间接方案:
1. 调整扩展Bundle ID的字典序
系统组件库中对不同扩展的Widget排序会参考扩展的Bundle ID字典序。你可以修改两个扩展的Bundle ID,让需要排在前面的扩展使用字典序更靠前的ID(例如把优先显示的扩展ID设为com.yourapp.widgets.priority,另一个设为com.yourapp.widgets.secondary)。
2. 统一设置Widget的kind属性字典序
虽然官方未明确说明,但部分开发者反馈,组件库中同一扩展内的Widget会按kind的字典序排列,不同扩展的整体排序也可能与扩展内Widget的kind间接相关。可以按期望顺序给所有Widget设置字典序靠前的kind值,来影响整体排序。
3. 权限拆分+单扩展内WidgetBundle控制
如果场景允许,将所有需要位置权限的Widget集中到同一个扩展,不需要权限的放在另一个扩展。然后在有权限的扩展中使用WidgetBundle控制该扩展内Widget的顺序,两个扩展的整体顺序通过Bundle ID调整。这样既保留了权限拆分的优势,又能控制部分Widget的顺序。
注意:以上方案均来自开发者实践总结,并非苹果官方明确支持的规则,不同iOS版本可能存在差异,建议在多个版本上测试验证。
内容的提问来源于stack exchange,提问作者Joseph Saroufim

