3天工夫从零到上架AppStore流程记录
清明假期刚过去一周,我如愿以偿把本人想要的一个App上架了AppStore
从有idea到技术选型,从设计稿到框架开发,从提审AppStore到上架一共经验了3天,这3天里我踩了很多坑,忙得焦头烂额,期间发现网上很多信息都是过期的,所以本着一个总结的想法,写了这篇文章。
一、idea到设计稿
(一)idea灵感起源
平时我下班很忙,休闲时会刷手机看B站、Youtube视频,
但因为平时关注了太多人,想看的却只有那几个,
但还是会忍不住点击算法举荐的视频。
- "xdm洁净又卫生啊"
- "大佬别这样"
- "守护每一个不切实际的幻想"
B站内容丰盛,每次不仅看不到想看的视频,反而花了比预计好几倍的工夫。
所以我想要做一个产品,喜爱可能帮我追踪B站、Youtube平台上我最想关注的人的动静,
不必我每次关上B站、Youtube去查看内容,所以我依照素日工作里排期的流程给本人做了性能的排期:
- 喵酱爱订阅 - 展现导航栏 - 搜寻页面 - 写搜寻的cgi - 写解析用户状态的cgi - 要反对右滑勾销订阅 - 把用户状态数据更新到缓存 - 把缓存落到DB - 每次启动读取DB - 制作宣传视频 - 制作启动教育页 - 分割页 - 分割跳转等页面 - 性能优化 - 加一个by xxx 关注,而后谈起一个半屏 - 加一个 xx、yy和另外x人关注了此账号 - 须要退出loading等逻辑 - 全局extension call:按id注册,还是全副接管 - 开始更新订阅数据- 搜寻页面 - 呈现导航栏 - 呈现敞开按钮 - 点击搜寻要能过渡到另外一个搜寻界面 - 开始接B站搜寻的api - 开始实现订阅该Up主性能 - 滑动删除 - 搜寻交互调整- 订阅数据 - 开始更新订阅数据,获取更全的信息 - 按timeline排序接下来要做的: - 反对Youtube订阅 - 实现B站跳转逻辑 - 实现Youtube跳转逻辑 - 实现清理红点逻辑 - 调整搜寻两头页逻辑 - 「对于」页面设计 - 帮忙和常见问题 - 隐衷政策 - 视觉还原和调整(增加束缚) - 增加主页元素的联动束缚 - 主页下滑不到最底部 - 导航栏色彩问题 - 修bug - 订阅完之后,不会立即呈现 - Youtube API有限调用 - App选一个图标
(二)本人搞定设计稿
有了idea之后,依照正经开发流程,相当于是产品计划确定了,接下来就须要设计稿了。
征询了公司里的设计共事,他们给出了两个倡议:Sketch
或者 Figma
,体验之后本人抉择了 Figma
这款设计软件。
选定软件,用了半天的工夫画了简略的设计稿:
这里我要吹一下 Figma 这个软件,从零到上手真的半天都不必,真的是"有手就行"。
二、框架选型和开发
(一)根底框架
首先说一下这款软件我是应用 Objective-C 写的,为什么不必 Swift 呢?因为我之前积攒的根底库都是用 Objective-C 写的,所以为了求快,还是抉择了 Objective-C 。
1. 清理 main.storyboard
一个略微大点的我的项目根本都不会应用 main.storyboard ,所以咱们首先上来无脑清理掉 main.storyboard ,改为纯代码模式。
(1) 删除main.storyboard和launchScreen.storyboard,右键delete-Move to Trash
删除SceneDelegate.h和SceneDelegate.m文件,也要抉择Move to Trash
(2) 选中工程 - General - Deployment Info - Main Interface 设为空
App Icons and Launch Images - Launch Screen File 设为空
(3) 删除 Info.plist 下 Application Scene Windows
(4) 在AppDelegate.h 和AppDelegate.m文件中增加如下代码:
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];self.window.backgroundColor = [UIColor whiteColor];BNMainViewController *vc = [[BNMainViewController alloc] init];self.navigationController = [[UINavigationController alloc] initWithRootViewController:vc];self.window.rootViewController = self.navigationController;[self.window makeKeyAndVisible];
(5) 正文掉 AppDelegate.m 中的 Lifecycle 代码
#pragma mark - UISceneSession lifecycle//- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {// // Called when a new scene session is being created.// // Use this method to select a configuration to create the new scene with.// return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];//}//////- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {// // Called when the user discards a scene session.// // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.// // Use this method to release any resources that were specific to the discarded scenes, as they will not return.//}
(6) 展现导航栏
在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
新增:
[[UINavigationBar appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:18], NSForegroundColorAttributeName : [UIColor whiteColor]}];
2. Cocoapods和根底库
之前我问过一些大学里的学生,学完iOS常识后为什么不本人尝试做一个我的项目呢?年轻人有想法有精力的,他们中有一些人的答复是:"太麻烦了,iOS语法真繁琐"
我有点诧异,iOS的语法为什么会繁琐呢?前面和他们深刻聊的时候才发现他们大多数人是因为短少根底库,导致他们开发门槛十分高。
比方哪些根底性能呢? 最常见的就是:
@interface UIView (Extension)@property (nonatomic, assign) CGFloat x;@property (nonatomic, assign) CGFloat y;@property (nonatomic, assign) CGFloat centerX;@property (nonatomic, assign) CGFloat centerY;@property (nonatomic, assign) CGFloat width;@property (nonatomic, assign) CGFloat height;@property (nonatomic, assign) CGSize size;@property (nonatomic, assign) CGPoint origin;@end
布局是我的项目中最高频呈现的,一个新我的项目如果你没有做 UIView 如上的category办法,那么你每次扭转一个frame都要写全,相当繁琐。
还有一些比方反对SVG图渲染、自定义色彩、导航栏状态栏默认高度等等,就是因为这些根底的逻辑无形中晋升了开发的门槛。
所以我在我的项目中集成这些能力后,将这些根底能力抽成一个我的项目,如果想开发App的根底这个我的项目开发上手速度会更快:
一个通用的iOS开发底层模板(继续更新)
我的项目集成了如下的库:
pod 'YYKit' pod 'Colours' pod 'SDWebImage' pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '3.x' pod 'WCDB' pod 'AFNetworking', '~> 3.1.0' pod 'ViaBus' pod 'FCAlertView' pod "Aspects"
- YYKit:提供各种根底通用能力的库
- Colours:一个提供比零碎更全的色彩库
- SDWebImage:https图片加载框架
- SVGKit:SVG图加载框架
- WCDB:通用弱小的iOS本地数据库
- AFNetworking:开源的http网络申请框架
- ViaBus:订阅总线框架
- FCAlertView:比零碎alertView性能更弱小的类
- Aspects:业内专用Num.1的AOP框架
因为应用cocoapods集成了根底库,所以下载应用前先执行 pod install
。
(二)B站、Youtube API 和 PostMan调试
1. 我是如何获取API的?-Chrome开发者模式
既然要搜寻订阅的up主,那么就须要获取blibil和youtube的查问api,那怎么获取 B站 的API呢?
咱们晓得 Chrome 的开发者模式能够抓取网络申请,所以咱们依照上面的流程操作:
关上B站的搜寻界面:
而后关上Chrome浏览器自带的 开发者工具:
关上之后界面是这样的:
接着咱们从新刷新界面,让开发者工作抓到咱们的网络申请:
能够看到「网络」这一栏呈现了如此多的网络申请回包,其中有一个网络申请就是咱们查问B站的接口,咱们如何疾速从中获取咱们想要的API?
咱们在「响应」这一栏中能够看到网络回包的后果:
{ "code": 0, "message": "0", "ttl": 1, "data": { "seid": "1742183592668294498", "page": 1, "pagesize": 36, "numResults": 1, "numPages": 1, "suggest_keyword": "", "rqt_type": "search", "cost_time": { "params_check": "0.000513", "get upuser live status": "0.002915", "illegal_handler": "0.012658", "as_response_format": "0.003668", "as_request": "0.023251", "save_cache": "0.000952", "deserialize_response": "0.000201", "as_request_format": "0.000448", "total": "0.045491", "main_handler": "0.027793" }, "exp_list": { "7706": true, "5507": true, "6604": true }, "egg_hit": 0, "result": [{ "type": "bili_user", "mid": 41487006, "uname": "木南之的技术生存", "usign": "腾讯iOS开发工程师,有一只仓鼠(二狗)一只猫(芝士),我的网站:https://bninecoding.com", "fans": 2, "videos": 7, "upic": "//i2.hdslb.com/bfs/face/2399a9747dbc4449139da82cbaff23e332a8d94d.jpg", "face_nft": 0, "verify_info": "", "level": 4, "gender": 1, "is_upuser": 1, "is_live": 0, "room_id": 22106726, "res": [], "official_verify": { "type": 127, "desc": "" }, "hit_columns": ["uname"] }], "show_column": 0 }}
能够看到 data->result 中发现了 木南之的技术生存
的信息,而且还是一个规范的json格局,这必定就是咱们须要的 api了,咱们点击申请头把申请api拷贝进去:
https://api.bilibili.com/x/web-interface/search/type?__refresh__=true&_extra=&context=&page=1&page_size=36&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=木南之的技术生存&category_id=&search_type=bili_user&order_sort=0&user_type=0&dynamic_offset=0&preload=true&com2co=true
外面有一些咱们用不上的参数,通过精简,咱们失去如下的B站查问接口api:
https://api.bilibili.com/x/web-interface/search/type?page=1&page_size=5&search_type=bili_user&order_sort=0&user_type=0&keyword=木南之的技术生存
2. B站、Youtube API大公开
(1)B站搜寻API
https://api.bilibili.com/x/web-interface/search/type?page=1&page_size=5&search_type=bili_user&order_sort=0&user_type=0&keyword=木南之的技术生存
(2)B站获取发表内容API
https://api.bilibili.com/x/space/arc/search?mid=xxxxx
(3)Youtube搜寻API
https://youtube.googleapis.com/youtube/v3/search?part=snippet&maxResults=5&type=channel&key=秘钥&q=搜寻内容
秘钥能够在 Google Youtube API 上注册获取,收费但有每日调用束缚。
(4)Youtube获取内容API
https://youtube.googleapis.com/youtube/v3/search?part=snippet&order=date&type=video&key=秘钥&channelId=xxxx
3. PostMan API调试利器
在调整API期间,我应用了 PostMan 这款API调试利器,能够十分不便帮咱们验证到底是iOS的代码有问题,还是接口的问题。
三、提审AppStore斗智斗勇
iOS 打包和上架流程能够参考这篇文章,iOS App的打包和上架流程
我依照这篇流程走下来,根本没踩什么坑,如果你要进行iOS App的打包和上架,倡议你先看完下面这篇文章,而后再看我上面的补充:
在应用 Xcode - Product - Archive - upload 打包上传后,咱们预期是能在 Apple Development 提审网站 的 「构建版本」 看到咱们上传的ipa包的
但实际上会发现咱们 upload 后,大概要等上个 10分钟 左右,能力在网站上刷到咱们上传的包,是什么起因呢?
是因为Apple会对咱们上传的包进行一遍动态代码扫描,比方调用公有API、应用过期无奈保护的组件都会被reject,比方我上面收到的一个正告:
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).
意思很分明,说咱们不能在我的项目中应用 UIWebView ,因为曾经被废除了,倡议咱们改用 WKWebView,咱们按倡议批改即可。
当动态代码扫描通过后,咱们会收到如下一封右键,这就示意咱们能够提审ipa包了,咱们增加构建版本即可。