iOS开发中常见bug!(内附解答方法)
序言
你是否曾经修复了一个 bug ,随后又发现了一个跟刚修复 bug 有关的 bug ,又或是修复 bug 的方式引起了另一个 bug ?
然而这些问题是绝佳的学习机会。所以我们怎样尽可能多地从修复的问题中吸取经验?小编用的方法就是写下这个问题的简单描述、修复方法以及吸取的经验。使用这个方法了,让这个方法帮助自己成为一个更出色的程序员。
在分享这篇文章之前小编先分享自己建的一个“iOS程序员开发者的QQ群”“638302184”每天都会有开发者分享案例一起探讨工作中的问题,群里还会分享阿里面试题及各大BAT面试题,各种区块链,iOS安全攻防,ARKit技术,移动架构,底层,音视频处理技术,新技术开发,高级进阶的高级教学视频免费分享!
1、iOS在app切换到后台后如何继续进行下载?
NSURLSession已经支持app按下home键之后,仍让能够进行下载的任务。但是app退出之后不能进行下载。对于NSURLSession添加如下的属性即可进行后台下载。
- (NSURLSession *)session {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.wj.demo.BackgroundSession"];
_queue = [NSOperationQueue new];
_queue.maxConcurrentOperationCount = 1;//同时支持的最多下载次数
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:_queue];
});
return _session;
}
但是当用户在按钮home键的时候,这个下载还能继续进行。
如果用户在后台按钮home键之后,上滑将app杀死之后,我们应该在appdidregiestActive的方法里面先将所有的下载任务暂停。
2、IAP内购中虚拟货币导致审核无法通过的问题?
有的时候我们需要在app中使用虚拟货币,在我们的app中可以使用虚拟货币进行购买道具等,比如直播中的礼物,游戏中的道具等。
苹果对于虚拟货币是需要提成的,提成的额度为30%。所以对于这块的审核比较严格。首先你们的购买的道具在ios端和安卓端是需要分开的。如果大家玩游戏的就会发现游戏的数据在两端是分开的。
用户在安卓手机上购买的道具在iOS上是不能使用的。因为这样也间接的影响了苹果的收入。
另外就是在审核期间不能有可以兑换在appStore可购买的商品,的任意活动或者兑换码,这个也是苹果不允许的。因为这个也会影响苹果的收入。
另外就是可能有的同学会在苹果审核之后隐藏ipa支付,此处提醒下,苹果会扫描你的app代码中是否有支付宝,微信等关于支付的字段。使用开关加h5的方式可以通过审核,但是此处也有风险,风险就是一旦被发现,可能的结果就是苹果直接封掉账号。app无法使用。
3、如何用dispatch_Group监听afn 下载完成
用dispatch_Group只能控制网络请求的先后顺序,但是要监听是否下载完成好像不行;但是可以用其他的方式来监听;例如:
可以在每个网络请求的成功或失败回调里面设置一个bool标识符为YES,并发送一个通知,在当前页面监听通知,并在监听的通知方法里面,对所有网络请求涉及到的bool标识符进行判断,如果都为YES,就可以认为是所有网络请求都请求完成,就可以执行自己想要进行的操作
4、iOS原生端如何使用JSCore进行原生和iOS的交互
在 - (void)webViewDidFinishLoad:(UIWebView *)webView 方法中
[webView stringByEvaluatingJavaScriptFromString:@"editReady2();”];
调用此方法即可调用js中的方法。
此处有的时候可能会调用不到js中的方法,原因有可能是js的代码和html的代码是分开放置的,通过此时不一定能够拿到js中的代码。解决的方法是,先获取整个html的代码。在html代码的后面拼接js的路径,然后使用 webView loadHtml的方法去执行网页上的数据。
JS调用oc中的方法
在 - (void)webViewDidFinishLoad:(UIWebView *)webView 方法中
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext”];
//change2 前后端约定的字符串
context[@"change2"] = ^(){ NSArray *params = [JSContext currentArguments];
//根据点击js端的方法,会传递对应的参数给OC端,OC端根据约定的参数规则即可相应的对应的操作。
NSLog(@“%@“,params);
};
5、用户信息是保存在沙盒还是userdefault比较好
首先NSUserDefaults就是在沙盒中。一般用户的属性不会很多,所以采用 加密+偏好的方式或者是归档的方式可以保存。但是现在属性这么多,建议使用归档,使用归档的时候,json转model等等都有第三方辅助,很方便。
至于登录保存用户信息,方式很有很多种:
一.单例模式,登陆后把用户数据存储在单例对象
二. NSUserDefaults .数据存储后可以关闭app后依然存在,只有卸载App或者手动删除,数据才会消失
三.钥匙串,数据可以删除app后依然存在,钥匙串由操作系统保护并且存储后的数据是比较安全的,长用来存储一些密码,私钥
6、开发中试图通过kvo来监听 uiwebview.scrollview contentSize 来动态改变 uiwebview 的frame 以达到 uiwebview 刚好填充contentSize的效果, 实际上效果会导致一个死循环,让scrollview.frame越来越大
scrollView 的 contentSize 和 bound 有着密切的关系,而bound 与frame有着密切的关系,因此这样做是不合理的
解决方法
// 在y方向给足contentsize足够的空间
_webView.scrollView.contentSize=CGSizeMake(self.view.bounds.size.width,MAXFLOAT);
[_webView loadHTMLString:html baseURL:nil];
// 加载完毕后再调整y方向的contentSize
- (void)webViewDidFinishLoad:(UIWebView*)webView
{
//在加载完毕之后获取webview内容所需要的空间
CGSizesize = [webViewsizeThatFits:CGSizeMake(self.view.bounds.size.width,MAXFLOAT)];
CGRectframe =CGRectMake(0,0, size.width, size.height);
webView.frame= frame;
//调整好frame之后再调整contentsize
webView.scrollView.contentSize=CGSizeMake(0,0);
}
7、在做代驾项目,用户下单之后司机的状态是极光推送到用户的 如果用户禁止app的推送功能 我应该怎么实现我的实时查看司机/订单信息的需求。
解决这个问题的方式有两种方式:
1.app和服务器建立长连接,将数据实时传递app。此方式可能需要和服务器人员讨论,可能对服务器的要求比较高。
2.另一种方式是定时发送请求,类似前端使用的心跳包的方式,当然用户也可以在信息展示界面进行手动刷新。此方式的好处是后台的压力会比较小。
8、如何实现在app中打开淘宝,并且跳转到指定的应用?比如优惠券页面
找到淘宝的URLScheme并且在URLScheme添加指定的参数,如果你的本机安装了淘宝app客户端,可以跳转到淘宝的指定页面。
比如如下URLScheme
taobao://item.taobao.com/item.hem?spm=a1z10.3-c.w4002-14141359151.28.m8vuq0$id=533219732078.
如何找到这样的URLSCheme。
在模拟器写一个appDemo,和淘宝的包名一致,然后找到一个你需要的链接,比如优惠卷,点击跳转的按钮,然后在
-(BOOL)application:(UIApplication *)application handleOPenURL:(NSURL *)url{}
此方法中打印出来即可。
9、App上架后,如何修改app上显示的公司名称
解答方式:
1.先修改开发者账号中填写的公司名称。
2.再提交更新版本。
如何修改开发者账号中的公司名称:
登陆到Apple developer上面,在people里面的开发者列表中找到agent,让agent的这个人直接拨打苹果开发部咨询电话:400-670-1855,修改开发者账号上的公司名或者用你注册的账号的邮箱直接写邮件:“我需要更改公司名称”到chinadev@asia.apple.com,让苹果开发部客服来处理。
10、iOS打包成功之后,运行在iPhone上会闪退,黑屏?
关于打包之后无法安装,或者安装之后闪退的情况。只有可能是两种情况,一种是证书错误,另一种就是当前的设备并不在开发者对应的账号里面。
我们来看一下怎么检测当前的设备是否在开发者的证书里呢,如果你有开发者账号,当然登录app即可获得。但是没有开发者账号的情况我们该怎么办呢?
我们以下面的ipa包为例,必须是hoc或者dev的包

ipa其实就是一个压缩文件,我们可以对齐解压。得到一个payload文件夹。

解压后,点击进入文件夹,然后显示包内容,可以看到里面的文件列表

我们找到对应的证书 embedded.mobileprovision 这个就是你的ipa包里面使用的签名证书。
然后mac上开启终端。并cd到证书所在的路径
并且在终端输入
//查看dev.hoc包中的已经添加的设备号
security cms -D -i embedded.mobileprovision > entitlements_full.plist
在证书对应的路径会生成一个文件

用xcode打开这个文件

这里面就是你的证书里面对应的所有的设备号。
最后
我发现为每个有趣的 问题 记录下来,可以让我轻易学习到很多。在记录的行为中我会对发生的事情思考得更深刻。同样,一旦记录下来,我可以在之后检查发生的事情。偶尔,我也会浏览文件,只阅读教训部分,对我认为是从问题中学到的最有价值的经验加强记忆。
今天给大家的分享就到这!有收获,或者喜欢小编的可以关注小编同时也欢迎大家加入小编的iOS交流群638302184,小编会分享小编记录的全部问题,大家一起交流成长!!
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
iOS开发中常见bug!(内附解答方法)的更多相关文章
- iOS开发中常见的一些异常
iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistency ...
- iOS开发中,应用内直接跳转到Appstore
iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat: ...
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
- iOS开发中常见的语句@synthesize obj = _obj 的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- iOS开发中常见的语句@synthesize obj=obj的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- 转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...
- iOS开发中常见的问题
1.重复调用2次loadView和viewDidLoad 最好不要在UIViewController的loadView方法中改变状态栏的可视性(比如状态栏由显示变为隐藏.或者由隐藏变为显示),因为 ...
- iOS 开发中常见的崩溃错误
1.duplicate symbols for architecture armv7 1.首先排查是否有名字重复的文件: 2.检查是否在#import头文件的时候,不小心把.h写成了.m. 2 ...
随机推荐
- pyDash:一个基于 web 的 Linux 性能监测工具
pyDash 是一个轻量且基于 web 的 Linux 性能监测工具,它是用 Python 和 Django 加上 Chart.js 来写的.经测试,在下面这些主流 Linux 发行版上可运行:Cen ...
- sqlsever 科学计数法 转标准值
一.解决方案 2e-005 转成 0.00002 update 表名 set 列名=cast(列名 as float) as decimal(19,5)) where 列名 like '%e%' 如 ...
- 【阿里聚安全·安全周刊】科学家警告外星恶意代码|新方法任意解锁iPhone
本周的七个关键词: 外星恶意代码 丨 任意解锁iPhone 丨 安卓9.0 丨 黑客攻击医疗设备 丨 仙女座僵尸网络 丨 苹果联合创始人被骗比特币 丨JavaScript -1- [恶意代码] ...
- SELinux一键开启与禁用脚本
SELinux是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.但是SELinux的并不能与众多服务很好的兼容,有些人会关闭SELinux一了百了.在日常的运 ...
- Linux基础六
用户账号管理 基于账号身份对资源访问进行控制 账户类别:用户账号,组账号 识别方式:UID,GID 用户账号:超级用户root,系统用户,普通用户 组账号:用来区分权限,不用于登陆 基本组(私有组) ...
- flask中jinjia2模板引擎详解4
接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends & ...
- Android设备唯一码的获取
Android设备唯一码的获取 UTDID是集团无线设备统一ID方案,目的是给每一台设备一个ID,作为唯一标识.UTDID由客户端生成,并在设备中各个客户端之间共享.UTDID的生成中包含时间戳和随机 ...
- 工作中常用的linux命令(1)
1.cd :进入一个目录,例如进入/home/admin目录:cd /home/admin 2.pwd :查看当前所在目录:如图: 3.ls :列出当前目录下的所有文件: 4.ll :列出当前目录下的 ...
- 笔记︱支持向量机SVM在金融风险欺诈中应用简述
本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 欺诈一般不用什么深入的模型进行拟合,比较看重分析员对业务的了解,从异常 ...
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境
我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是Mac本都比较昂贵,所以我们可以采用Windows7上利用VMWare安装Mac操作系统的方法来模拟ios开发环境,达到降低成本 ...