热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Xcode8ios10调用相机、相册、麦克风、位置等隐私问题崩溃解决办法

原文地址:http:www.cnblogs.comHJQ2016p5866582.html随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方

原文地址: http://www.cnblogs.com/HJQ2016/p/5866582.html


随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出.

1.系统判断方法失效:

在你的项目中,当需要判断系统版本的话,不要使用下面的方法:

  1. #define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1]intValue]>=10)

它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了,
应该使用下面的这些方法:
Objective-C 中这样写:

  1. #define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion]compare:v
    options:NSNumericSearch] == NSOrderedSame)
  2. #define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion]compare:v
    options:NSNumericSearch] == NSOrderedDescending)
  3. #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice]systemVersion] compare:v
    options:NSNumericSearch] != NSOrderedAscending)
  4. #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion]compare:v
    options:NSNumericSearch] == NSOrderedAscending)
  5. #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice]systemVersion] compare:v
    options:NSNumericSearch] != NSOrderedDescending)

或者使用:

  1. if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 9, .minorVersion = 1, .patchVersion =0}]) {
  2. //
    代码块
  3. }
  4. if ([NSProcessInfo.processInfo
    isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9,3,0}]) {
  5. //
    代码块
  6. }

或者使用:

  1. if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_0) {
  2. //
    代码块
  3. } else {
  4. //
    代码块
  5. }

有时候会缺少一些常量,NSFoundationVersionNumber是在NSObjCRuntime.h中定义的,作为Xcode7.3.1的一部分,我们设定常熟范围从iPhone OS 2到#define
NSFoundationVersionNumber_iOS_8_4 1144.17
,在iOS 10(Xcode 8)中,苹果补充了缺少的数字,设置有未来的版本.

  1. #define NSFoundationVersionNumber_iOS_9_0 1240.1
  2. #define NSFoundationVersionNumber_iOS_9_1 1241.14
  3. #define NSFoundationVersionNumber_iOS_9_2 1242.12
  4. #define NSFoundationVersionNumber_iOS_9_3 1242.12
  5. #define NSFoundationVersionNumber_iOS_9_4 1280.25
  6. #define NSFoundationVersionNumber_iOS_9_x_Max 1299

Swift中这样写:

  1. ifNSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) {
  2. //
    代码块
  3. }

或者使用

  1. if #available(iOS
    10.0, *) {
  2. //
    代码块
  3. } else {
  4. //
    代码块
  5. }

2.隐私数据访问问题:

你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志:

这是因为iOS对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述,但是,在使用Xcode 8之前的Xcode还是使用系统的权限通知框.
要想解决这个问题,只需要在info.plist添加NSContactsUsageDescription的key, value自己随意填写就可以,这里列举出对应的key(Source Code模式下):

  1. NSPhotoLibraryUsageDescription
  2. App需要您的同意,才能访问相册
  3. NSCameraUsageDescription
  4. App需要您的同意,才能访问相机
  5. NSMicrophoneUsageDescription
  6. App需要您的同意,才能访问麦克风
  7. NSLocationUsageDescription
  8. App需要您的同意,才能访问位置
  9. NSLocationWhenInUseUsageDescription
  10. App需要您的同意,才能在使用期间访问位置
  11. NSLocationAlwaysUsageDescription
  12. App需要您的同意,才能始终访问位置
  13. NSCalendarsUsageDescription
  14. App需要您的同意,才能访问日历
  15. NSRemindersUsageDescription
  16. App需要您的同意,才能访问提醒事项
  17. NSMotionUsageDescription App需要您的同意,才能访问运动与健身
  18. NSHealthUpdateUsageDescription
  19. App需要您的同意,才能访问健康更新 
  20. NSHealthShareUsageDescription
  21. App需要您的同意,才能访问健康分享
  22. NSBluetoothPeripheralUsageDescription
  23. App需要您的同意,才能访问蓝牙
  24. NSAppleMusicUsageDescription
  25. App需要您的同意,才能访问媒体资料库

如果不起作用,可以请求后台权限,类似于这样:

  1. UIBackgroundModes
  2. location
  3. ...

或者在Xcode里选中当前的target,选择Capabilities,找到Background Modes,打开它,在里面选择对应权限

3.UIColor的问题

官方文档中说:大多数core开头的图形框架和AVFoundation都提高了对扩展像素和宽色域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色的建议转换为使用sRGB,在UIColor类中新增了两个api:

  1. - (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red
    green:(CGFloat)green
    blue:(CGFloat)blue
    alpha:(CGFloat)alpha
    NS_AVAILABLE_IOS(10_0);
  2. + (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red
    green:(CGFloat)green
    blue:(CGFloat)blue
    alpha:(CGFloat)alpha
    NS_AVAILABLE_IOS(10_0);

4.真彩色的显示

真彩色的显示会根据光感应器来自动的调节达到特定环境下显示与性能的平衡效果,如果需要这个功能的话,可以在info.plist里配置(在Source Code模式下):

  1. UIWhitePointAdaptivityStyle

它有五种取值,分别是:

  1. UIWhitePointAdaptivityStyleStandard //
    标准模式
  2. UIWhitePointAdaptivityStyleReading //
    阅读模式
  3. UIWhitePointAdaptivityStylePhoto //
    图片模式
  4. UIWhitePointAdaptivityStyleVideo //
    视频模式
  5. UIWhitePointAdaptivityStyleStandard //
    游戏模式

也就是说如果你的项目是阅读类的,就选择UIWhitePointAdaptivityStyleReading这个模式,五种模式的显示效果是从上往下递减,也就是说如果你的项目是图片处理类的,你选择的是阅读模式,给选择太好的效果会影响性能.

5.ATS的问题

1.在iOS 9的时候,默认非HTTS的网络是被禁止的,我们可以在info.plist文件中添加NSAppTransportSecurity字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS;
2.从2017年1月1日起,,所有新提交的 app 默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,默认情况下你的 app 可以访问加密足够强的(TLS V1.2以上)HTTPS内容;
3.可以选择使用NSExceptionDomains设置白名单的方式对特定的域名开放HTTP内容来通过审核,比如说你的应用集成了第三方的登录分享SDK,可以通过这种方式来做,下面以新浪SDK作为示范(Source Code 模式下):

  1. NSAppTransportSecurity
  2. NSExceptionDomains
  3. sina.cn
  4. NSThirdPartyExceptionMinimumTLSVersion
  5. TLSv1.0
  6. NSThirdPartyExceptionRequiresForwardSecrecy
  7. NSIncludesSubdomains
  8. weibo.cn
  9. NSThirdPartyExceptionMinimumTLSVersion
  10. TLSv1.0
  11. NSThirdPartyExceptionRequiresForwardSecrecy
  12. NSIncludesSubdomains
  13. weibo.
    com
  14. NSThirdPartyExceptionMinimumTLSVersion
  15. TLSv1.0
  16. NSThirdPartyExceptionRequiresForwardSecrecy
  17. NSIncludesSubdomains
  18. sinaimg.cn
  19. NSThirdPartyExceptionMinimumTLSVersion
  20. TLSv1.0
  21. NSThirdPartyExceptionRequiresForwardSecrecy
  22. NSIncludesSubdomains
  23. sinajs.cn
  24. NSThirdPartyExceptionMinimumTLSVersion
  25. TLSv1.0
  26. NSThirdPartyExceptionRequiresForwardSecrecy
  27. NSIncludesSubdomains
  28. sina.com.cn
  29. NSThirdPartyExceptionMinimumTLSVersion
  30. TLSv1.0
  31. NSThirdPartyExceptionRequiresForwardSecrecy
  32. NSIncludesSubdomains

4.在iOS 10 中info.plist文件新加入了NSAllowsArbitraryLoadsInWebContent键,允许任意web页面加载,同时苹果会用 ATS 来保护你的app;
5.安全传输不再支持SSLv3, 建议尽快停用SHA13DES算法;

6.UIStatusBar的问题:

在iOS10中,如果还使用以前设置UIStatusBar类型或者控制隐藏还是显示的方法,会报警告,方法过期,如下图:

上面方法到 iOS 10 不能使用了,要想修改UIStatusBar的样式或者状态使用下图中所示的属性或方法:

  1. @property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle
    NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; //
    Defaults to UIStatusBarStyleDefault
  2. @property(nonatomic, readonly) BOOL
    prefersStatusBarHidden NS_AVAILABLE_IOS(7_0)__TVOS_PROHIBITED; //
    Defaults to NO
  3. - (UIStatusBarStyle)preferredStatusBarStyle
    NS_AVAILABLE_IOS(7_0)__TVOS_PROHIBITED; //
    Defaults to UIStatusBarStyleDefault
  4. - (BOOL)prefersStatusBarHidden
    NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; //
    Defaults to NO
  5. //
    Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
  6. - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
    NS_AVAILABLE_IOS(7_0)__TVOS_PROHIBITED; //
    Defaults to UIStatusBarAnimationFade

7.UITextField

在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义.是电话类型就建议一些电话,是地址类型就建议一些地址.可以在#import 文件中,查看textContentType字段,有以下可以选择的类型:

  1. UIKIT_EXTERN UITextContentType const UITextContentTypeNameNS_AVAILABLE_IOS(10_0);
  2. UIKIT_EXTERN UITextContentType const UITextContentTypeNamePrefixNS_AVAILABLE_IOS(10_0);
  3. UIKIT_EXTERN UITextContentType const UITextContentTypeGivenNameNS_AVAILABLE_IOS(10_0);
  4. UIKIT_EXTERN UITextContentType const UITextContentTypeMiddleNameNS_AVAILABLE_IOS(10_0);
  5. UIKIT_EXTERN UITextContentType const UITextContentTypeFamilyNameNS_AVAILABLE_IOS(10_0);
  6. UIKIT_EXTERN UITextContentType const UITextContentTypeNameSuffixNS_AVAILABLE_IOS(10_0);
  7. UIKIT_EXTERN UITextContentType const UITextContentTypeNicknameNS_AVAILABLE_IOS(10_0);
  8. UIKIT_EXTERN UITextContentType const UITextContentTypeJobTitleNS_AVAILABLE_IOS(10_0);
  9. UIKIT_EXTERN UITextContentType const UITextContentTypeOrganizationNameNS_AVAILABLE_IOS(10_0);
  10. UIKIT_EXTERN UITextContentType const UITextContentTypeLocationNS_AVAILABLE_IOS(10_0);
  11. UIKIT_EXTERN UITextContentType const UITextContentTypeFullStreetAddressNS_AVAILABLE_IOS(10_0);
  12. UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine1NS_AVAILABLE_IOS(10_0);
  13. UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine2NS_AVAILABLE_IOS(10_0);
  14. UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCityNS_AVAILABLE_IOS(10_0);
  15. UIKIT_EXTERN UITextContentType const UITextContentTypeAddressStateNS_AVAILABLE_IOS(10_0);
  16. UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCityAndStateNS_AVAILABLE_IOS(10_0);
  17. UIKIT_EXTERN UITextContentType const UITextContentTypeSublocalityNS_AVAILABLE_IOS(10_0);
  18. UIKIT_EXTERN UITextContentType const UITextContentTypeCountryNameNS_AVAILABLE_IOS(10_0);
  19. UIKIT_EXTERN UITextContentType const UITextContentTypePostalCodeNS_AVAILABLE_IOS(10_0);
  20. UIKIT_EXTERN UITextContentType const UITextContentTypeTelephoneNumberNS_AVAILABLE_IOS(10_0);
  21. UIKIT_EXTERN UITextContentType const UITextContentTypeEmailAddressNS_AVAILABLE_IOS(10_0);
  22. UIKIT_EXTERN UITextContentType const UITextContentTypeURL NS_AVAILABLE_IOS(10_0);
  23. UIKIT_EXTERN UITextContentType const UITextContentTypeCreditCardNumberNS_AVAILABLE_IOS(10_0);

8.UserNotifications(用户通知)

iOS 10 中将通知相关的 API 都统一了,在此基础上很多用户定义的通知,并且可以捕捉到各个通知状态的回调.以前通知的概念是:大家想接受的提前做好准备,然后一下全两分发,没收到也不管了,也不关心发送者,现在的用户通知做成了类似于网络请求,先发一个request得到response的流程,还封装了error,可以在各个状态的方法中做一些额外的操作,并且能获得一些字段,比如发送者之类的.这个功能的头文件是:#import
主要有以下文件:

  1. #import
  2. #import
  3. #import
  4. #import
  5. #import
  6. #import
  7. #import
  8. #import
  9. #import
  10. #import
  11. #import
  12. #import
  13. #import
  14. #import

9.UICollectionViewCell的的优化

在iOS 10 之前,UICollectionView上面如果有大量cell,当用户活动很快的时候,整个UICollectionView的卡顿会很明显,为什么会造成这样的问题,这里涉及到了iOS 系统的重用机制,当cell准备加载进屏幕的时候,整个cell都已经加载完成,等待在屏幕外面了,也就是整整一行cell都已经加载完毕,这就是造成卡顿的主要原因,专业术语叫做:掉帧.
要想让用户感觉不到卡顿,我们的app必须帧率达到60帧/秒,也就是说每帧16毫秒要刷新一次.

iOS 10 之前UICollectionViewCell的生命周期是这样的:
  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这个方法里面,可以重置cell的状态,加载新的数据;
  • 2.继续滑动,就会调用cellForItemAtIndexPath方法,在这个方法里面给cell赋值模型,然后返回给系统;
  • 3.当cell马上进去屏幕的时候,就会调用willDisplayCell方法,在这个方法里面我们还可以修改cell,为进入屏幕做最后的准备工作;
  • 4.执行完willDisplayCell方法后,cell就进去屏幕了.当cell完全离开屏幕以后,会调用didEndDisplayingCell方法.
iOS 10 UICollectionViewCell的生命周期是这样的:
  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在这里当cell还没有进去屏幕的时候,就已经提前调用这个方法了,对比之前的区别是之前是cell的上边缘马上进去屏幕的时候就会调用该方法,而iOS 10 提前到cell还在屏幕外面的时候就调用;
  • 2.在cellForItemAtIndexPath中创建cell,填充数据,刷新状态等操作,相比于之前也提前了;
  • 3.用户继续滑动的话,当cell马上就需要显示的时候我们再调用willDisplayCell方法,原则就是:何时需要显示,何时再去调用willDisplayCell方法;
  • 4.当cell完全离开屏幕以后,会调用didEndDisplayingCell方法,跟之前一样,cell会进入重用队列.
    在iOS 10 之前,cell只能从重用队列里面取出,再走一遍生命周期,并调用cellForItemAtIndexPath创建或者生成一个cell.
    在iOS 10 中,系统会cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用willDisplayCell方法就可以重新出现在屏幕中了.
    iOS 10 中,系统是一个一个加载cell的,二以前是一行一行加载的,这样就可以提升很多性能;
    iOS 10 新增加的Pre-Fetching预加载
    这个是为了降低UICollectionViewCell在加载的时候所花费的时间,在 iOS 10 中,除了数据源协议和代理协议外,新增加了一个UICollectionViewDataSourcePrefetching协议,这个协议里面定义了两个方法:
  1. - (void)collectionView:(UICollectionView *)collectionView
    prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths
    NS_AVAILABLE_IOS(10_0);
  2. - (void)collectionView:(UICollectionView *)collectionView
    cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths
    NS_AVAILABLE_IOS(10_0);

ColletionView
prefetchItemsAt indexPaths
这个方法是异步预加载数据的,当中的indexPaths数组是有序的,就是item接收数据的顺序;
CollectionView
cancelPrefetcingForItemsAt indexPaths
这个方法是可选的,可以用来处理在滑动中取消或者降低提前加载数据的优先级.
注意:这个协议并不能代替之前读取数据的方法,仅仅是辅助加载数据.
Pre-Fetching预加载对UITableViewCell同样适用.

10. UIRefreshControl的使用

在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脱离了UITableViewController.现在RefreshControl是UIScrollView的一个属性.
使用方法:

  1. UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
  2. [refreshControl
    addTarget:self action:@selector(loadData)forControlEvents:UIControlEventValueChanged];
  3. collectionView.refreshControl = refreshControl;

 

注意:去除警告信息

 

#pragma mark - UITableViewDataSources
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
int unusedInt;
#pragma clang diagnostic pop

  NSString *str;
#pragma unused(str)

// 添加警告的两种方式
#pragma message "This is a warning"#warning "This is another warning"
    return 10;
}
  
// ignored(忽视)消除对应的selector的警告
//开始
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// 要消除警告的代码
id target = self.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer
*pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
// 结束
#pragma clang diagnostic pop


// 消除方法弃用(过时)的警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// 要消除警告的代码
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
#pragma clang diagnostic pop


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
  • php和jq开发怎么使用es6,PHP与jquery
    本文目录一览:1、phpstorm怎么使用es6语法 ... [详细]
  • 多态性这个词表示有许多形式。通常,当存在类的层次结构并且通过继承相关时,会发生多态性。Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对 ... [详细]
  • iOS逆向工程(三):利用Cycript调试App
    利用Cycript调试App一、Cycript是什么?Cycript是一种脚本语言,是Ob ... [详细]
author-avatar
1911530988com
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有