In-App Purchase 内购丢单、串单处理

内支付相信是很多开发者的伤痛,由于内支付的处理机制导致很多情况下会出现丢单的情况,这边文章就着重聊一下内购丢单的情况和处理。如果你对内支付还不是很了解建议你看下这边文章,内购流程:http://blog.csdn.net/teng_ontheway/article/details/47011813 惯例美女镇楼哈 😝

IMG_4304.JPG 1.下面是我自己画的一个大概的流程图(字比较烂,将就这看吧哈~) =======

IMG_6284.JPG

图中 ① 为请求商品详情之后根据商品的ID 发起支付请求 (这里的Id 就是商品的ProductId) 1.png 在发起支付之后 ,会收到苹果返回的商品信息(这些信息是你上架商品时候填写的),然后在根据这些信息把此次支付封装成一次事务加到苹果的支付事务里(个人理解)。如图 这里面有一个重要是 操作是为了防止发生丢单,串单的在下面在详解

然后是图中② 在收到苹果返回的支付结果后做的处理 3.png

这里会收到苹果支付的返回凭证,这里要做下本地存储,防止发送后台失败引起的丢单。 4.png 然后在成功验证发放商品之后在删除本地存储 5.png

2.丢单产生的情况和处理

1.在①的时候重点是在封装的时候把订单信息写进SKMutablePayment,这样在收到支付结果的时候就可以去取出这个订单号,发送后台进行验证,这样就能有效的规避串单问题。 2.在②的时候在用户支付之后还未收到凭证回调之后如果app 出现异常,就不能正常接收支付结果的回调,这个时候,只要不主动关闭这次交易事务下次设置监听的时候(建议重启的时候),还是可以获取到这次交易回调,再进行凭证处理。

MyStoreObserver *tempObserver = [MyStoreObserver shareInstance];
self.observer = tempObserver;
[[SKPaymentQueue defaultQueue] addTransactionObserver:tempObserver];

3.在③的时候收到凭证的回调之后发送后台验证这块很可能会出现发送失败等情况,这个时候就要把凭证进行本地存储(存储的是记得是存储为数组,因为可能有多个),在验证成功之后再删除本地存储的凭证。

丢单的处理在上面的贴图代码中也有体现,希望对你会有帮助,大体总结就到这里了,中午吃饭了,就这么多吧! 😝

Read More >>>

iOS 最新审核被拒及解决方案 (包括2.1大礼包)

临近年底手里的app都要上线,不知道大家有没有感觉这段时间的审核团队各种严,手里的3个项目全部被卡(3个不同账号),其中两个是迭代,一个是新上线的app。全部都遭到了毒手~~~~(>_<)~~~~ 下面我就我遇见的问题做一下总结,希望可以帮到正在困惑中的你。

Guideline 2.3.3 - Performance - Accurate Metadata

We noticed that your screenshots do not sufficiently reflect your app in use. Please see attached screenshots for details. Next Steps To resolve this issue, please revise your screenshots to ensure that they accurately reflect the app in use on the supported devices. For iPhone, you need a set of 5.5-inch display screenshots and for iPad, you need a set for 12.9-inch display. This set will be scaled appropriately down to other device sizes when viewed on the App Store in each territory. Resources For resources on creating great screenshots for the App Store, you may want to review the App Store Product Page information available on the Apple developer portal. Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Learn how to use Media Manager to add custom screenshots for each display size and localization. Since your iTunes Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit iTunes Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review. NOTE: Please be sure to make any metadata changes to all app localizations by selecting each specific localization and making appropriate changes.

这个问题很简单就是说自己的截图不能反应自己App的主要功能,然后重新换了截图(我是主要截了下自己的App的几个模块)就可以了

Guideline 2.1 - Performance - App Completeness

We discovered one or more bugs in your app when reviewed on iPad running iOS 11.2.5 on Wi-Fi connected to an IPv6 network. Specifically, the In-App Purchase (IAP) results in an error. Below are the steps to reproduce the issue: 1. Launch the application 2. Navigate to Purchase/Recharge tab 3. Proceed to purchase one of the IAP products 4. IAP confirmation window appears 5. Confirm Purchase 6. IAP results in an error The review was conducted under sandbox environment. Please see attached screenshots for details. Next Steps To resolve this issue, please run your app on a device to identify any issues, then revise and resubmit your app for review. If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work. For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue. Resources For information about testing your app and preparing it for review, please see Technical Note TN2431: App Testing Guide.  For a networking overview, please review About Networking. For a more specific overview of App Review’s IPv6 requirements, please review the IPv6 and App Review discussion on the Apple Developer Forum.

1.png

这个问题写的很清楚,说是在IPad上 IPv6网络下进行内购的时候支付不成功,老是支付失败

当我收到这个邮件的时候我就立刻做了开始测试,模拟IPv6网络 然后用iPhone 和iPad 都进行了测试,发现内购是完全可以的,只是在IPad 上面内购回调有点慢,然后我就截图给他们告诉他们经过测试内购是可以完成的没有问题的,然后晚上就等他们的回复。他们的邮件回复一般都是晚上1点之后(那个时候他们是早上8点多),等到晚上收到邮件还是说内购不行,还附带了一样的截图。然后我就奇怪了,怎么可能会这个样子呢,明明没有问题的他们怎么老是支付不成功呢,突然我发现一个问题,难道他们测支付不是用的沙盒测试账号?因为我的app 是新上的项目 内购项目还没有审核通过,如果不用沙盒测试账号就一定会购买失败,难道他们不是用的沙盒测试账号?不会吧! 虽然我不相信他们会这么傻,但是我也没有其他的办法可以处理了。

之后我又回复邮件给他们说我的内购项目还没有过审核,内购测试必须用沙盒账号测试,然后又录制了视频传到了YouTube 证明在IPad 上内购是可以完成的。

然后有经过一天的等待晚上的时候收到了苹果的邮件回复:

Hello, Thank you for your response. We will continue to review your app, and will notify you if there are any further issues. Best regards, App Store Review

说感谢你的回复,我们再继续审核您的App。(说真的当时收到这个邮件的时候我并没有开心,我以为我们回复的次数太多他们烦了?这是要挂起我的App了?要过就过不过就不过呗,什么叫做继续审核,难道这就是传说中的延期审核吗?),当时有点担心的睡下了... 然而第二天我突然你发现竟然过了!开心的我在地铁里蹦了起来!

这个问题总结来说,如果自己真的没有问题就大胆的去据理力争吧,虽然审核变得很严但是没问题就是没问题,可以录视频截图证明自己的清白😝

Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

We noticed that your app requests the user’s consent to access their Camera but does not clarify the use of this feature in the permission modal alert. Next Steps To resolve this issue, please revise the permission modal alert to specify why the app is requesting access to the user's Camera. Resources To learn more about requesting the user’s permission to access app features, visit the iOS Human Interface Guidelines. You may also want to review the Technical Q&A QA1937: Resolving the Privacy-Sensitive Data App Rejection page for details on how to provide a usage description for permission request alerts.

这个问题是说我们在项目中使用到相机权限,却没有告诉用户什么地方使用到这个权限

这里改成在什么服务中使用到相机就可以了,给过了!

Guideline 3.1.1 - Business - Payments - In-App Purchase

We noticed that your app or its metadata enables the purchase of content, services, or functionality in the app by means other than the in-app purchase API, which is not appropriate for the App Store. The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved. Next Steps - Review the In-App Purchase section of the App Store Review Guidelines. - Ensure your app is compliant with all sections of the App Store Review Guidelines and the Terms & Conditions of the Apple Developer Program.  - Once your app is fully compliant, resubmit your app for review. If you believe your app is compliant with the App Store Review Guidelines, you may submit an appeal. Alternatively, you may provide additional details about your app by replying directly to this message. In-App Purchase It may be appropriate to revise your app to use the in-app purchase API to provide content purchasing functionality. In-app purchase provides several benefits, including: - The flexibility to support a variety of business models. - Impacting your app ranking by consolidating your sales to one app rather than distributing them across multiple apps. - An effective marketing vehicle to drive additional sales of new content. For information on in-app purchase, please refer to the following documentation: In-App Purchase for Developers In-App Purchase Programming Guide For step-by-step instructions on in-app purchase creation within iTunes Connect, refer to In-App Purchase for Developers.

这个是说我的App用了内购之外的其他第三方支付(其实我们是做了隐形开关的),这个问题比较严重的,审核团队直接说你们的项目无法在加速,下次审核时间会比较长,这种问题如果你也准备这么做,建议最好现在不要,最近这个问题卡的非常严,处罚的也很重。 最好还是老老实实的删除掉了第三方支付换成了内购!

Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

We noticed that your app requests the user’s consent to access the Location services but does not clarify the use of this feature in the permission modal alert. Please see attached screenshots for details. Next Steps To resolve this issue, please revise the permission modal alert to specify why the app is requesting access to the Location services. Resources To learn more about requesting the user’s permission to access app features, visit the iOS Human Interface Guidelines. You may also want to review the Technical Q&A QA1937: Resolving the Privacy-Sensitive Data App Rejection page for details on how to provide a usage description for permission request alerts. 2.png

这个问题说是我们使用了定位功能却没有说明哪里使用了定位却没有在权限中说明。 但是我们的应用没有使用定位,也没有寓见这个字眼,然后就非常莫名其妙,然后我就回复邮件告诉他们我们没有使用到定位功能,也从来没有使用这个字眼。 然后他们回复邮件说好吧,那你继续改其他问题吧..... (还有其他的问题就是上面的内购)。 好吧,搞不懂怎么截取到这样的图,怀疑是其他应用弹出的!

Guideline 4.2.3 - Design - Minimum Functionality

We were required to install the QQ app before we could log in via QQ. Users should be able to log in with QQ and access their accounts without having to install any additional apps. Next Steps If you would like to offer authentication through QQ, please use a mechanism that allows users to log in with QQ from within your app without first having to install an additional app. We recommend implementing the Safari View Controller API to display web content within your app. The Safari View Controller allows the display of a URL and inspection of the certificate from an embedded browser in an app so that customers can verify the webpage URL and SSL certificate to confirm they are entering their sign in credentials into a legitimate page. Resources For additional information on the Safari View Controller API, please review the What's New in Safari webpage.

qq第三方登录必须安装qq才行,希望不安装qq也能使用,处理方法是支持网页的qq登录

Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

We noticed that your app requires users to register with personal information to purchase non account-based in-app purchase products, which does not comply with the App Store Review Guidelines. Please see attached screenshot for details. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user. Next Steps User registration that requires the sharing of personal information must be optional or tied to account-specific functionality. To resolve this issue, please make it clear to the user that registering will enable them to access the content from any of their iOS devices, and to provide them a way to register at any time, if they wish to later extend access to additional iOS devices.

我们注意到您的应用需要用户注册个人信息才能购买非基于帐户的应用内购买产品,这些产品不符合“App Store评论指南”。 这个问题我之前在另一个App 就遇见过一次,当时我记得我是发邮件申述了下,说明我们的App 必须要登录才能购买商品,因为我们的商品是必须依托账号什么的巴拉巴拉的..... 具体什么我也忘了,当然如果你觉得可以说的清楚也可以试试,如果不行就要老实改下了,改成游客也能购买商品,最好是做到根据iCoud 存储下购买记录,以便跨设备使用。

Guideline 2.1 - Information Needed

This type of app has been identified as one that may violate one or more of the following App Store Review Guidelines. Specifically, these types of apps often: 1.1.6 - Include false information, features, or misleading metadata. 2.3.0 - Undergo significant concept changes after approval 2.3.1 - Have hidden or undocumented features, including hidden "switches" that redirect to a gambling or lottery website 3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app 4.3.0 - Are a duplicate of another app or are conspicuously similar to another app 5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app 5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used Before we can continue with our review, please confirm that this app does not violate any of the above guidelines. You may reply to this message in Resolution Center or the App Review Information section in iTunes Connect to verify this app’s compliance.  Given the tendency for apps of this type to violate the aforementioned guidelines, this review will take additional time. If at any time we discover that this app is in violation of these guidelines, the app will be rejected and removed from the App Store, and it may result in the termination of your Apple Developer Program account.

这个问题可能是最近爆出的一个终极大boss了,直接说的下次提交如果再出现其中的问题就直接删除应用甚至封号。当时看到这个我吓了一跳.这么多问题..... 后来发现好多人都收到了这封邮件. 而且很多App都没有违反上面的任何一条就也收到了这个. 足以证明收到这条邮件并不代表你有上述的所有问题,你要自己逐项审查下,如果没有也是可以回复邮件的(目前已知的有人回复邮件说自己没有出现 以上问题也通过审核的了)当然这个也要根据你自己的项目情况做处理,但是有一点是可以肯定的就是如果你真的有问题有收到了这封邮件那你就要好好处理下了,因为你很可能已经被盯上和针对了,下一次提交一定会被重点对待的。

xia

Read More >>>

2018 - iOS 面试题汇总

金三银四,相信最近很多人都在跳槽。那么面试题自然还是要看下的,在这我就把我手里收集到的面试题(朋友面试,网上收集等等)进行了汇总,希望可以帮到正在或者准备面试的你,同时我也可以自己在过一遍😝

一般面试题

1.堆和栈的区别

1.内存管理范围 只有oc对象需要进行内存管理 非oc对象类型比如基本数据类型不需要进行内存管理 2.内存管理本质 因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release OC对象存放于堆里面(堆内存要程序员手动回收) 非OC对象一般放在栈里面(栈内存会被系统自动回收) 堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存 3.内存分配以及管理方式 按分配方式分 堆是动态分配和回收内存的,没有静态分配的堆 栈有两种分配方式:静态分配和动态分配 静态分配是系统编译器完成的,比如局部变量的分配 动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理 按管理方式分 对于栈来讲,是由系统编译器自动管理,不需要程序员手动管理 对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露 堆:是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。堆里面一般 放的是静态数据,比如static的数据和字符串常量等,资源加载后一般也放在堆里面。一个进程的所有线程共有这些堆 ,所以对堆的操作要考虑同步和互斥的问题。程序里面编译后的数据段都是堆的一部分。 栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此 ,栈是 thread safe的。每个c++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换ss/esp寄存器。栈空间不需要在高级语言里面显式的分配 和释放。 一句话总结就是 堆:由程序员分配和释放,如果不释放可能会引起内存泄漏 栈:由编译器自动分配和释放,一般存放参数值,局部变量

2.KVO和KVC

KVC,即是指 NSKeyValueCoding(键值编码),提供一种机制来间接访问对象的属性。KVC 就是基于KVO技术来实现的。 KVO,提供了一种观察者的机制,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用"observeValueForKeyPath:"方法。

  1. OC中创建线程的方法是什么?如果在主线程中执行代码, 方法是什么?如果想延时执行代码、方法是什么?

    1、线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue; 2、在主线程执行代码,方法是performSelectorOnMainThread:withObject:waitUntilDone:; 3、如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:;

4.指针与数组名的关系?

int arrayName[4] = {10, 20, 30, 40}; int p = (int )(&arrayName + 1); NSLog(@"%d", (&arrayName - 1)); 1.(&arrayName + 1):&arrayName是数组的地址(等价于指向arrayName数组的指针) 2.增加 1 会往后移动16个字节,开始是4个字节的位置,移动后就是16个字节后面的位置(也就是目前位置是20个字节) 3.最后又赋值给,int类型的指针p(int类型占4个字节) 4.所以(p - 1)就是减去4个字节,变成为16个字节的位置,输出的(p - 1)值为40 int p = (int )(&arrayName + 1); NSLog(@"%d", *(p - 1));//输出结果为 40

5.#import 和#include有 么区别?@class呢?#import <>和 #import"" 有 么区别?

import是OC导入头文件的关键字,#include是C/C++导入头文件的关键字 使用#import只导入一次不会重复导入,相当于#include和#pragma once;(使用#include可能会出现循环引用,使用#pragma once消除这种可能) @class一般用于声明某个字符串作为类名使用,它只是声明了一个类名,没有导入.h文件中的内容,不会引起交叉编译问题 import< >代表导入系统自带的框架 import" "代表导入我们自己创建的文件,导入的使我们.h文件,也就是头文件

6.属性readwrite.readonly,assign,retain,copy,nonatomic 什么作用 ? 在哪种情况下 ?

readwrite 是可读可写特性;需要生成getter方法和setter方法时(补充:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)) readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变 assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时; retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1; copy 表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。 nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使 用nonatomic

7.IBOutlet 连出来的视图属性为什么可以被设置成weak?

在 storyboard 中添加一个控件引用关系是这样的(以 UIbutton 为例): UIviewController -> UIview -> UIbutton 此时 UIviewController 强引用着 UIview , UIview 强引用着 UIbutton , IBoutlet 连线到控制器的. m 或者. h 中作为视图的属性时用 weak 修饰就可以了, (觉得用 strong 修饰也可以但是没有必要) 添加到子控件也是强引用: UIbutton 就是添加到了 UIviewController 的 view 上

8 预处 指令define 声明 个常数, 以表明 中有多 少秒(忽 闰 问题)。

define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

9.重写-个NSString类型的,retain 式声明name属性的 setter和getter 法(MRC)

属性的三大特性:语义特性,原子特性,读写特性. 同时重写setter和getter方法,@synchronized name = _name,关联属性和实例变量 如 -(void)setName:(NSString )name{ if(_name != name){ [_name retain]; [_name release]; _name = name; } } -(NSString )name{ return [[_name retain]autorelease] }

10.分析json、xml 的区别? json、xml 解析 式的底层是如何让处理的

(一)JSON与XML的区别: (1)可读性方面:基本相同,XML的可读性比较好; (2)可扩展性方面:都具有良好的扩展性; (3)编码难度方面:相对而言,JSON的编码比较容易; (4)解码难度:JSON的解码难度基本为零,XML需要考虑子节点和父节点; (5)数据体积方面:JSON相对于XML来讲,数据体积小,传递的速度比较快; (6)数据交互方面:JSON与javascript的交互更加方便,更容易解析处理,更好的数据交互; (7)数据描述方面:XML对数据描述性比较好 (8)传输速度方面:JSON的速度远远快于XML。 (二)JSON与XML底层实现原理:  (1)JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}、[]、:等进行区分,{}号表示字典,[]号表示数组,:号是字典的键和值的分水岭,最终仍是将JSON转化为字典,只不过字典中的值可能是“字典、数组或者字符串而已”。   (2)XML底层原理:XML解析常用的解析方法有两种:DOM解析和SAX解析;DOM采用的是树形结构的方式访问XML文档,而SAX采用的是事件模型;DOM解析把XML文档转化为一个包含其内容的树,并可以对树进行遍历,使用DOM解析器的时候需要处理整个XML文档,所以对内存和性能的要求比较高;SAX在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,他可以激活一个回调方法,告诉该方法指定的标签已经找到,SAX对内存的要求通常会比较低,因为他让开发人员自己来决定所要处理的tag,特别是当开发人员只需要处理文档中所包含部分数据时,SAX这种扩展能力得到了更好的体现。

11.对程序性能的优化你有什么建议?

1.使用复用机制 2.尽可能设置 View 为不透明 3.避免臃肿的 XIB 文件 4.不要阻塞主线程 5.图片尺寸匹配 UIImageView 6.选择合适的容器 7.启用 GZIP 数据压缩 8.View 的复用和懒加载机制 9、缓存 服务器的响应信息(response)。 图片。 计算值。比如:UITableView 的 row heights。 10.关于图形绘制 11.处理 Memory Warnings
在 AppDelegate 中实现 - [AppDelegate applicationDidReceiveMemoryWarning:] 代理方法。 在 UIViewController 中重载 didReceiveMemoryWarning 方法。 监听 UIApplicationDidReceiveMemoryWarningNotification 通知。 12.复用高开销的对象 13.减少离屏渲染(设置圆角和阴影的时候可以选用绘制的方法) 14.优化 UITableView 通过正确的设置 reuseIdentifier 来重用 Cell。 尽量减少不必要的透明 View。 尽量避免渐变效果、图片拉伸和离屏渲染。 当不同的行的高度不一样时,尽量缓存它们的高度值。 如果 Cell 展示的内容来自网络,确保用异步加载的方式来获取数据,并且缓存服务器的 response。 使用 shadowPath 来设置阴影效果。 尽量减少 subview 的数量,对于 subview 较多并且样式多变的 Cell,可以考虑用异步绘制或重写 drawRect。 尽量优化 - [UITableView tableView:cellForRowAtIndexPath:] 方法中的处理逻辑,如果确实要做一些处理,可以考虑做一次,缓存结果。 选择合适的数据结构来承载数据,不同的数据结构对不同操作的开销是存在差异的。 对于 rowHeight、sectionFooterHeight、sectionHeaderHeight 尽量使用常量。 15.选择合适的数据存储方式 在 iOS 中可以用来进行数据持有化的方案包括: NSUserDefaults。只适合用来存小数据。 XML、JSON、Plist 等文件。JSON 和 XML 文件的差异在「选择正确的数据格式」已经说过了。 使用 NSCoding 来存档。NSCoding 同样是对文件进行读写,所以它也会面临必须加载整个文件才能继续的问题。 使用 SQLite 数据库。可以配合 FMDB 使用。数据的相对文件来说还是好处很多的,比如可以按需取数据、不用暴力查找等等。 使用 CoreData。也是数据库技术,跟 SQLite 的性能差异比较小。但是 CoreData 是一个对象图谱模型,显得更面向对象;SQLite 就是常规的 DBMS。 16.减少应用启动时间 快速启动应用对于用户来说可以留下很好的印象。尤其是第一次使用时。 保证应用快速启动的指导原则: 尽量将启动过程中的处理分拆成各个异步处理流,比如:网络请求、数据库访问、数据解析等等。 避免臃肿的 XIB 文件,因为它们会在你的主线程中进行加载。重申:Storyboard 没这个问题,放心使用。 注意:在测试程序启动性能的时候,最好用与 Xcode 断开连接的设备进行测试。因为 watchdog 在使用 Xcode 进行调试的时候是不会启动的。 17.使用 Autorelease Pool (内存释放池) 18.imageNamed 和 imageWithContentsOfFile

12.runloop 和线程有什么关系?

runloop与线程是一一对应的,一个runloop对应一个核心的线程,为什么说是核心的,是因为runloop是可以嵌套的,但是核心的只能有一个,他们的关系保存在一个全局的字典里。 runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。 runloop在第一次获取时被创建,在线程结束时被销毁。 对于主线程来说,runloop在程序一启动就默认创建好了。 对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调。

13 介绍下layoutSubview和drawRect

layoutSubviews调用情况 init初始化UIView不会触发调用 addSubview会触发调用 改变view的width和height的时候回触发调用 一个UIScrollView滚动会触发调用 旋转screen会触发调用 改变一个UIView大小的时候会触发superView的layoutSubviews事件 直接调用setLayoutSubviews会触发调用 -(void)viewWillAppear:(BOOL)animated会触发一次调用 -(void)viewDidAppear:(BOOL)animated 看情况,可能有调用 drawRect调用情况 如果UIView没有设置frame大小,直接导致drawRect不能被自动调用。 drawRect在loadView和viewDidLoad这两个方法之后调用 调用sizeToFit后自动调用drawRect 通过设置contentMode值为UIViewContentModeRedraw。那么每次设置或者更改frame自动调用drawRect。 直接调用setNeedsDisplay或者setNeedsDisplayInRect会触发调用

14.写个“标准“宏MIN,这个宏输两个参数并返回较小的那个

MIN(A,B) ((A) <= (B) ? (A) : (B))

15.类别有什么作用

1.扩展已有的类(添加方法) 2.可以通过runtime添加属性

  1. 什么是method swizzing?讲 讲你的使 场景以及使 时的注意事项

1.给扩展添加属性 2.替换系统方法的的实现

22.讲讲iOS事件响应链的原理

1、响应者链通常是由视图(UIView)构成的; 2、一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话),然后再转给它的父视图(Super View); 3、视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图; 4、单例的窗口(UIWindow)的内容视图将指向窗口本身作为它的下一个响应者 需要指出的是,Cocoa Touch应用不像Cocoa应用,它只有一个UIWindow对象,因此整个响应者链要简单一点; 5、单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向nil,以结束整个循环。

23.你在什么场景下会选择使 Category

1.扩展已有的类(添加方法)

24.UIview 和CAlayer 是什么关系? 你 CLayer做过什么?

  1. 首先UIView可以响应事件,Layer不可以.
  2. UIView是CALayer的delegate 3. UIView主要处理事件,CALayer负责绘制就更好 4. 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint 创建隐式动画 绘制边框圆角

25.如何处理UITableVier 中Cell 动态计算高度的问题,都有哪些方案?

1、你的Cell要使用AutoLayout来布局约束这是必须的; 设置tableview的estimatedRowHeight为一个非零值,这个属性是设置一个预估的高度值,不用太精确。 设置tableview的rowHeight属性为UITableViewAutomaticDimension 2.第三方 UITableView+FDTemplateLayoutCell

26.AutoLayout 中的优先级是什么? UIScrollView 中使用Autolayout 会出现什么问题?

代码计算frame -> autoreszing(父控件和子控件的关系) -> autolayout(任何控件都可以产生关系) -> sizeclass 可以设置两个看似有冲突的约束,但设置不同的优先级之后就不会有冲突了,当其中一个约束失效之后,另一个优先级比较低的约束就会起作用

27.NSIRLConnection 和NSLRLSession 的区别是 么? NSURLProtocol是做什么的?

1.下载 NSURLConnection下载文件时,先是将整个文件下载到内存,然后再写入到沙盒,如果文件比较大,就会出现内存暴涨的情况。 而使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem文件中,不会出现内存暴涨的情况,但是在下载完成后会把tem中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码 2.请求方法的控制 NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel可以停止请求的发送,停止后不能继续访问,需要创建新的请求。 NSURLSession有三个控制方法,取消(cancel)、暂停(suspend)、继续(resume),暂停以后可以通过继续恢复当前的请求任务。 使用NSURLSession进行断点下载更加便捷. NSURLSession的构造方法(sessionWithConfiguration:delegate:delegateQueue)中有一个NSURLSessionConfiguration类的参数可以设置配置信息,其决定了cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。NSURLConnection不能进行这个配置,相比较与NSURLConnection依赖与一个全局的配置对象,缺乏灵活性而言,NSURLSession有很大的改进

28.怎么高效的实现控件的圆角效果

绘制圆角 -(UIImageView )roundedRectImageViewWithCornerRadius:(CGFloat)cornerRadius { UIBezierPath bezierPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:cornerRadius]; CAShapeLayer *layer = [CAShapeLayer layer]; layer.path = bezierPath.CGPath; self.layer.mask = layer; return self; }

32.说说你了解weak属性?

weak关键字在OC中属于比较基础的知识此特性表明该属性定义了一种关系“非拥有关系”(nonowning relationship)。为这种属性设置新值得时,设置方法既不保留新值,也不释放旧值。此特性同assign类似,然后在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。

33.假如Controller太臃肿,如何优化?

1.将网络请求抽象到单独的类中 方便在基类中处理公共逻辑; 方便在基类中处理缓存逻辑,以及其它一些公共逻辑; 方便做对象的持久化。 2.将界面的封装抽象到专门的类中 构造专门的 UIView 的子类,来负责这些控件的拼装。这是最彻底和优雅的方式,不过稍微麻烦一些的是,你需要把这些控件的事件回调先接管,再都一一暴露回 Controller。 3.构造 ViewModel 借鉴MVVM。具体做法就是将 ViewController 给 View 传递数据这个过程,抽象成构造 ViewModel 的过程。 4.专门构造存储类 专门来处理本地数据的存取。 5.整合常量

34.项目中网络层如何做安全处理?

1.判断API的调用请求是否来自于经过授权的APP。如若不是则拒绝请求访问 2.在数据请求的过程中进行URL加密处理:防止反编译,接口信息被静态分析。 3.数据传输加密:对客户端传输数据提供有效的加密方案,以防止网络接口的拦截。 如果可以尽量使用HTTPS,可以有效的避免接口数据在传输中被攻击。

35.main()之前的过程有哪些?

在iOS中 main.m 是我们所熟悉的程序入口。但是在在此之前其实程序以及做了很多事了。如系统会获取dyld的路径,并加载。加载程序中的依赖库。调用所有的+ load方法,并返回main函数地址。

其他值得看的总结:

见过的最全的iOS面试题 iOS最新面试题汇总 招聘一个靠谱的 iOS

BAT面试题

出自:不懂技术的爱迪生

腾讯一面 1.使用了第三方库, 有看它们是怎么实现的吗? 2.强连通量算法了解嘛? 3.遇到tableView卡顿嘛?会造成卡顿的原因大致有哪些? 4.M、V、C相互通讯规则你知道的有哪些? 5.NStimer准吗?谈谈你的看法?如果不准该怎样实现一个精确的NSTimer? 答案详见:https://www.jianshu.com/p/0e9e7486e1a7

腾讯二面: 1.编译过程做了哪些事情; 2.字典大致实现原理; 3.block和函数指针的理解; 4.一般开始做一个项目,你的架构是如何思考的? 5.你了解的UIKit结构? 答案详见:https://www.jianshu.com/p/dd17bdcff9f7

腾讯三面 1.OC你了解的锁有哪些?在你回答基础上进行二次提问; 追问一:自旋和互斥对比? 追问二:用C/OC/C++,任选其一,实现自旋或互斥?口述即可! 2.内存泄漏可能会出现的几种原因,聊聊你的看法? 追问一:非OC对象如何处理? 追问二:若常用框架出现内存泄漏如何处理? 3.容错处理你们一般是怎么做的? 4.项目开始容错处理没做?如何防止拦截潜在的崩溃? 答案详见:https://www.jianshu.com/p/3a50d1805655

阿里 1.dSYM你是如何分析的? 2.多线程有哪几种?你更倾向于哪一种? 3.单例弊端? 4.如何把异步线程转换成同步任务进行单元测试? 5.介绍下App启动的完成过程? 6.比如App启动过慢,你可能想到的因素有哪些? 7.0x8badf00d表示是什么? 8.怎么防止反编译? 9.说说你遇到到的技术难点? 10.说说你了解的第三方原理或底层知识? 答案详见:http://url.cn/5oWSdgZ

其他更多BAT面试题可以链接: https://pan.baidu.com/s/1zTjFig0R4MdtBJdZIdfJug 密码: rbta 下载

Read More >>>

历时3个月终克2.1大礼包

年底的时候审核突然卡的非常严,手上的3个项目都被拒了,其中两个经历了小挣扎就顺利上线了,但是其中有一个却足足卡了3个月,期间也是尝试了无数方法,跟审核团队做了无数斗争,在这里我分享下期间的解决方案,希望可以帮到有同样问题的你。

1.先给你们感受下我的绝望

从1月24号开始到4月25号一直都是元数据被拒绝理由都是大礼包2.1,期间每次提交审核被拒都会回复差不多3次以上的邮件,因为回复邮件基本是一天一回,但是审核周期基本上都是 20天左右,这期间充分利用了邮件,不停追问,但是得的回复大都是同样的就是大礼包

  • 2. 1 Performance: App Completeness Guideline 2.1 - Information Needed This type of app has been identified as one that may violate one or more of the following App Store Review Guidelines. Specifically, these types of apps often: 1.1.6 - Include false information, features, or misleading metadata. 2.3.0 - Undergo significant concept changes after approval 2.3.1 - Have hidden or undocumented features, including hidden "switches" that redirect to a gambling or lottery website 3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app 4.3.0 - Are a duplicate of another app or are conspicuously similar to another app 5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app 5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used

2.出现这个情况的原因

基本上能收到大礼包的大都是有问题或者有过问题的,我们的问题很简单就是因为之前一直用的第三方支付,没有走内购,上一次因为第三方支付被发现之后被拒,删除了第三方支付然后换成内购就开始了噩梦,其他的有些马甲包被卡,或多或少都有点问题才会被卡很久,如果你真的没有问题哪就按照上我上一遍所说的回复邮件就可以过.如果你确信的应用没有问题必须要回复一封类似这样的邮件,向审核团队保证你的应用是没有问题的,回复如下:

尊敬的苹果审核团队:
    感谢您对我们的App 的耐心审核, 对于您提到的我们可能违反的7个审核条款, 我们经过认真自查和研究, 对此回复如下:
    1.1.6 :我们的App没有包含任何虚假信息,功能或者误导性元数据信息。
    2.3.0 :我们的App 从来没有做过主要功能的重要改变,包括审核之后。
    2.3.1:我们的App没有包含任何赌博等违法信息,也没有做任何隐藏开关。
    3.1.1: 我们的App没有使用任何除了 in-app purchase 之外的第三方支付。
    4.3.0:我们的App是由我们公司独立发开,主要提供一个在线学习平台,不存在抄袭和大量相似。
    5.2.1:我们的App是有我们自己提交的,没有法人实体和版权的风险。
    5.3.4: 我们的App 并没有使用到定位功能,所以并没有请求定位权限。
    上述这些我们都是经过反复检查和测试的,并没有违反哪条准则,能不能具体告知被拒原因,以便我们处理?也可以电话联系我 你的名字:你的电话,谢谢

    Dear Apple review team:
    Thank you for your patience review of our App. We have carefully checked and studied the seven review clauses that we may have violated, and we reply as follows:
    1.1.6: Our app does not contain any false information, features or misleading metadata information.
    2.3.0: Our app has never made major changes to major features, including after the review.
    2.3.1: Our app does not contain any illegal information such as gambling or any hidden switch.
    3.1.1: Our App does not use any third party payment except in-app purchase.
    4.3.0: Our App is developed independently by our company and mainly provides an online learning platform. There is no plagiarism and a lot of similarities.
    5.2.1: Our App is submitted by ourselves without the risk of legal entity and copyright.
    5.3.4: Our app does not use the location function, so it does not request location permission.
    We have repeatedly inspected and tested the above-mentioned issues. We have not violated any criteria. Can you tell me the reasons for rejection specifically so that we can handle them? You can also contact me by phone 你的名字: 你的电话, thank you

3.期间遇到的问题和处理方法

当然正常情况下既然给你发了大礼包总会找点理由给你,要是想卡可能大多app都难以上线的。 上面的回复仅限你确定你没有问题或者你不知道你问题在哪才能回复,如果你知道问题或者审核团队已经给你指出问题所在哪就好好处理吧,下面我有罗列出尊敬的审核团队给我指出的问题和我的解决方案

*   Thank you for your response.
    Regarding the 5.1.1 issue, your app requires users to register for the sole purpose of tracking IAP, which does not comply with the App Store Review Guidelines.        
 It would be appropriate to make it clear to the user that registering will enable them to access the content from any of their iOS devices and provide them a way to register at any time.
 If you would like to enable users to access content on different devices, such registration must be made optional, as such a feature does not offer user benefit to users who only possess one device, or chooses not to share their purchased content with other devices.
It would be appropriate to revise your app so that the user is not required to register or log-in to access the  study material, including those that are paid through In-App Purchase.
Additionally, an Apple Representative will call you to discuss your app.
  Best regards,
App Store Review

这个是我之前发送的确认邮件说我们的app没有任何问题,之后收到这封邮件。意思大概是说要我们添加游客也能购买课程的功能

* 感谢您的答复。
关于5.1.1问题,您的应用程序要求用户注册唯一目的是跟踪IAP,这不符合App Store评论指南。
向用户明确说明注册将使他们能够从任何iOS设备访问内容,并为他们提供随时注册的方式。
如果您希望允许用户访问不同设备上的内容,则必须将此类注册设置为可选项,因为此类功能不会为仅拥 
有一台设备的用户提供用户权益,或者选择不与其他设备共享其购买的内容。
 修改您的应用程序以便用户无需注册或登录即可访问学习材料,包括通过应用程序内购买付费的材料。
另外,Apple代表会打电话给你,讨论你的应用。

游客也能购买之前其他app也因为这个问题被拒过,当时就是回复了邮件说明了,我们的课程什么的不是针对所有人的,是针对企业内部员工的,是跟账号挂钩的。之前另一个app这样回复就顺利过审核了,我就抱着试一试也回复了差不多的邮件,当然结果就是没有有过..... 然后我们就妥协了添加了游客购买模式,下面是大概思路

当用户点击购买的时候如果没有登录先提示 如果游客点击游客购买就自动帮用户生成一个账号(根据用户的设备的唯一标识生成),设备的唯一标识我使用的是UDID,把UDID写进钥匙串防止其发生改变

   str  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];  // 保存UUID作为手机唯一标识符
     [SFHFKeychainUtils storeUsername:@"UUID"
                           andPassword:str
                          forServiceName:SERVICE_NAME  //最好用程序的bundle id
                          updateExisting:1
                                   error:nil];  // 往keychain添加数据

添加游客购买之后提交新的app 之后又等了近一月然后又收到了大礼包,然而我很疑惑,又是大礼包也不说是什么问题让我怎么处理呢,然后就很有礼貌的有回复了一封邮件给审核团队

 * 尊敬的苹果审核团队:
 *  感谢您对我们的App 的耐心审核, 对于您提到的我们可能违反的7个审核条款, 我们经过认真自查和研究, 对此回复如下:
  * 1.1.6 :我们的App没有包含任何虚假信息,功能或者误导性元数据信息。
  *         2.3.0 :我们的App 从来没有做过主要功能的重要改变,包括审核之后。
  *         2.3.1:我们的App没有包含任何赌博等违法信息,也没有做任何隐藏开关。
  *         3.1.1: 我们的App没有使用任何除了 in-app purchase 之外的第三方支付。
  *         4.3.0:我们的App是由我们公司独立发开,主要提供一个在线学习平台,不存在抄袭和大量相似。
  *         5.2.1:我们的App是有我们自己提交的,没有法人实体和版权的风险。
  *         5.3.4: 我们的App 并没有使用到定位功能,所以并没有请求定位权限。
  *         上述这些我们都是经过反复检查和测试的,并没有违反哪条准则,能不能具体告知被拒原因,以便我们处理?也可以电话联系我 名字:电话,谢谢

*       Dear Apple review team:
*       Thank you for your patience review of our App. We have carefully checked and studied the seven review clauses that we may have violated, and we reply as follows:
*       1.1.6: Our app does not contain any false information, features or misleading metadata information.
*       2.3.0: Our app has never made major changes to major features, including after the review.
*       2.3.1: Our app does not contain any illegal information such as gambling or any hidden switch.
*       3.1.1: Our App does not use any third party payment except in-app purchase.
*       4.3.0: Our App is developed independently by our company and mainly provides an online learning platform. There is no plagiarism and a lot of similarities.
*       5.2.1: Our App is submitted by ourselves without the risk of legal entity and copyright.
*       5.3.4: Our app does not use the location function, so it does not request location permission.
*       We have repeatedly inspected and tested the above-mentioned issues. We have not violated any criteria. Can you tell me the reasons for rejection specifically so that we can handle them? You can also contact me by phone Chen: 1552XXXX, thank you

然后他们的回复如下

    *       2. 1 Performance: App Completeness
*       Hello,
*       
*       Thank you for providing additional information.
*       
*       Upon further review, we found that your app does not comply with the following guidelines:
*       
*       Guideline 2.1 - Performance - App Completeness
*       
*       We are unable to complete the review of your app because one or more of your in-app purchase products have not been submitted for review.
*       
*       Next Steps
*       
*       To resolve this issue, please be sure to take action and submit your in-app purchases and upload a new binary in iTunes Connect. Learn more about how to offer in-app purchasesin iTunes Connect Developer Help.
*       
*       Once you've submitted your in-app purchases and uploaded a new binary, we can proceed with your review.
*       Best regards,
*       
*       App Store Review

意思是 无法完成对应用的审核,因为您的一个或多个应用内购买产品尚未提交审核。

说我们的内购产品未提交审核,当初不直接告诉我还的让我问一下才说(真是闲的), 然后我就看了下我的内购产品果然是没有过审,全都是红点 。 内购商品审核被拒绝,红点在描述出,然后我就根据人家的经验修改我的商品描述,从之前的12元购买12个学币,变成您愿意花费12元购买12个学币吗?然后提交审核,等了一个月商品还是没过审..... 还是描述问题然后我又改成12元即可购买12个学币 还是被拒.....,同样的描述其他的app能过我这个就不行..... 最后没有办法还是只能回邮件....

    * 尊敬的审核团队,感谢您对我们App的耐心审核,我想知道为什么我们的内购项目一直被拒,内购项目要怎么描述?请问我们要怎么修改才可以?如果可以请告诉我们怎么修改,万分感谢!

    * Dear review team, thank you for your patience review of our App. I would like to know why our in-app purchases are always rejected. How do we describe our in-app purchases? How can we modify it? If you can please tell us how to modify, extremely grateful!

然而过了,还是之前的描述,回复邮件之后就过审核了(心里有一万只草泥马在狂奔)随之app也过审核了,终于结束了长达3月的拉锯战.

总结:如果你收到大礼包要做好准备,一般情况下都要经历长时间斗争,每期审核周期都会变长,如果审核团队有指出问题不要挣扎改就行了,如果你不知道问题所在就回复邮件说确定自己的app没有问题,如果还是大礼包就一直回复确认邮件并询问自己到底哪里违规(模板上面有)。

最后祝你也能早日过审!


如果有任何疑问可以留言咨询。也可以加我的公众号会定时推送有关技术分享!

Read More >>>