乐趣区

关于objective-c:3天时间从零到上架AppStore流程记录

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 包了,咱们增加构建版本即可。

退出移动版