2017-12-06 - 重拾 iOS 相关代码

WMPageController

728237-cb71fe08fe1c0ad9

CocoaPods

iOS 11:截图

  • 当调取相册的时候APP崩溃并显示标题的错误:

    • This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
  • 解决方法:

    • 在info.plst文件里添加这句
    • Privacy - Photo Library Additions Usage Description

由于官方的解释较少,又在网上查找了下其他信息:

  • iOS11以前:
    • NSPhotoLibraryUsageDescription:访问相册和存储照片到相册(读写),会出现用户授权。
  • iOS11之后:
    • NSPhotoLibraryUsageDescription:无需添加。默认开启访问相册权限(读),无需用户授权。
    • NSPhotoLibraryAddUsageDescription: 添加内容到相册(写),会出现用户授权。

工作内容:星期五上交

写一个H5和OC交互的截图功能:如下图

{184E81EB-FAD9-67E0-D880-A673780CCD8A}

UIAlertView 问题:

  • 在iOS 9.0 SDK 环境下编译上述代码时,会有下列的警告提示:

  • “‘UIAlertView’ is deprecated:first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead”

  • 意思是UIAlertView首先在iOS9中被弃用(不推荐)使用。让我们去用UIAlertController。但是运行程序,发现代码还是可以成功运行,不会出现crash。

  • 方法改为如下:

[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    //点击按钮的响应事件;
}]];
    
//弹出提示框;
[self presentViewController:alert animated:true completion:nil];

AssetsLibrary 问题:

  • AssetsLibrary/AssetsLibrary.h

  • 'ALAssetsLibrary' is deprecated: first deprecated in iOS 9.0 - Use PHPhotoLibrary from the Photos framework instead

2017/12/6 posted in  工作总结

2017-12-05 - Git 上传代码


layout: post
title: "Git 上传代码"
date: 2017.12.05
tag: iOS 总结


Git 快捷上传代码

#  之前一直用的是SourceTree、SVN 不过都是公司服务器本地上传
   
   想过最早用的就是GitHub 就想过国区里有没有,结果就找到了“马云”大大
   
   经过了解后码云给我的感觉就是方便快捷的保存项目以及合作开发
   
   所以今天就写了一篇关于 Git 的文章,以供学习

本地项目上传至码云

  1. 在码云上点击 “新建项目”
  2. 创建成功后,打开终端 cd 到 文件里
  3. git init 初始化仓库
  4. git remote add origin “URL”(码云上新建项目点进去克隆或者复制的链接)
  5. git pull origin master(把分支上的文件拉下来)
  6. 把要上传的项目移动到刚刚从云端抓取下来的文件夹内
  7. git add . 或者 git add + 被拖入的项目名(保存到缓存区)
  8. git commit -m "要编辑的内容"(推送到本地库种)
  9. git push origin master (推送到远程仓库也就是码云)

支付宝

Webkit (WKUIDelegate)

  • UIWebView 是iOS 2 就有的 UIKit 中非常古老的加载网页控件
  • WKWebView 是 iOS 8 之后才有的 WebKit 中的内容。
  • 苹果推出 WKWebView 就是为了替换旧的 UIWebView

1. UIWebView 的优缺点

  • UIWebView 会引起内存泄露,这是它系统本身的问题。
  • 用 UIWebView 加载大数据资源时,内存峰值、内存都会暴增,同时CPU电量消耗也较高。
  • UIWebView 支持缓存 和 NSURLProtocol 拦截。

2. WKWebView 的优缺点

  • 拥有高达 60FPS 滚动刷新率及内置手势。
  • 支持了更多的 HTML5 特性。
  • 高效的 app 和 web 信息交换通道。
  • 允许 JavaScript 的 Nitro 库加载并使用, UIWebView 中限制了。
  • 提供加载网页进度的属性。
  • WKWebView 网页加载速度有提升,更快(占用内存可能只有 UIWebView 的1/3~1/4)。
  • 没有缓存,更为细致地拆分了 UIWebViewDelegate 中的方法。//我建议如果对缓存不高的页面可以使用,用户体验会提高很多。
  • WKWebView 不支持缓存 和 NSURLProtocol 拦截.

3. UIWebView 的三种 load 方法

loadRequest
  • 加载网络资源
UIWebView *web = [[UIWebView alloc] initWithFrame:self.view.bounds];
[self.view addsubView: web];
[web loadRequest:[NSURLRequestrequestWithURL:[NSURL RULWithString:@"https//:www.qiangwan.com"]]];
// http请求需要在info文件里配置一下,APP Transport Security -> Allow Arbitrary Loads = YES
  • 除了加载网络资源外,loadRequest 还可以加载本地资源
// str2 == str3 != str1 str1多了file:
NSString *str1 = [[[NSBundle mainBundle] bundleURL] absoluteString];
NSString *str2 = [[NSBundle mainBundle] bundlePath] ;

NSString *str3 = [[NSBundle mainBundle] resourcePath] ;

NSString *path = [str3 stringByAppendingPathComponent:@"test.html"];

[web loadRequest:[NSURLRequestrequestWithURL:[NSURLfileURLWithPath:path]]];
loadHTMLString
  • 这个方法用于直接加载 html 代码
    • 如果 html 没有存在文件夹中,推荐使用这种方法
UIWebView *web = [[UIWebView alloc] initWithFrame:self.view.bounds];   

[self.view addSubview:web];    

NSString *HTMLData = @"<hn>Hello World</hn>";

[web loadHTMLString:HTMLData baseURL:nil];
  • 当然你也可以用这个方法从本地 html 读取代码,然后加载。但此时请注意 baseURL 要传对,否则 html 中引用的资源是找不到的。
NSString *str3 = [[NSBundle mainBundle] resourcePath] ;

NSString *path = [str3 stringByAppendingPathComponent:@"test.html"];

NSString *htmlStr = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

[web loadHTMLString:htmlstrbaseURL:[[NSBundlemainBundle] bundleURL]];

loadRequest 和 loadHTMLString 都可以加载本地资源,苹果给出了解释:To help you avoid being vulnerable to security attacks, be sure to use this method to load local HTML files; don’t use loadRequest:。

意思是,为避免受到安全攻击,一定要用这种方法来加载本地HTML文件;不要使用 loadRequest。如果不从 html 文件载入你也可以这样:

NSString *HTMLData = @"src=\"test2.png\"/>ddd";

[self.webView loadHTMLString:HTMLData baseURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]]];

baseURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]]

这段指出 HTMLData 所引用的其他文件资源的基本路径,如果 baseURL:nil 图片信息将不会显示出来

loadData
  • 使用loadData方法对文件进行加载,是以二进制方式加载数据,并且指定类型(mimetype)和编码类型(textEncodingName)

  • 加载本地 PDF

NSString *dataPath = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"pdf"];

[_webView loadData:[NSData dataWithContentsOfFile:dataPath] MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:nil];
  • 加载本地文本文件
NSString *dataPath = [[NSBundle mainBundle]pathForResource:@"谁胡传" ofType:@"txt"];

[_webView loadData:[NSData dataWithContentsOfFile:dataPath] MIMEType:@"text/plain" textEncodingName:@"UTF-8" baseURL:nil];

4. WKWebView 继承了 UIWebView 中的这三种 load 方法,又增加了 loadFileURL 方法。(iOS9.0 之后)

  • loadRequest 在 WKWebView 中只能加载网络资源了,想要适配9.0之前的系统也可以通过一些间接的方式加载本地资源(不推荐)。可以用 loadHTMLString 或 loadData 来加载本地资源。

  • loadHTMLString 和 loadData 几乎没有变化,加载时默认适配的终端不同。UIWebView 默认是手机端 WKWebView 默认是 pc 端。

  • loadFileURL

    • 在 iOS9 的 SDK 中加入了该便利方法来加载本地的HTML文件。
2017/12/5 posted in  工作总结

2017-12-04 - Pods里没用过的的第三方

  • EDStarRating (星级评价)

  • JPush (极光推送)

  • UMengAnalytics (友盟)

  • IDFA

认识一下iOS系统的各种设备识别码:

1、UDID ,全称是 (Unique Device Identifier),顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成,为了保护用户隐私苹果已经禁止读取这个标识了。

2、UUID,全称是(Universally Unique IDentifier),是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个 UUID 在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个 UUID 已经发生了改变。UUID 不好的地方就是用户删除了你开发的程序以后,基本上你就不可能获取之前的数据了。

3、MAC 地址,用来定义网络设备的位置。一个主机会有一个 MAC 地址,MAC 地址是网卡决定的,是固定的,为了保护用户隐私苹果已经禁止读取这个标识了。

4、OpenUDID,不是苹果官方的,是一个替代 UDID 的第三发解决方案, 缺点是如果你完全删除全部带有 OpenUDID SDK 包的 App(比如恢复系统等),那么 OpenUDID 会重新生成,而且和之前的值会不同,相当于新设备;

5、IDFA 广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等。

6、IDFV,Vindor 标示符 (IDFV-identifierForVendor),来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。

自己所了解所知道的

    1. 在工程目录种打开 Push Notification
    1. 工程目录种 Info 里可以添加相关推送

自己不了解不知道的

  • automaticallyAdjustsScrollViewInsets ,当设置为YES时(默认YES),如果视图里面存在唯一一个 UIScrollView 或其子类View,那么它会自动设置相应的内边距,这样可以让 scroll 占据整个视图,又不会让导航栏遮盖。

    • 当 controller 上的第一个子视图不是scrollview 以及其子类的时候,就会取消内边距。此时原本全屏的 scrollview 设置的frame(0,0,self.view.frame.size.width,xx)就会从状态栏开始算起,如果应用有导航栏的话,那么就会遮盖住视图的64个高度

    • 解决方案:

      • self.automaticallyAdjustsScrollViewInsets = NO;
        禁用掉自动设置的内边距,自行控制 controller上index 为0的控件以及 scrollview 控件的位置

      • self.edgesForExtendedLayout = UIExtendedEdgeNone;
        这种方式设置,不需要再重新设置 index 为0的控件的位置以及scrollview的位置,(0,0) 默认的依然是从导航栏下面开始算起

userInteractionEnable

  • userInteractionEnabled 中的 User 是指的用户者

  • 当前视图设为 view.userInteractionEnabled=NO 时,当前视图不可交互,该视图上面的子视图也不可与用户交互(不可响应即被该视图忽视),响应事件传递到下面的父视图。

  • 当前视图设为 view.userInteractionEnabled=YES 时,当前视图可交互,该视图上面的子视图可以用户交互(可以响应即被视图接受),下面的父视图不会接收到响应。

  • UIImageView 默认的 userInteractionEnabled 是NO;

  • UILabel 默认 userInteractionEnabled 是 NO;

  • UIView 的 userInteractionEnabled 默认是 YES。

  • 当视图对象的 userInteractionEnabled设置为NO 的时候,用户触发的事件,如触摸事件,键盘弹出事件等,将会被该视图忽略(其他视图照常响应),并且该视图对象也会从事件响应队列中被移除。

  • 当 userInteractionEnabled设为YES 时,则事件可以正常的传递给该视图对象。

  • 注意:响应者链是能够响应事件的对象组成的链,事件在该链上传递,最终结果事件或被处理或被抛弃。所以一个对象在不在响应者链里是其能否响应事件的首要前提条件!

1264820-35a1ebe22072f71a

抢玩APP有以下的BUG:

  • 微信登录出问题(微信没权限,最后选择去掉微信)

  • App Store 上的版本是四个月前更新的

  • 登录的时候键盘一直挡住按钮(用户体验不太好)

  • 界面最上端出现 BUG

  • 礼包里,点击轮播图后条跳转的界面然后领取礼包码后没有做处理,点击三次后程序直接崩溃

iOS 从0到1搭建高可用App框架

UIViewControllerAnimatedTransitioning(自定义转场)

2017/12/4 posted in  工作总结