Objective-C中的App Store上架流程与审核要点
2023-05-136.8k 阅读
一、准备工作
在将基于Objective - C开发的应用上架到App Store之前,需要完成一系列的准备工作。
(一)开发者账号
-
账号类型
- 个人账号:适合个人开发者,以个人名义发布应用。这种账号一年的费用是99美元,可用于开发和发布各类应用,但在团队协作和应用管理规模上有一定限制。
- 公司账号:适合企业开发团队,以公司名义发布应用。费用同样是每年99美元,相比个人账号,它支持团队开发,可设置不同的角色和权限,便于大型项目的管理。
- 企业账号:主要面向企业内部使用的应用分发,不能上架到App Store供公众下载。其费用为每年299美元,适合企业内部员工使用特定应用,无需经过App Store审核。
-
注册流程
- 访问苹果开发者官网(developer.apple.com),点击“Join the Apple Developer Program”。
- 选择适合的账号类型,按提示填写个人或公司信息,包括姓名、联系方式、公司名称、地址等。
- 完成支付流程,支付成功后即完成开发者账号注册。
(二)应用相关信息准备
- 应用名称
- 应用名称要简洁明了,准确反映应用的功能或特点。同时,不能与已上架应用的名称过于相似,避免引起混淆。例如,一款图片编辑应用,命名为“PicEdit Pro”就比较合适,既表明了是图片编辑功能,“Pro”又暗示了专业版的特性。
- 在Objective - C项目中,应用名称通常在项目的
Info.plist
文件中设置。打开Info.plist
,找到“Bundle display name”键,其对应的值就是应用在设备和App Store上显示的名称。示例代码如下(在Xcode中打开Info.plist
,通过代码方式修改名称,假设项目名为MyApp
):
NSString *newAppName = @"New App Name";
NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"]];
[infoDict setObject:newAppName forKey:@"CFBundleDisplayName"];
[infoDict writeToFile:[[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"] atomically:YES];
-
应用图标
- 应用图标是用户对应用的第一视觉印象,需要设计得美观且具有辨识度。苹果对应用图标有严格的尺寸要求,不同尺寸适用于不同设备和场景。例如,iPhone应用图标尺寸为1024x1024像素,用于App Store展示;180x180像素用于iPhone主屏幕(iOS 10及以上)。
- 在Objective - C项目中,将设计好的图标文件添加到项目中。在
Assets.xcassets
中,选择“AppIcon”,将对应的图标文件拖放到相应的尺寸位置即可。
-
应用描述
- 应用描述要详细介绍应用的功能、特点、使用场景等,吸引潜在用户下载。例如,对于一款健身应用,可以这样描述:“我们的健身应用提供了丰富多样的健身课程,无论是在家锻炼还是在健身房,都能满足您的不同需求。专业教练指导视频,帮助您正确完成每个动作,还有个性化的训练计划,根据您的身体状况和目标定制。”
- 应用描述在App Store Connect平台填写,与Objective - C代码无直接关联,但良好的描述能提升应用的下载量。
-
关键词
- 关键词用于用户在App Store搜索应用时提高应用的曝光率。选择与应用功能紧密相关的关键词,例如健身应用的关键词可以是“健身、锻炼、课程、教练、计划”等。
- 在App Store Connect平台的应用元数据设置中添加关键词,同样与Objective - C代码无直接关联,但对应用推广至关重要。
二、应用开发与测试
(一)应用开发
- 项目设置
- 在Xcode中创建Objective - C项目时,要正确设置项目的基本信息。包括项目名称、组织名称、组织标识符等。组织标识符一般采用反向域名格式,例如“com.example.myapp”。在创建项目时,Xcode会根据这些信息生成应用的Bundle Identifier,它在App Store上架过程中是唯一标识应用的重要信息。
- 以下是创建Objective - C项目的基本步骤:
- 打开Xcode,点击“Create a new Xcode project”。
- 选择应用类型,如“Single - View App”(单视图应用)。
- 填写项目名称、组织名称、组织标识符等信息,选择Objective - C作为编程语言,然后点击“Next”。
- 选择项目保存路径,点击“Create”完成项目创建。
- 代码编写
- 以一个简单的登录界面为例,使用Objective - C编写代码实现用户输入用户名和密码后点击登录按钮进行验证的功能。
- 首先,在故事板(Storyboard)中设计登录界面,添加两个文本输入框(用于用户名和密码输入)和一个登录按钮。
- 在视图控制器(ViewController.m)中编写如下代码:
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *usernameTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@end
@implementation ViewController
- (IBAction)loginButtonTapped:(id)sender {
NSString *username = self.usernameTextField.text;
NSString *password = self.passwordTextField.text;
// 简单的用户名密码验证,实际应用中应与服务器交互验证
if ([username isEqualToString:@"admin"] && [password isEqualToString:@"123456"]) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"登录成功" message:@"欢迎使用应用" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
} else {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"登录失败" message:@"用户名或密码错误" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
@end
- 在上述代码中,通过
IBOutlet
将故事板中的文本输入框和按钮与视图控制器中的属性和方法关联起来。点击登录按钮时,获取输入的用户名和密码并进行简单验证,根据验证结果弹出相应的提示框。
(二)应用测试
- 真机测试
- 将开发的应用安装到真实设备上进行测试,可以发现一些在模拟器中无法察觉的问题,如性能问题、传感器兼容性问题等。
- 连接iOS设备到电脑,在Xcode中选择设备,点击“Run”按钮即可将应用安装到设备上。在真机测试过程中,要测试不同型号的设备,如iPhone 6s、iPhone X、iPhone 13等,确保应用在各种设备上都能正常显示和运行。
- 功能测试
- 对应用的各项功能进行全面测试,确保功能的完整性和准确性。以登录功能为例,要测试正确的用户名和密码能否成功登录,错误的用户名和密码是否有正确的提示,输入框的输入限制是否合理(如用户名长度限制)等。
- 可以编写测试用例来规范功能测试流程,例如使用XCTest框架编写Objective - C单元测试。以下是一个简单的登录功能单元测试示例:
#import <XCTest/XCTest.h>
#import "ViewController.h"
@interface LoginFunctionTest : XCTestCase
@end
@implementation LoginFunctionTest
- (void)testLoginSuccess {
ViewController *viewController = [[ViewController alloc] init];
viewController.usernameTextField.text = @"admin";
viewController.passwordTextField.text = @"123456";
[viewController loginButtonTapped:nil];
// 这里可以进一步验证是否弹出了登录成功的提示框
XCTAssert(true, @"登录成功测试通过");
}
- (void)testLoginFailure {
ViewController *viewController = [[ViewController alloc] init];
viewController.usernameTextField.text = @"wronguser";
viewController.passwordTextField.text = @"wrongpassword";
[viewController loginButtonTapped:nil];
// 这里可以进一步验证是否弹出了登录失败的提示框
XCTAssert(true, @"登录失败测试通过");
}
@end
- 兼容性测试
- 测试应用在不同iOS版本上的兼容性。由于iOS系统不断更新,应用需要在多个版本上正常运行。例如,当前主流的iOS版本有iOS 15、iOS 16等,要确保应用在这些版本上的界面显示、功能使用都没有问题。
- 在Xcode的模拟器中可以选择不同的iOS版本进行测试,也可以使用不同iOS版本的真机进行测试。
三、应用打包与上传
(一)应用打包
- 创建App Store Distribution证书
- 在Xcode中,打开“Preferences”,选择“Accounts”,点击你的开发者账号,然后点击“Manage Certificates”。
- 点击“+”按钮,选择“iOS Distribution (App Store and Ad Hoc)”,点击“Continue”。Xcode会自动生成证书签名请求并上传到苹果服务器,生成App Store Distribution证书。
- 配置Provisioning Profile
- 在苹果开发者官网的“Certificates, Identifiers & Profiles”中,点击“Profiles”,然后点击“+”按钮创建新的Provisioning Profile。
- 选择“App Store”类型,选择应用的Bundle Identifier,选择刚刚创建的App Store Distribution证书,然后选择要包含的设备(如果需要特定设备测试),最后下载生成的Provisioning Profile文件,并在Xcode中通过“Xcode -> Preferences -> Accounts -> Download Manual Profiles”导入。
- Archive项目
- 在Xcode中,选择“Product -> Archive”。Xcode会对项目进行编译和打包,生成一个
.xcarchive
文件。这个文件包含了应用的二进制文件和相关元数据。 - 在Archive过程中,确保项目设置中的“Build Configuration”为“Release”,这样可以优化应用的性能和大小。
- 在Xcode中,选择“Product -> Archive”。Xcode会对项目进行编译和打包,生成一个
(二)应用上传
- 登录App Store Connect
- 访问App Store Connect官网(appstoreconnect.apple.com),使用开发者账号登录。
- 创建App记录
- 在App Store Connect中,点击“我的App”,然后点击“+”按钮创建新的App记录。
- 填写应用的基本信息,包括名称、Bundle Identifier、主要语言等。这里的Bundle Identifier要与项目中的设置一致。
- 上传应用包
- 打开Xcode的“Organizer”窗口(“Window -> Organizer”),选择刚刚Archive的项目,点击“Distribute App”。
- 选择“App Store”,点击“Next”。Xcode会验证应用包的有效性,然后提示选择要上传的Provisioning Profile,选择之前配置好的App Store类型的Provisioning Profile,点击“Next”。
- 最后点击“Upload”将应用包上传到App Store Connect。上传完成后,可以在App Store Connect中看到应用的构建版本。
四、App Store审核要点
(一)内容审核
- 合规性
- 应用内容必须遵守当地法律法规,包括但不限于版权法、隐私法等。例如,应用不能包含未经授权的音乐、视频、图片等版权内容。如果应用涉及用户数据收集,必须遵守苹果的隐私政策以及相关地区的隐私法规,如欧盟的GDPR。
- 在Objective - C代码中,如果涉及数据收集,要确保有明确的用户授权提示。以下是一个简单的示例,使用
UIAlertController
提示用户授权收集位置信息:
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// 检查是否有授权
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"位置授权" message:@"我们需要获取您的位置信息以提供更好的服务,是否允许?" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"允许" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self.locationManager requestWhenInUseAuthorization];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"不允许" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:okAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
@end
-
不包含有害内容
- 应用不能包含暴力、色情、恐怖等有害内容。例如,应用图标、应用内图片、文字描述等都不能出现此类内容。同时,应用也不能包含引导用户进行非法活动的功能或内容,如赌博、毒品交易等。
-
适合目标受众
- 应用要根据所设定的年龄分级,提供适合相应受众的内容。如果应用设定为12 +,那么应用内不能出现过于暴力或成人化的内容。在App Store Connect中设置应用的年龄分级时,要准确评估应用内容,避免误判。
(二)功能审核
- 功能完整性
- 应用的所有功能必须正常运行,不能出现崩溃、闪退等问题。例如,对于一款社交应用,消息发送、好友添加、个人资料查看等功能都要能正常使用。在审核过程中,苹果审核人员会全面测试应用的各项功能,所以在提交应用前要进行充分的自测。
- 以一个简单的图片浏览功能为例,确保图片能够正确加载、放大缩小、滑动切换等操作都能正常进行。以下是一个简单的Objective - C代码实现图片加载和放大缩小功能:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
self.imageView.image = [UIImage imageNamed:@"example.jpg"];
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:self.imageView];
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
[self.imageView addGestureRecognizer:pinchGesture];
self.imageView.userInteractionEnabled = YES;
}
- (void)handlePinch:(UIPinchGestureRecognizer *)gesture {
CGFloat scale = gesture.scale;
self.imageView.transform = CGAffineTransformScale(self.imageView.transform, scale, scale);
gesture.scale = 1;
}
@end
-
无隐藏功能
- 应用不能包含隐藏功能,所有功能都应该在应用界面或说明中清晰展示。例如,不能在应用中隐藏一个付费功能,只有通过特定的操作组合才能发现。应用的功能应该易于发现和使用,符合用户的操作习惯。
-
性能优化
- 应用要具备良好的性能,不能出现过度卡顿、加载缓慢等问题。特别是在启动时间、页面切换时间等方面要满足一定的标准。例如,应用的启动时间应尽量控制在3秒以内,复杂页面的加载时间也不宜过长。
- 在Objective - C代码中,可以通过优化算法、合理使用内存等方式提升性能。例如,在加载大量数据时,可以采用分页加载的方式,避免一次性加载过多数据导致内存溢出。以下是一个简单的分页加载数据的示例(假设从服务器获取数据):
#import "ViewController.h"
#import <AFNetworking/AFNetworking.h>
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, NSInteger) page;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.dataArray = [NSMutableArray array];
self.page = 1;
[self loadData];
}
- (void)loadData {
NSString *urlString = [NSString stringWithFormat:@"https://example.com/api/data?page=%ld", (long)self.page];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSArray *newData = responseObject[@"data"];
[self.dataArray addObjectsFromArray:newData];
// 刷新UI显示新数据
[self.tableView reloadData];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"数据加载失败: %@", error);
}];
}
// 上拉加载更多数据
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (scrollView.contentOffset.y >= scrollView.contentSize.height - scrollView.frame.size.height) {
self.page++;
[self loadData];
}
}
@end
(三)设计审核
- 用户界面设计
- 应用的用户界面要简洁、美观、易用。遵循苹果的人机界面指南(Human Interface Guidelines),使用标准的iOS控件和交互方式,让用户能够快速上手。例如,按钮的大小要适合手指点击,文字的字体和颜色要易于阅读。
- 在Objective - C项目中,可以使用Interface Builder(如Storyboard或XIB)来设计界面,同时结合代码进行布局调整。以下是一个简单的代码示例,设置按钮的样式:
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeSystem];
myButton.frame = CGRectMake(100, 200, 200, 50);
[myButton setTitle:@"点击我" forState:UIControlStateNormal];
[myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
myButton.backgroundColor = [UIColor blueColor];
[myButton addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:myButton];
- 图标和图像设计
- 应用图标和应用内的图像要具有较高的质量,不能出现模糊、拉伸等问题。图标要符合苹果的设计规范,能够清晰地传达应用的主题和功能。应用内的图片也要根据不同设备的分辨率进行适配,确保在各种设备上都能正常显示。
- 无障碍设计
- 应用要支持无障碍功能,方便残障人士使用。例如,应用要支持VoiceOver功能,确保所有界面元素都能被正确朗读。在Objective - C代码中,可以通过设置元素的
accessibilityLabel
属性来为VoiceOver提供描述信息。以下是一个示例:
- 应用要支持无障碍功能,方便残障人士使用。例如,应用要支持VoiceOver功能,确保所有界面元素都能被正确朗读。在Objective - C代码中,可以通过设置元素的
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 30)];
myLabel.text = @"这是一个示例标签";
myLabel.accessibilityLabel = @"用于展示示例文本的标签";
[self.view addSubview:myLabel];
通过以上详细的上架流程和审核要点介绍,基于Objective - C开发的应用能够更顺利地通过App Store审核并上架,为用户提供优质的使用体验。在整个过程中,要注重细节,严格遵守苹果的规定和指南,确保应用的质量和合规性。