OC项目创建iOS 14 Widget 时编译报错

本文记录了一位开发者在创建iOS Widget时遇到的编译错误和类型协议不符合的问题。首先,由于项目最低版本设置为iOS15导致编译失败,修改为iOS14后问题解决。接着,出现`Provider`不遵循`IntentTimelineProvider`协议以及找不到`ConfigurationIntent`的错误。原因是ClassPrefix导致Xcode自动生成的Swift文件名与预期不符。通过修改代码中`ConfigurationIntent`为工程前缀`CNConfigurationIntent`并引入桥接头文件解决了此问题。最后,桥接文件引入`CNConfigurationIntent.h`修复了OC文件与Swift协议不兼容的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

最近产品要做一个Widget小组件,产品的要求必须安排。于是我新创建了一个OC项目,然后创建了一个Widget Extension。直接运行编译,发编译器报以下错误:
ld: Assertion failed: (reconstituted == (accumulator - _options.machHeaderVmAddr())), function setFixup64, file OutputFile.cpp, line 2864.

ld: Assertion failed: (reconstituted == (accumulator - _options.machHeaderVmAddr())), function setFixup64, file OutputFile.cpp, line 2864.

解决过程

查找资料在官方论坛发现了同样错误,但是没有给出解决方案。
后面通过修改了项目的Projet 支持的最低版本由iOS 15 改为iOS14可以编译通过。
在这里插入图片描述
解决了这个错误之后,发现编译还是有其他错误。
编译报错提示:
1、Type ‘Provider’ does not conform to protocol ‘IntentTimelineProvider’
2、Cannot find ‘ConfigurationIntent’ in scope

Type 'Provider' does not conform to protocol 'IntentTimelineProvider'
Cannot find 'ConfigurationIntent' in scope

在这里插入图片描述
查找资料才知道原因是:
我们在工程中设置了Class Prefix,我的项目设置的是CN
在这里插入图片描述

导致Xcode自动生成的是CNConfigurationIntent.swift,该文件路径是:

/Users/用户名/Library/Developer/Xcode/DerivedData/项目名称/Build/Intermediates.noindex/项目名称.build/Debug-iphonesimulator/widget的名称Extension.build/DerivedSources/IntentDefinitionGenerated/widget的名称/CNConfigurationIntent.swift

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
但是自动生成的代码又是ConfigurationIntent,只需要把代码中的ConfigurationIntent都改为工程前缀+ConfigurationIntent(CNConfigurationIntent)就可以正常运行了。
在这里插入图片描述

因为项目主工程是OC,我们在Widget中创建了两个OC文件与桥接文件CNHotWidget-Bridging-Header后,编译发现又开始报错。

Type 'Provider' does not conform to protocol 'IntentTimelineProvider'
Cannot find 'CNConfigurationIntent' in scope

在这里插入图片描述
解决这个问题,需要我们在桥接文件CNHotWidget-Bridging-Header中引入#import "CNConfigurationIntent.h"
在这里插入图片描述

### 如何在 Xcode 中创建 Objective-C iOS 项目 #### 打开 Xcode 并启动新项目 为了开始一个新的 Objective-C iOS 项目,在 Mac 上打开 Xcode 软件并单击 "Create a new Xcode project" 来创建新的 Xcode 工程[^1]。 #### 选择模板 当进入新建项目的界面,应该看到多个可用的应用程序模板列表。对于 iOS 应用开发,选择 "App" 这一选项来构建基于视图控制器的应用程序框架。这一步骤提供了用于快速建立应用程序的基础结构[^4]。 #### 配置项目细节 点击下一步后会进入到配置页面: - **Product Name**: 输入想要给应用起的名字。 - **Team**: 如果有 Apple 开发者账号,则可以选择对应的团队;如果没有,暂留空即可继续操作。 - **Organization Identifier**: 类似于反向域名的形式,通常以公司或个人网站为基础设置唯一标识符(例如 com.example)。 - **Bundle Identifier**: 自动生成,默认情况下不需要修改。 - **Language**: 此处应选择 `Objective-C` 作为编程语言。 - **User Interface**: 可以选择 Storyboard 或 SwiftUI。由于目标是使用 Objective-C 编码,建议选择 Storyboard 方式来进行用户界面设计。 - **Include Tests/Include UI Tests**: 根据需求决定是否加入单元测试和UI自动化测试支持。 完成上述填写之后点击 “Next”,然后指定保存位置以及版本控制系统的选择(Git 是常用的选择),最后确认无误便能正式创建项目文件夹及其内部资源[^5]。 ```objc // AppDelegate.m 文件中的简单示例代码片段展示如何初始化窗口对象 #import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor whiteColor]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; return YES; } @end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装自己很用心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值