IOS CoreText.framework --- 基本用法

本文深入介绍了Apple的CoreText框架,涵盖了其核心类的功能与用法,如CTFont和CTFrame等,并提供了设置字体属性的示例代码。

转自:http://blog.youkuaiyun.com/fengsh998/article/details/8691823

API接口文档。

https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html


CoreText 框架中最常用的几个类:

  1. CTFont
  2. CTFontCollection
  3. CTFontDescriptor
  4. CTFrame
  5. CTFramesetter
  6. CTGlyphInfo
  7. CTLine
  8. CTParagraphStyle
  9. CTRun
  10. CTTextTab
  11. CTTypesetter

先来了解一下该框架的整体视窗组合图:


CTFrame 作为一个整体的画布(Canvas),其中由行(CTLine)组成,而每行可以分为一个或多个小方块(CTRun)。

注意:你不需要自己创建CTRun,Core Text将根据NSAttributedString的属性来自动创建CTRun。每个CTRun对象对应不同的属性,正因此,你可以自由的控制字体、颜色、字间距等等信息。

通常处理步聚:

1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。


字体的基本知识:

字体(Font):是一系列字号、样式和磅值相同的字符(例如:10磅黑体Palatino)。现多被视为字样的同义词

字面(Face):是所有字号的磅值和格式的综合

字体集(Font family):是一组相关字体(例如:Franklin family包括Franklin Gothic、Fran-klinHeavy和Franklin Compressed)

磅值(Weight):用于描述字体粗度。典型的磅值,从最粗到最细,有极细、细、book、中等、半粗、粗、较粗、极粗

样式(Style):字形有三种形式:Roman type是直体;oblique type是斜体;utakuc type是斜体兼曲线(比Roman type更像书法体)。

x高度(X height):指小写字母的平均高度(以x为基准)。磅值相同的两字母,x高度越大的字母看起来比x高度小的字母要大

Cap高度(Cap height):与x高度相似。指大写字母的平均高度(以C为基准)

下行字母(Descender):例如在字母q中,基线以下的字母部分叫下伸部分

上行字母(Ascender):x高度以上的部分(比如字母b)叫做上伸部分

基线(Baseline):通常在x、v、b、m下的那条线

描边(Stroke):组成字符的线或曲线。可以加粗或改变字符形状

衬线(Serif):用来使字符更可视的一条水平线。如字母左上角和下部的水平线。

无衬线(Sans Serif):可以让排字员不使用衬线装饰。

方形字(Block):这种字体的笔画使字符看起来比无衬线字更显眼,但还不到常见的衬线字的程度。例如Lubalin Graph就是方形字,这种字看起来好像是木头块刻的一样

手写体脚本(Calligraphic script):是一种仿效手写体的字体。例如Murray Hill或者Fraktur字体

艺术字(Decorative):像绘画般的字体

Pi符号(Pisymbol):非标准的字母数字字符的特殊符号。例如Wingdings和Mathematical Pi

连写(Ligature):是一系列连写字母如fi、fl、ffi或ffl。由于字些字母形状的原因经常被连写,故排字员已习惯将它们连写。




字符属性名称:

</pre><pre class="declaration" name="code" style="white-space: pre-wrap; word-wrap: break-word; line-height: 26px; margin: 0em 0.333em 1em 0.5em; font-size: 13px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102); background-color: rgb(255, 255, 255);">const CFStringRef kCTCharacterShapeAttributeName;              
//字体形状属性  必须是CFNumberRef对象默认为0,非0则对应相应的字符形状定义,如1表示传统字符形状
<pre class="declaration" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin: 0em 0.333em 1em 0.5em; font-family: Courier, Consolas, monospace; background-color: rgb(255, 255, 255);">const CFStringRef kCTFontAttributeName;                        
 
//字体属性   必须是CTFont对象
const CFStringRef kCTKernAttributeName;                        
//字符间隔属性 必须是CFNumberRef对象
const CFStringRef kCTLigatureAttributeName;                 
//<span style="font-family: Verdana;">设置是否使用连字属性,设置为0,表示不使用连字属性。标准的英文连字有FI,FL.默认值为1,既是使用标准连字。也就是当搜索到f时候,会把fl当成一个文字。</span>必须是CFNumberRef 默认为1,可取0,1,2
const CFStringRef kCTForegroundColorAttributeName;             
//字体颜色属性  必须是CGColor对象,默认为black
const CFStringRef kCTForegroundColorFromContextAttributeName; 
 //上下文的字体颜色属性 必须为CFBooleanRef 默认为False,
const CFStringRef kCTParagraphStyleAttributeName;              
//段落样式属性 必须是CTParagraphStyle对象 默认为NIL
const CFStringRef kCTStrokeWidthAttributeName;              
//笔画线条宽度 必须是CFNumberRef对象,默为0.0f,标准为3.0f
const CFStringRef kCTStrokeColorAttributeName;              
//笔画的颜色属性 必须是CGColorRef 对象,默认为前景色
const CFStringRef kCTSuperscriptAttributeName;              
//设置字体的上下标属性 必须是CFNumberRef对象 默认为0,可为-1为下标,1为上标,需要字体支持才行。如排列组合的样式Cn1
const CFStringRef kCTUnderlineColorAttributeName;           
//字体下划线颜色属性 必须是CGColorRef对象,默认为前景色
const CFStringRef kCTUnderlineStyleAttributeName;           
//字体下划线样式属性 必须是CFNumberRef对象,默为kCTUnderlineStyleNone 可以通过CTUnderlineStypleModifiers 进行修改下划线风格
const CFStringRef kCTVerticalFormsAttributeName;
//文字的字形方向属性 必须是CFBooleanRef 默认为false,false表示水平方向,true表示竖直方向
const CFStringRef kCTGlyphInfoAttributeName;
//字体信息属性 必须是CTGlyphInfo对象
const CFStringRef kCTRunDelegateAttributeName
//CTRun 委托属性 必须是CTRunDelegate对象
举例说明:

[cpp]  view plain copy
  1. NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc]initWithString:@"This is a test of characterAttribute. 中文字符"];  


[cpp]  view plain copy
  1. //设置字体属性  
  2.   CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"), 40, NULL);  
  3.   [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];   

[cpp]  view plain copy
  1. //设置斜体字  
  2.     CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);  
  3.     [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];  

[cpp]  view plain copy
  1. //下划线  
  2.     [mabstring addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:NSMakeRange(0, 4)];   

[cpp]  view plain copy
  1. //下划线颜色  
  2.     [mabstring addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 4)];  


[cpp]  view plain copy
  1. //设置字体简隔 eg:test   
  2.     long number = 10;  
  3.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);  
  4.     [mabstring addAttribute:(id)kCTKernAttributeName value:(id)num range:NSMakeRange(10, 4)];  

[cpp]  view plain copy
  1. //设置连字  
  2. long number = 1;  
  3.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);  
  4.     [mabstring addAttribute:(id)kCTLigatureAttributeName value:(id)num range:NSMakeRange(0, [str length])];  
连字还不会使用,未看到效果。
[cpp]  view plain copy
  1. //设置字体颜色  
  2.     [mabstring addAttribute:(id)kCTForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 9)];  

[cpp]  view plain copy
  1. //设置字体颜色为前影色  
  2.     CFBooleanRef flag = kCFBooleanTrue;  
  3.     [mabstring addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(id)flag range:NSMakeRange(5, 10)];  
无明显效果。

[cpp]  view plain copy
  1. //设置空心字  
  2.     long number = 2;  
  3.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);  
  4.     [mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(id)num range:NSMakeRange(0, [str length])];  

[cpp]  view plain copy
  1. //设置空心字  
  2.     long number = 2;  
  3.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);  
  4.     [mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(id)num range:NSMakeRange(0, [str length])];  
  5.        
  6.     //设置空心字颜色  
  7.     [mabstring addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(0, [str length])];  

在设置空心字颜色时,必须先将字体高为空心,否则设置颜色是没有效果的。

[cpp]  view plain copy
  1. //对同一段字体进行多属性设置      
  2.     //红色  
  3.     NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];  
  4.     //斜体  
  5.     CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 40, NULL);  
  6.     [attributes setObject:(id)font forKey:(id)kCTFontAttributeName];  
  7.     //下划线  
  8.     [attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];  
  9.       
  10.     [mabstring addAttributes:attributes range:NSMakeRange(0, 4)];  

最后是draw了。

[cpp]  view plain copy
  1. -(void)characterAttribute  
  2. {  
  3.     NSString *str = @"This is a test of characterAttribute. 中文字符";  
  4.     NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc]initWithString:str];  
  5.       
  6.     [mabstring beginEditing];  
  7.     /* 
  8.     long number = 1; 
  9.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number); 
  10.     [mabstring addAttribute:(id)kCTCharacterShapeAttributeName value:(id)num range:NSMakeRange(0, 4)]; 
  11.     */  
  12.     /* 
  13.     //设置字体属性 
  14.     CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"), 40, NULL); 
  15.     [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)]; 
  16.     */  
  17.     /* 
  18.     //设置字体简隔 eg:test  
  19.     long number = 10; 
  20.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number); 
  21.     [mabstring addAttribute:(id)kCTKernAttributeName value:(id)num range:NSMakeRange(10, 4)]; 
  22.     */  
  23.   
  24.     /* 
  25.     long number = 1; 
  26.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number); 
  27.     [mabstring addAttribute:(id)kCTLigatureAttributeName value:(id)num range:NSMakeRange(0, [str length])]; 
  28.      */  
  29.     /* 
  30.     //设置字体颜色 
  31.     [mabstring addAttribute:(id)kCTForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 9)]; 
  32.      */  
  33.     /* 
  34.     //设置字体颜色为前影色 
  35.     CFBooleanRef flag = kCFBooleanTrue; 
  36.     [mabstring addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(id)flag range:NSMakeRange(5, 10)]; 
  37.      */  
  38.       
  39.     /* 
  40.     //设置空心字 
  41.     long number = 2; 
  42.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number); 
  43.     [mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(id)num range:NSMakeRange(0, [str length])]; 
  44.       
  45.     //设置空心字颜色 
  46.     [mabstring addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(0, [str length])]; 
  47.      */  
  48.       
  49.     /* 
  50.     long number = 1; 
  51.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number); 
  52.     [mabstring addAttribute:(id)kCTSuperscriptAttributeName value:(id)num range:NSMakeRange(3, 1)]; 
  53.     */  
  54.       
  55.     /* 
  56.     //设置斜体字 
  57.     CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL); 
  58.     [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)]; 
  59.     */   
  60.       
  61.     /* 
  62.     //下划线 
  63.     [mabstring addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:NSMakeRange(0, 4)];  
  64.     //下划线颜色 
  65.     [mabstring addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 4)]; 
  66.      */  
  67.       
  68.       
  69.       
  70.     //对同一段字体进行多属性设置      
  71.     //红色  
  72.     NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];  
  73.     //斜体  
  74.     CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 40, NULL);  
  75.     [attributes setObject:(id)font forKey:(id)kCTFontAttributeName];  
  76.     //下划线  
  77.     [attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];  
  78.       
  79.     [mabstring addAttributes:attributes range:NSMakeRange(0, 4)];  
  80.        
  81.   
  82.       
  83.     NSRange kk = NSMakeRange(0, 4);  
  84.       
  85.     NSDictionary * dc = [mabstring attributesAtIndex:0 effectiveRange:&kk];  
  86.       
  87.     [mabstring endEditing];  
  88.       
  89.     NSLog(@"value = %@",dc);  
  90.       
  91.   
  92.       
  93.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);  
  94.       
  95.     CGMutablePathRef Path = CGPathCreateMutable();  
  96.       
  97.     CGPathAddRect(Path, NULL ,CGRectMake(10 , 0 ,self.bounds.size.width-10 , self.bounds.size.height-10));  
  98.       
  99.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);      
  100.       
  101.     //获取当前(View)上下文以便于之后的绘画,这个是一个离屏。  
  102.     CGContextRef context = UIGraphicsGetCurrentContext();  
  103.       
  104.     CGContextSetTextMatrix(context , CGAffineTransformIdentity);  
  105.       
  106.     //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存  
  107.     //保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。  
  108.     CGContextSaveGState(context);  
  109.       
  110.     //x,y轴方向移动  
  111.     CGContextTranslateCTM(context , 0 ,self.bounds.size.height);  
  112.       
  113.     //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度  
  114.     CGContextScaleCTM(context, 1.0 ,-1.0);  
  115.       
  116.     CTFrameDraw(frame,context);  
  117.       
  118.     CGPathRelease(Path);  
  119.     CFRelease(framesetter);  
  120. }  

[cpp]  view plain copy
  1. - (void)drawRect:(CGRect)rect  
  2. {  
  3.     [self characterAttribute];  
  4. }  


CORETEXT框架图


另对于Context的了解可以参考:http://www.padovo.com/blog/2013/01/31/study-coretext/

<think>我们正在讨论的问题是:使用 `flutter build ios-framework --no-universal` 命令未生成 `FlutterPluginRegistrant.framework` 的原因。 根据之前的引用内容,特别是引用[1]提到,使用 `flutter build ios-framework` 时,`--universal` 选项已经被弃用,建议使用 `--xcframework` 代替。但我们的命令中使用了 `--no-universal`,这意味着我们禁止生成通用(universal)的fat framework,而希望生成xcframework。 然而,问题在于没有生成 `FlutterPluginRegistrant.framework`。我们需要分析可能的原因: 1. **Flutter版本问题**:某些Flutter版本可能不会在构建时自动生成 `FlutterPluginRegistrant.framework`,尤其是当项目中没有使用任何插件时?或者这是一个bug? 2. **插件依赖**:`FlutterPluginRegistrant.framework` 的生成与项目中的插件有关。如果项目中没有使用任何插件,那么可能不会生成这个框架。因为 `FlutterPluginRegistrant` 的作用是注册插件,没有插件就不需要注册。 3. **构建命令选项**:`--no-universal` 选项可能会影响生成哪些框架?但通常,这个选项只是控制是否生成包含多种架构的单一框架(universal)还是生成分架构的xcframework,应该不会影响必需的框架的生成。 4. **构建目标目录**:检查构建输出目录,确认是否真的没有生成。有时可能生成在其他位置。 5. **项目配置**:检查Flutter项目中的`pubspec.yaml`是否包含插件。如果没有插件,则不会生成`FlutterPluginRegistrant.framework`。 6. **Flutter构建流程**:在构建iOS框架时,Flutter工具会根据项目中的插件生成`FlutterPluginRegistrant`相关的文件,并编译成框架。如果插件存在,那么应该生成该框架。 根据引用[2]和[4]的内容,我们知道在混合开发中,插件的集成是关键。特别是引用[4]提到,方法二(以framework形式集成)中,需要将插件对应的framework(包括`FlutterPluginRegistrant.framework`)一起集成。 因此,我们逐步排查: 步骤1:确认项目中是否使用了插件 - 打开Flutter模块项目,检查`pubspec.yaml`文件,查看`dependencies`部分是否包含插件(例如`path_provider`, `shared_preferences`等)。如果有,则应该生成`FlutterPluginRegistrant.framework`。 步骤2:确认构建命令的输出 - 运行`flutter build ios-framework --no-universal`,观察输出日志,是否有关于生成`FlutterPluginRegistrant.framework`的信息?是否有错误信息? 步骤3:查看输出的目录结构 - 默认情况下,构建输出的目录是`build/ios/framework`(或者通过`--output`指定的目录)。在该目录下,应该有三个子目录:`Debug`、`Profile`、`Release`(或者根据构建模式不同而有所区别)。进入其中一个目录(例如Debug),查看是否有`FlutterPluginRegistrant.xcframework`目录?注意,由于我们使用了`--no-universal`,所以生成的是xcframework而不是framework。 注意:在Flutter 1.20之后,构建iOS框架时,默认使用xcframework格式(除非指定了`--universal`生成fat framework)。而`--no-universal`选项已经不再需要,因为从Flutter 2.0开始,`--universal`已经被废弃,并推荐使用`--xcframework`(但实际上在构建命令中,`--xcframework`是默认的)。因此,使用`flutter build ios-framework`默认就会生成xcframework。 另外,在构建命令中,我们使用了`--no-universal`,这等同于要求构建xcframework(因为universal已经被废弃,所以这个选项可能被忽略,但为了兼容而保留)。因此,生成的框架都是以xcframework形式存在。 步骤4:如果没有生成,尝试使用默认命令 - 运行`flutter build ios-framework`(不带`--no-universal`),看看是否会生成? 步骤5:检查Flutter版本 - 运行`flutter doctor`,确认Flutter版本。如果是较老版本,可能存在已知问题。建议升级到最新稳定版。 步骤6:如果项目中确实有插件,但仍然没有生成,可能是Flutter工具的问题 - 可以尝试清理构建:`flutter clean`,然后重新构建。 步骤7:查看官方文档或issues - 查看Flutter官方关于构建iOS框架的文档:https://flutter.dev/docs/development/add-to-app/ios/project-setup - 在Flutter的GitHub仓库中搜索相关issue,例如搜索“FlutterPluginRegistrant not generated”等。 根据经验,常见原因可能是项目中没有使用任何插件,所以不会生成`FlutterPluginRegistrant.framework`。如果有插件,那么应该会生成。 如果确认有插件,但仍然没有生成,可能是构建命令的bug。可以尝试使用`--xcframework`选项(如果Flutter版本支持): ```bash flutter build ios-framework --xcframework --output=some/path ``` 注意:在Flutter 1.20以后,默认就是xcframework,所以`--xcframework`可能是默认的。使用`flutter build ios-framework -h`查看帮助。 总结:未生成`FlutterPluginRegistrant.framework`的主要可能原因是项目中没有使用任何插件。如果使用了插件,可能是构建过程中的bug,建议升级Flutter并清理后重建。 下面生成相关问题: </think>### FlutterPluginRegistrant.framework 未生成的原因分析 使用 `flutter build ios-framework --no-universal` 命令未生成 `FlutterPluginRegistrant.framework` 的主要原因如下: #### 1. **项目中未使用任何原生插件** [^1][^4] - `FlutterPluginRegistrant` 框架专门用于注册包含原生代码的 Flutter 插件 - 如果项目只使用纯 Dart 实现的插件(如 `provider`),不会生成该框架 - **验证方法**:检查 `pubspec.yaml` 中的依赖项是否包含原生插件(如 `camera`、`path_provider`) #### 2. **Flutter 版本兼容性问题** [^1][^3] - 旧版 Flutter(<2.0)有时会跳过必要的框架生成 - Apple Silicon 支持变更导致构建行为变化(引用[1]提示) - **解决方案**: ```bash flutter upgrade # 升级到最新稳定版 flutter clean # 清理构建缓存 ``` #### 3. **构建命令参数限制** [^1] - `--no-universal` 参数在某些版本会跳过插件框架生成 - 推荐改用替代命令: ```bash flutter build ios-framework --xcframework --output=build/ios ``` 该命令会生成完整的框架集(含 `FlutterPluginRegistrant.xcframework`) #### 4. **项目结构配置异常** - `.ios` 目录被错误修改(引用[2]警告) - 原生插件配置未正确同步: ```bash # 确保执行同步操作 flutter pub get cd your_ios_project && pod install ``` #### 5. **构建输出路径问题** [^4] - 检查默认输出目录:`your_project/build/ios/framework/{Debug,Release,Profile}` - 使用显式输出路径验证: ```bash flutter build ios-framework --xcframework --output=build_output ``` ### 解决方案验证步骤 1. **确认插件依赖**: ```yaml # pubspec.yaml 示例 dependencies: camera: ^0.10.0+1 # 包含原生代码的插件 ``` 2. **使用完整构建命令**: ```bash flutter clean flutter build ios-framework --xcframework --no-debug --no-profile ``` 3. **检查输出目录**: ```bash ls build/ios/framework/Release/*.xcframework # 应包含: # App.xcframework # Flutter.xcframework # FlutterPluginRegistrant.xcframework # 插件对应的.xcframework ``` 4. **手动验证注册**(AppDelegate.swift): ```swift import FlutterPluginRegistrant // 添加此导入 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let engine = FlutterEngine(name: "io_flutter_engine") GeneratedPluginRegistrant.register(with: engine) // 验证可编译 return true } ``` 若编译失败则说明框架缺失[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值