全系列文章索引:
IOS开发问题索引(一)
IOS开发问题索引(二)
IOS开发问题索引(三)
IOS开发问题索引(四)
IOS开发问题索引(五)
IOS开发问题索引(六)
IOS开发问题索引(七)
IOS开发问题索引(八)
IOS开发问题索引(九)
1 enum用法
http://blog.csdn.net/lvxiangan/article/details/20939379
2 去除TabBar背景图片默认加蓝效果
UIImage *selectImg = [UIImage imageNamed:@"MySettingIcon"];
//声明这张图片用原图(别渲染),默认有亮蓝色渲染
selectImg = [selectImg imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];
[self.mySettingTabBarItem setSelectedImage: selectImg];
在iOS8系统下,UITabbar上的item自定义背景色和图片问题
http://blog.sina.com.cn/s/blog_64cfe8f00102v0yn.html
3 xcode上version和build
CFBundleVersion,标识(发布或未发布)的内部版本号。这是一个单调增加的字符串,包括一个或多个时期分隔的整数。CFBundleShortVersionString 标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数代表重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特点。第三个整数代表维护版本。该键的值不同于“CFBundleVersion”标识。
4 NSIndexSet使用
1.NSIndexSet是什么?
NSIndexSet 是个无符号整数集合。集合中的元素不可变的、不可重复。常被用来当作索引使用。就从它字面上理解,就叫做:索引集合。
2.NSIndexSet的一些常用方法。
类方法:
创建一个空的索引集合。
(id)indexSet
创建一个索引集合,根据索引值
(id)indexSetWithIndex:(NSUInteger)index
创建一个索引集合,根据一个NSRange对象
(id)indexSetWithIndexesInRange:(NSRange)indexRange
实例方法:
判断索引集合中是否包含制定的索引值
- (BOOL)containsIndex:(NSUInteger)index
判断索引集合是否包含指定的indexSet
- (BOOL)containsIndexes:(NSIndexSet*)indexSet
判断索引集合是否包含指定的indexRange
- (BOOL)containsIndexesInRange:(NSRange)indexRange
返回索引集合包含的索引数量
- (NSUInteger)count
返回indexRange中包含的索引数量
- (NSUInteger)countOfIndexesInRange:(NSRange)indexRange
枚举NSIndexSet;执行Block操作,在指定的Rang范围内,并使用指定的options方法。
- (void)enumerateIndexesInRange:(NSRange)range options:(NSEnumerationOptions)opts usingBlock:(void (^)(NSUInteger idx, BOOL *stop))block
如果,要枚举的NSIndexSet中不存在Rang中所指定的范围,则跳过。
options参数:
enum {
NSEnumerationConcurrent = (1UL << 0),
NSEnumerationReverse = (1UL << 1),
};
typedef NSUIntegerNSEnumerationOptions;
NSEnumerationConcurrent
枚举过程中,各个Block是同时开始执行的。这样枚举的完成顺序是不确定的。
NSEnumerationReverse
以反序方式枚举。
例子:
// theTwo中是否包含theOne
BOOL isContains1= [theTwo containsIndexes:theOne];
BOOL isContains2= [theTwo containsIndex:1];
BOOL isContains3= [theTwo containsIndex:9];
// theTwo中是否包含指定的NSMakeRange
BOOL isContains4= [theTwo containsIndexesInRange:NSMakeRange(0,5)];
int theCount=[theTwo count];
// 遍历theTwo,在指定的Range范围内,执行Block方法,利用制定的options方式
// 如果,theTwo中不存在Range中所指定的范围,在theTwo中不存在,则跳过。
[theTwo enumerateIndexesInRange:NSMakeRange(0,8)
options:NSEnumerationReverse
usingBlock:^(NSUInteger idx, BOOL*stop) {
NSLog(@"-------%d",idx);
NSLog(@"%@",theTwo);
}];
其他的方法,都差不多,就不一一介绍了!
希望对你有所帮助!
转自:http://blog.sina.com.cn/s/blog_7b9d64af0101b851.html
5 图片裁剪
IOS图片裁剪和小图看大图动画
http://www.cnblogs.com/liulunet/archive/2013/01/19/2866399.html
ios中实现图片的裁剪
http://blog.sina.com.cn/s/blog_6084f58801013n34.html
IOS学习笔记39——拍照、从相册选图并对图片进行裁剪
http://blog.163.com/l1_jun/blog/static/14386388201435020135/
6 如何判断NSDictionary是否包含某个键
方法一:
if([[dictionary allKeys] containsObject:key) {
// contains key
}
方法二:
if([dictionary objectForKey:key]) {
//objectForKey will return nil if a key doesn't exists.
// contains key
}
7 NSData与UIImage之间的转换
//NSData转换为UIImage
NSData *imageData = [NSData dataWithContentsOfFile: imagePath];
UIImage *image = [UIImage imageWithData: imageData];
//UIImage转换为NSData
NSData *imageData = UIImagePNGRepresentation(aimae);
http://www.cnblogs.com/wxy325/archive/2013/03/06/2946971.html
8 IOS9适配 error itms-90163
http://blog.csdn.net/deadrabbit2015/article/details/48655513
Xcode升级到7后,做了iOS9适配,发布到app出现这样的错误:
初步判断是因为Xcode在打包的时候,把一些没必要的包给打进去了(如果英文很厉害,那就直接自己翻译哈),按照提示找到相应的key删除该行即可(也有人说直接删除对应的info.plist文件),个人觉得最好不要删除那么彻底万一用到就麻烦了。如上图,我的问题是TencentOpenApi_IOS_Bundle.bundle/Info.plist搞得鬼,如果找不到位置参考下图:
删除错误提示的key(找不到对应的Core Foundation Keys?参考https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html)
如下图:
好了,重新上传就应该OK了!
9 【NSArray】 排序汇总
http://blog.csdn.net/xiaoxuan415315/article/details/9198729
IOS几种简单有效的数组排序方法
//第一种,利用数组的sortedArrayUsingComparator调用NSComparator ,obj1和obj2指的数组中的对象
NSComparator cmptr = ^(id obj1, id obj2){
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
};
NSArray *sortArray = [[NSArray alloc] initWithObjects: @"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
//排序前
NSMutableString *outputBefore = [[NSMutableString alloc] init];
for (NSString *str in sortArray){
[outputBefore appendFormat:@"];
}
NSLog(@"排序前:%@",outputBefore);
[outputBefore release];
//第一种排序
NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
NSMutableString *outputAfter = [[NSMutableString alloc] init];
for(NSString *str in array){
[outputAfter appendFormat:@"];
}
NSLog(@"排序后:%@",outputAfter);
[outputAfter release];
第二种 排序方法 利用sortedArrayUsingFunction调用 对应方法customSort,这个方法中的obj1和obj2分别是指数组中的对象。
NSInteger customSort(id obj1, id obj2,void* context){
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}
NSArray *sortArray = [[NSArray alloc] initWithObjects: @"1",@"3",@"4",@"7", @"8",@"2",@"6", @"5",@"13",@"15", @"12",@"20",@"28",@"",nil];
//排序前
NSMutableString *outputBefore = [[NSMutableString alloc] init];
for(NSString *str in sortArray){
[outputBefore appendFormat:@"];
}
NSLog(@"排序前:%@",outputBefore);
[outputBefore release];
NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
NSMutableString *outputAfter = [[NSMutableString alloc] init];
for(NSString *str in array){
[outputAfter appendFormat:@"];
}
NSLog(@"排序后:%@",outputAfter);
[outputAfter release];
第三种 利用sortUsingDescriptors调用NSSortDescriptor(简便)
//做倒序排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"commentEntity.addTime" ascending: YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];
[_commentVMArr sortUsingDescriptors:sortDescriptors];
排序操作,NSArray提供了很多种方法,按照所利用的排序参数,可以简单分为descriptor,selector,function,和block排序。
数组排序的时候有sortedArrayUsingComparator方法,这里的参数为NSComparator,这个类其实是Block所定义的typedef NSComparisonResult(^NSComparator)(id obj1,id obj2); 所以我们直接用NSComparatormyComparator=^(id obj1,id obj2){};
Block其实可以看作JS里面的(){}();方法以及.Net中的匿名方法,即不需要声明就直接使用的方法,主要用处包括回调、事件处理和排序。声明和实现可以分开,也可以写在一起:
NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s)
{
NSLog(@"%d,%@",i,s);
};
blockExample(42,@"hello");
对于NSArray排序或者其他需要Block作为参数的函数来说,可以写成下面两种形式:
//声明和使用
NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) {
// 比较函数的实现
};
NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator];
// 不声明,彻底匿名使用
NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) {
//...
}];
例子:
NSArray *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil];
array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {
return (arc4random() % 3) - 1;
}];
// NSLog(@"array:%@", array);
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
return (NSComparisonResult)NSOrderedSame;
}];
sortedArray 是排好序的时间对象数组
// 按时间排序
NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2)
{
NSComparisonResult result = [obj1 compare:obj2];
switch(result){
case NSOrderedAscending:
return NSOrderedDescending;
case NSOrderedDescending:
return NSOrderedAscending;
case NSOrderedSame:
return NSOrderedSame;
default:
return NSOrderedSame;
}
// 时间从近到远(远近相对当前时间而言)
}];
//随机排序
NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {
return (arc4random() % 3) - 1;
}];
NSLog(@"array:%@", array);
10 屏蔽表情输入
有朋友在询问,如何屏蔽emoji表情输入的问题,因为苹果自带的表情在其他设备上不支持。
思路,在textfeild或者textview中,键入时候先判读是不是emoji的内容,如果是,就不返回给编辑框。 代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{
DLog(@"[[UITextInputMode currentInputMode] primaryLanguage] is %@",);
if ([[[UITextInputMode currentInputMode]primaryLanguage] isEqualToString:@"emoji"]) {
returnNO;
}
returnYES;
}
11 MJRefresh初始化时崩溃
原因:
12 获取iOS设备型号
获取iOS设备型号(最新iPhone6 、iPad4)
http://www.oschina.net/code/snippet_2247606_39106
iOS获取手机的型号,系统版本,软件名称,软件版本
http://www.2cto.com/kf/201210/162333.html
//获得设备型号
(NSString*)getCurrentDeviceModel:(UIViewController*)controller
{
intmib[2];
size_tlen;
char*machine;
mib[0] = CTL_HW;
mib[1] = HW_MACHINE;
sysctl(mib, 2, NULL, &len, NULL, 0);
machine = malloc(len);
sysctl(mib, 2, machine, &len, NULL, 0);
NSString *platform = [NSString stringWithCString: machine encoding: NSASCIIStringEncoding];
free(machine);
if ([platformisEqualToString:@"iPhone1,1"])
return @"iPhone 2G (A1203)";
if ([platformisEqualToString:@"iPhone1,2"])
return @"iPhone 3G (A1241/A1324)";
if ([platformisEqualToString:@"iPhone2,1"])
return @"iPhone 3GS (A1303/A1325)";
if ([platformisEqualToString:@"iPhone3,1"])
return @"iPhone 4 (A1332)";
if ([platformisEqualToString:@"iPhone3,2"])
return @"iPhone 4 (A1332)";
if ([platformisEqualToString:@"iPhone3,3"])
return @"iPhone 4 (A1349)";
if ([platformisEqualToString:@"iPhone4,1"])
return @"iPhone 4S (A1387/A1431)";
if ([platformisEqualToString:@"iPhone5,1"])
return @"iPhone 5 (A1428)";
if ([platformisEqualToString:@"iPhone5,2"])
return @"iPhone 5 (A1429/A1442)";
if ([platformisEqualToString:@"iPhone5,3"])
return @"iPhone 5c (A1456/A1532)";
if ([platformisEqualToString:@"iPhone5,4"])
return @"iPhone 5c (A1507/A1516/A1526/A1529)";
if ([platformisEqualToString:@"iPhone6,1"])
return @"iPhone 5s (A1453/A1533)";
if ([platformisEqualToString:@"iPhone6,2"])
return @"iPhone 5s (A1457/A1518/A1528/A1530)";
if ([platformisEqualToString:@"iPhone7,1"])
return @"iPhone 6 Plus (A1522/A1524)";
if ([platformisEqualToString:@"iPhone7,2"])
return @"iPhone 6 (A1549/A1586)";
if ([platformisEqualToString:@"iPod1,1"])
return @"iPod Touch 1G (A1213)";
if ([platformisEqualToString:@"iPod2,1"])
return @"iPod Touch 2G (A1288)";
if ([platformisEqualToString:@"iPod3,1"])
return @"iPod Touch 3G (A1318)";
if ([platformisEqualToString:@"iPod4,1"])
return @"iPod Touch 4G (A1367)";
if ([platformisEqualToString:@"iPod5,1"])
return @"iPod Touch 5G (A1421/A1509)";
if ([platformisEqualToString:@"iPad1,1"])
return @"iPad 1G (A1219/A1337)";
if ([platformisEqualToString:@"iPad2,1"])
return @"iPad 2 (A1395)";
if ([platformisEqualToString:@"iPad2,2"])
return @"iPad 2 (A1396)";
if ([platformisEqualToString:@"iPad2,3"])
return @"iPad 2 (A1397)";
if ([platformisEqualToString:@"iPad2,4"])
return @"iPad 2 (A1395 New Chip)";
if ([platformisEqualToString:@"iPad2,5"])
return @"iPad Mini 1G (A1432)";
if ([platform isEqualToString:@"iPad2,6"])
return @"iPad Mini 1G (A1454)";
if ([platformisEqualToString:@"iPad2,7"])
return @"iPad Mini 1G (A1455)";
if ([platformisEqualToString:@"iPad3,1"])
return @"iPad 3 (A1416)";
if ([platformisEqualToString:@"iPad3,2"])
return @"iPad 3 (A1403)";
if ([platformisEqualToString:@"iPad3,3"])
return @"iPad 3 (A1430)";
if ([platformisEqualToString:@"iPad3,4"])
return @"iPad 4 (A1458)";
if ([platformisEqualToString:@"iPad3,5"])
return @"iPad 4 (A1459)";
if ([platformisEqualToString:@"iPad3,6"])
return @"iPad 4 (A1460)";
if ([platformisEqualToString:@"iPad4,1"])
return @"iPad Air (A1474)";
if ([platformisEqualToString:@"iPad4,2"])
return @"iPad Air (A1475)";
if ([platformisEqualToString:@"iPad4,3"])
return @"iPad Air (A1476)";
if ([platformisEqualToString:@"iPad4,4"])
return @"iPad Mini 2G (A1489)";
if ([platformisEqualToString:@"iPad4,5"])
return @"iPad Mini 2G (A1490)";
if ([platform isEqualToString:@"iPad4,6"])
return @"iPad Mini 2G (A1491)";
if ([platformisEqualToString:@"i386"])
return @"iPhone Simulator";
if ([platformisEqualToString:@"x86_64"])
return @"iPhone Simulator";
return platform;
}
13 iOS中Frame等struct类型的NSLog输出格式
NSString *NSStringFromCGPoint( CGPoint point);
NSString *NSStringFromCGSize( CGSize size);
NSString *NSStringFromCGRect( CGRect rect);
NSString *NSStringFromCGAffineTransform( CGAffineTransform transform);
NSString *NSStringFromUIEdgeInsets( UIEdgeInsets insets);
NSString *NSStringFromUIOffset( UIOffset offset);
14 Catalog不应履行继承职责,即尽量不要重写源类继承自基类的方法
Catalog中如果重写基类方法的话,即使其他地方没有引用该类,系统照样会执行进入Catalog类方法中,代码超过了include类的执行范围,容易造成不可预知的异常。
例如:
#import "UIScrollView UITouch.h"
@implementationUIScrollView (UITouch)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesBegan:touches withEvent:event];
[super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesMoved:touches withEvent:event];
[super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesEnded:touches withEvent:event];
[super touchesEnded:touches withEvent:event];
}
@end
虽然其他类中没有引用UIScrollView UITouch.h这个分类类,在触发touch操作时,代码依然会执行到这三个方法中来,因为这个catalog相当于替源类UIScrollView实现了继承的职责,实现了父类的touch方法。自然,就会执行到这个分类类中来,即使没有显式include这个catalog类。
15 【架构】单例完整写法
16 #include实质
#include和#import本质上就是递归地复制和粘贴引用文件的内容
17 xcode修改scheme名称
xcode修改scheme名称
http://blog.csdn.net/xueer8835/article/details/19610099
18 报错:process launch failed:failedto get the task for process XXX(解决方案)
报错:
processlaunch failed:failed to get the task for process XXX(解决方案)
http://blog.csdn.net/itianyi/article/details/8575154
原因:
证书问题,project和targets的证书都必须是开发证书,ADHOC的证书会出现此问题。
解决方案:
project和targets的证书使用开发证书。
其他:
failed to get the task for process XXX
This error happens when you have set DistributionProvisioning profile in code signing. Change it to Developer ProvisioningProfile, then it will work. Worked for me for Xcode SDK 4.5.
把你的code sign由Distribution改成Developer.就这么简单.
补充:
iphone5s的时候会出现:processlaunch failed: security
这时候,应该app其实已经安装成功了,你只需要在iphone上启动app,然后点击信任就可以了。
19 #include 'openssl/rsa.h' file not found
#include 'openssl/rsa.h' file notfound
解决方案:
1、确保Header Search Paths路径正确;
2、将路径设置为“recursive”
3、移除引用,重新添加一遍;
20 #import 'leveldb/db.h' file not found
方案一
$(PROJECT_DIR)/framework/TKDataBase/leveldb
21 iOS开发中的Undefined symbols错误
iOS开发中的Undefinedsymbols错误
http://www.molotang.com/articles/1593.html
参考了StackOverflow一个帖子,写的很全,这个错误可能的根源基本上是如下几类:
1、引入了需要用到的库的头文件,却没有链接正确的实现库。因为Xcode本身所支持的库是Static Library,即.a的方式,.a的文件里只有实现,使用的时候需要另外引入头文件,那么就有可能把头文件放进来,没有放.a或放入了错误的版本。
2、Build Settings或者Build Phases配置有误。检查Build Phases里的Link Binary With Libraries和Build Settings里的几项Search Path。
3、从外部导入的文件没有加入到特定的target中。这个正是我整理这篇日志之前遇到的,将.a、.m、.framework等引入到工程当中,却没有勾选当前Build的target,会出现这个问题,可以选中特定的文件,在右侧边栏中选中target。
4、未包含处理器架构指令集的问题。报错时的提示一般都是“Undefined symbols for architecture
armv7”之类的,而“for architecture armv7”就是说没有支持armv7,在Build settings里architecture相关的几项需要配置正确。
有如上这几种情况的时候,会出现“Undefined symbols”的报错提示,这时候就要对提示中指出的特定symbol相关的文件仔细检查了。
22 Xcode突然出现could not build modulefoundation错误
Xcode突然出现could notbuild module foundation错误
http://blog.csdn.net/zhuoyuetec/article/details/43525369
Adding C file causes pch error
http://stackoverflow.com/questions/19723392/adding-c-file-causes-pch-error
Xcode6创建项目时并没有.pch预编译文件,如下图添加预编译文件
在预编译文件中添加若干头文件引用后,出现could not build module foundation错误
解决方案:
在引用头文件开始加入#ifdef
__OBJC__ 结束时加入#endif,例如
#ifndef PureStandard_PrefixHeader_pch
#define PureStandard_PrefixHeader_pch
#ifdef __OBJC__
#import "A.h"
#import "B.h"
#endif
#endif
23 【编译】There was an internal APIerror.
xcode7更新之后使用真机调试,在IOS8的一台Iphone5手机上面没什么问题,IOS8的一台iphone6也没问题。但是在IOS6的一台Iphone4s和IOS7的ipad air2上面在最后安装的时候居然安装失败,提示 There was an internal API error. 然后百度Google了一下,找到一下几种可能或解决办法:
1.私有api的问题。
2.product---clean一下,然后重新build一下,仅仅这样问题就可能得到解决。-----然而我的问题却没有解决(我甚至关机再试过)
3.部分人安装了多个版本xcode,在删除只保留一个版本之后重新build也好了--------然而我没有安装多个版本
在纠结了快一天的时候 我发现console打印出的日志显示在安装的app的名字是乱码,通过查看build settings发现过product name改的是中文(解决方法)。然后抱着试试看的态度 把product
name改成原来的,和xcodeproj文件名一样再重新build,终于没问题了。
在此提醒要修改app名字的时候最好不要修改product那么,可以在info.plist中修改Bundle
display name.
http://blog.csdn.net/jf200614379/article/details/48624405
24 【上线】Xcode8打包上传app,构建版本按钮不显示.
Xcode8打包上传app,构建版本按钮不显示
http://blog.csdn.net/u013306324/article/details/52684076
[iOS Xcode8]上传AppStore无法构建版本 没有加号
http://blog.csdn.net/iostiannan/article/details/52636103
需要在Info.plist的顶级目录下配置需要开启的系统权限,不然即使App上传成功了,在构建版本一项中找不到。
25 ios接如微信SDK报错'NSInvalidArgumentException', reason: '-[__NSArrayMenqueue:]:
ios用ShareSDK接入微信SDK报错'NSInvalidArgumentException', reason: '-[__NSArrayMenqueue:]:
解决方法:
1.你的工程文件中选择Build Setting,在"Other Linker Flags"中加入"-Objc",其中-ObjC的C要大写。
2.如果工程报错"_GCControllerDidDisconnectNotification",项目->TARGETS->iOS->BuildPhases->Link Binary With Libraries
增加库:GameController.framework
3.如果还报错xx.dylib的问题的话,则找到刚刚添加的GameController.framework,右侧Required改为Opitional。
26 由于应用BundleID信息校验不通过,无法分享到微信
http://bbs.umeng.com/thread-25696-1-1.html
微信开放平台里面,应用的Bundle ID与测试版本Bundle ID都必须填写,不然就会报这个错。
27 app发布,本地化存在错误。
Api包没问题,有可能是发布时错选了所支持语言导致,例如App只支持中文,但是多选了英文(美国)