采纳 Jasmine 进行测试驱动的 JavaScript 开发

3.3 自定义的预感

除了这几个之外系统定义的 toEqual
等等断言之外,也得以采纳自定义的断言,在地方的示范中就应运而生了 toBePlaying
断言。

    //demonstrates use of custom matcher
    expect(player).toBePlaying(song);

那一个自定义的断言定义在 SpecHelper.js 文件中。

图片 1

beforeEach(function () {
  jasmine.addMatchers({
    toBePlaying: function () {
      return {
        compare: function (actual, expected) {
          var player = actual;

          return {
            pass: player.currentlyPlayingSong === expected && player.isPlaying
          };
        }
      };
    }
  });
});

图片 2

个中调用了 jasmine 的 addMatchers 函数实行定义,原来那里不叫断言,称为
matcher ,也正是匹配器。

预感是3个函数,重回几个对象,个中有一个 compare
的函数,这么些函数接收八个参数,第一个是实际值,第一个为期待的值。具体的预感逻辑自身定义,那里相比较歌唱家演唱的对象是否为大家传递的指标,并且歌星的情状为正在表演中。

断言函数需求再次来到二个目的,对象的 pass 属性为三个 boolean
值,表示是不是因此。

7.iOS 10 UIColor 新增方法

以下是合法文书档案的认证:

Most graphics frameworks throughout the system, including Core Graphics,
Core Image, Metal, and AVFoundation, have substantially improved support
for extended-range pixel formats and wide-gamut color spaces. By
extending this behavior throughout the entire graphics stack, it is
easier than ever to support devices with a wide color display. In
addition, UIKit standardizes on working in a new extended sRGB color
space, making it easy to mix sRGB colors with colors in other, wider
color gamuts without a significant performance penalty.

Here are some best practices to adopt as you start working with Wide
Color.

  • In iOS 10, the UIColor class uses the extended sRGB color space and
    its initializers no longer clamp raw component values to between 0.0
    and 1.0. If your app relies on UIKit to clamp component values
    (whether you’re creating a color or asking a color for its component
    values), you need to change your app’s behavior when you link
    against iOS 10.

  • When performing custom drawing in a UIView on an iPad Pro (9.7
    inch), the underlying drawing environment is configured with an
    extended sRGB color space.

  • If your app renders custom image objects, use the new
    UIGraphicsImageRenderer class to control whether the destination
    bitmap is created using an extended-range or standard-range format.

  • If you are performing your own image processing on wide-gamut
    devices using a lower level API, such as Core Graphics or Metal, you
    should use an extended range color space and a pixel format that
    supports 16-bit floating-point component values. When clamping of
    color values is necessary, you should do so explicitly.

  • Core Graphics, Core Image, and Metal Performance Shaders provide new
    options for easily converting colors and images between color
    spaces.

因为事先大家都以用RGB来安装颜色,反正用起来也不是特意各类化,此次新增的艺术应该正是一个弥补吧。所以在iOS
10
苹果官方建议大家选拔sRGB,因为它品质更好,色彩更丰盛。借使你协调为UIColor写了一套分类的话也可尝试替换为sRGBUIColor类中新增了三个Api如下:

+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

 3. 语法

细节提示:在iOS9自此的种类中只要应用到网络图片,也要注意互联网图片是或不是是HTTP的哦,倘诺是,也要把图片的域设置哦!

2. 测试的概念

我们依旧一贯看示例,

八个是 Song.js,那里定义了一个 Song
的类,通过原型定义了三个persistFavoriteStatus
实例方法,注意,那里还尚未落到实处,假如调用则会抛出非凡。脚本如下。

图片 3

function Song() {
}

Song.prototype.persistFavoriteStatus = function(value) {
  // something complicated
  throw new Error("not yet implemented");
};

图片 4

其它1个是 player.js,定义了 Player 类,定义了三个演唱者,通过原型定义了
play, pause, resume 和 makeFavorite 实例方法。对象有二个 isPlaying
的情事,个中 resume 还并未马到成功。

图片 5

function Player() {
}
Player.prototype.play = function(song) {
  this.currentlyPlayingSong = song;
  this.isPlaying = true;
};

Player.prototype.pause = function() {
  this.isPlaying = false;
};

Player.prototype.resume = function() {
  if (this.isPlaying) {
    throw new Error("song is already playing");
  }

  this.isPlaying = true;
};

Player.prototype.makeFavorite = function() {
  this.currentlyPlayingSong.persistFavoriteStatus(true);
};

图片 6

下边看测试的概念,具体测试的验证,直接加在注释中。

图片 7

describe("Player", function() {
  var player;
  var song;

  beforeEach(function() {
    player = new Player();
    song = new Song();
  });

  // 检测正在歌手进行的歌曲确实是指定的歌曲
  it("should be able to play a Song", function() {
    player.play(song);
    expect(player.currentlyPlayingSong).toEqual(song);

    //demonstrates use of custom matcher
    expect(player).toBePlaying(song);
  });

  // 进行测试的分组,这里测试暂停状态
  describe("when song has been paused", function() {
    beforeEach(function() {
      player.play(song);
      player.pause();
    });

    // isPlaying 的状态检测
    it("should indicate that the song is currently paused", function() {
      expect(player.isPlaying).toBeFalsy();

      // demonstrates use of 'not' with a custom matcher
      // 
      expect(player).not.toBePlaying(song);
    });

    // 恢复
    it("should be possible to resume", function() {
      player.resume();
      expect(player.isPlaying).toBeTruthy();
      expect(player.currentlyPlayingSong).toEqual(song);
    });
  });

  // demonstrates use of spies to intercept and test method calls
  // 使用 spyOn 为对象创建一个 mock 函数
  it("tells the current song if the user has made it a favorite", function() {
    spyOn(song, 'persistFavoriteStatus');

    player.play(song);
    player.makeFavorite();

    expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
  });

  //demonstrates use of expected exceptions
  // 异常检测
  describe("#resume", function() {
    it("should throw an exception if song is already playing", function() {
      player.play(song);

      expect(function() {
        player.resume();
      }).toThrowError("song is already playing");
    });
  });
});

图片 8

运用浏览器直接打开 SpenRunner.html 看到的结果

图片 9

能够见见测试都经过了。

如若大家将率先个测试 expect(player.currentlyPlayingSong).toEqual(song);
改成 expect(player.currentlyPlayingSong).toEqual( 1 );

测试通但是,展现会化为那样。

图片 10

贰零壹肆年八月二日,苹果发布iOS 10。二零一四年七月二十四日,全新的操作系统iOS
10将正式上线。

1. 下载

官网地址:http://jasmine.github.io/

官网文书档案地址:http://jasmine.github.io/2.3/introduction.html

下载地址:https://github.com/jasmine/jasmine/releases

在 GitHub
上提供了独立版本 jasmine-standalone-2.3.4.zip 和源码版本,假若利用的话,直接选用standalone 版本即可。

解压之后,能够获得如下所示的文书结构。

图片 11

在那之中,lib 中是 Jasmine 的兑现公文,在 lib/jasmine-2.3.4
文件夹中,能够看出如下的公文。

图片 12

开辟最外层的 SpecRunner.html ,那是2个 Jasmine的沙盘,个中提供了测试的示范,我们得以在行使中平素套用那几个模板。其中的内容为:

图片 13

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Jasmine Spec Runner v2.3.4</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.3.4/jasmine_favicon.png">
  <link rel="stylesheet" href="lib/jasmine-2.3.4/jasmine.css">

  <script src="lib/jasmine-2.3.4/jasmine.js"></script>
  <script src="lib/jasmine-2.3.4/jasmine-html.js"></script>
  <script src="lib/jasmine-2.3.4/boot.js"></script>

  <!-- include source files here... -->
  <script src="src/Player.js"></script>
  <script src="src/Song.js"></script>

  <!-- include spec files here... -->
  <script src="spec/SpecHelper.js"></script>
  <script src="spec/PlayerSpec.js"></script>

</head>

<body>
</body>
</html>

图片 14

能够观察里边引用了 lib/jasmine-2.3.4/jasmine.js, lib/jasmine-2.3.4/jasmine-html.js
和 lib/jasmine-2.3.4/boot.js 多少个系统文件,其中 boot.js
是网页境况下的开发银行文件,在 张丹 的 jasmine行为使得,测试先行 那篇小说中,要写七个report.js 的启航脚本,那里一度毫无了,直接选择 boot.js 就可以。

页面上面引用的  src/Player.js 和 src/Song.js
是我们的测试对象,而 spec/SpecHelper.js 和 spec/PlayerSpec.js
则是五个照应的测试文件,测试用例就定义在 spec 中。

9.iOS 10 字体随开始提式无线电话机系统字体而更改

当大家手提式有线电电话机系统字体改变了后头,那我们Applabel也会随着一块儿变化,那亟需大家写过多代码来尤其处理才能兑现,但是iOS
10
提供了这般的个性adjustsFontForContentSizeCategory来设置。因为从没真机,具体实际操作还没去达成,如若知道错误扶助指正。

  UILabel *myLabel = [UILabel new];   /*
    UIFont 的preferredFontForTextStyle: 意思是指定一个样式,并让字体大小符合用户设定的字体大小。
   */
    myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline]; /*
 Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
 For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
 */
     //是否更新字体的变化
    myLabel.adjustsFontForContentSizeCategory = YES;

(原文:http://www.cnblogs.com/haogj/p/4778808.html)

图片 15

Jasmine 为 JavaScript 提供了 TDD
(测试驱动开发)的框架,对于前端软件开发提供了杰出的成色担保,那里对
Jasmine 的布局和接纳做二个注脚。

眼前,贾斯敏 的流行版本是 2.3 版,那里以 2.3
版举行求证。网上一度有一部分有关 Jasmine的资料,然则,有个别资料相比较深入,已经与现有版本不雷同。所以,那Ritter别以新颖版展开认证。

1.Notification(通知)

自从Notification被引入之后,苹果就时时刻刻的更新优化,但这么些更新优化只是小打小闹,直到现在后iOS
10初始真的的拓展大改重构,那让开发者也体会到UserNotifications的易用,成效也变得那么些有力。

  • iOS 9 以前的关照

    1.在调用方法时,有些措施令人很难区分,简单写错方法,那让开发者有时候很烦躁。

    2.接纳在运转时和非运维时捕获通告的门道还不等同。

    3.利用在前台时,是无力回天直接体现远程通告,还须要特别处理。

    4.早就发生的打招呼是不可能立异的,内容发生时是不能够改变的,并且只有不难文本展现方式,增添性根本不是很好。

  • iOS 10 初阶的文告

    1.富有相关文告被统一到了UserNotifications.framework框架中。

    2.增添了吊销、更新、中途还能修改公告的剧情。

    3.通知不在是粗略的文件了,能够参预录像、图片,自定义通知的显得等等。

    4.iOS
    10针锋相对在此以前的关照来说越发好用易于管理,并且进行了科普优化,对于开发者来说是一件善事。

    5.iOS
    10始发对于权力难点展开了优化,申请权限就相比较简单了(本地与长途文告集成在三个艺术中)。

    要是应用了推送,修改如图:

   图片 16

   

4. 常用断言

4.1 toEqual

深相等,对于目的的话,会相比对象的每一种属性。对于数组来说,会相比较数组中各种成分。

图片 17

  describe("The 'toEqual' matcher", function() {

    it("works for simple literals and variables", function() {
      var a = 12;
      expect(a).toEqual(12);
    });

    it("should work for objects", function() {
      var foo = {
        a: 12,
        b: 34
      };
      var bar = {
        a: 12,
        b: 34
      };
      expect(foo).toEqual(bar);
    });
  });

图片 18

 

4.2 toBe

对此目的,引用相等。对于值,值十分。

pass: actual === expected

例如

  it("and has a positive case", function() {
    expect(true).toBe(true);
  });

 

4.3 toBeTruthy

是或不是为真。

  it("The 'toBeTruthy' matcher is for boolean casting testing", function() {
    var a, foo = "foo";

    expect(foo).toBeTruthy();
    expect(a).not.toBeTruthy();
  });

 

4.4 toBeFalsy

是不是为假。

  it("The 'toBeFalsy' matcher is for boolean casting testing", function() {
    var a, foo = "foo";

    expect(a).toBeFalsy();
    expect(foo).not.toBeFalsy();
  });

 

4.5 toBeDefined

是或不是定义过

  it("creates spies for each requested function", function() {
    expect(tape.play).toBeDefined();
    expect(tape.pause).toBeDefined();
    expect(tape.stop).toBeDefined();
    expect(tape.rewind).toBeDefined();
  });

 

4.6 toBeUndefined

从没概念

图片 19

  it("The `toBeUndefined` matcher compares against `undefined`", function() {
    var a = {
      foo: "foo"
    };

    expect(a.foo).not.toBeUndefined();
    expect(a.bar).toBeUndefined();
  });

图片 20

 

4.7 toBeNull

图片 21

  it("The 'toBeNull' matcher compares against null", function() {
    var a = null;
    var foo = "foo";

    expect(null).toBeNull();
    expect(a).toBeNull();
    expect(foo).not.toBeNull();
  });

图片 22

 

4.9 toBeGreaterThan

图片 23

  it("The 'toBeGreaterThan' matcher is for mathematical comparisons", function() {
    var pi = 3.1415926,
      e = 2.78;

    expect(pi).toBeGreaterThan(e);
    expect(e).not.toBeGreaterThan(pi);
  });

图片 24

 

4.10 toBeLessThan

图片 25

  it("The 'toBeLessThan' matcher is for mathematical comparisons", function() {
    var pi = 3.1415926,
      e = 2.78;

    expect(e).toBeLessThan(pi);
    expect(pi).not.toBeLessThan(e);
  });

图片 26

 

4.11 toBeCloseTo

图片 27

  it("The 'toBeCloseTo' matcher is for precision math comparison", function() {
    var pi = 3.1415926,
      e = 2.78;

    expect(pi).not.toBeCloseTo(e, 2);
    expect(pi).toBeCloseTo(e, 0);
  });

图片 28

 

4.12 toContain

集合中是还是不是含有。

  it("The 'toContain' matcher is for finding an item in an Array", function() {
    var a = ["foo", "bar", "baz"];

    expect(a).toContain("bar");
    expect(a).not.toContain("quux");
  });

 

4.13 toMatch

正则说明式的合营

图片 29

  it("The 'toMatch' matcher is for regular expressions", function() {
    var message = "foo bar baz";

    expect(message).toMatch(/bar/);
    expect(message).toMatch("bar");
    expect(message).not.toMatch(/quux/);
  });

图片 30

 

4.14 toThrow

检测是还是不是抛出很是

图片 31

  it("The 'toThrow' matcher is for testing if a function throws an exception", function() {
    var foo = function() {
      return 1 + 2;
    };
    var bar = function() {
      return a + 1;
    };

    expect(foo).not.toThrow();
    expect(bar).toThrow();
  });

图片 32

 

4.15 toHaveBeenCalled

4.16 toHaveBeenCalledWith

是或不是调用过。

图片 33

describe("A spy", function() {
  var foo, bar = null;

  beforeEach(function() {
    foo = {
      setBar: function(value) {
        bar = value;
      }
    };

    spyOn(foo, 'setBar');

    foo.setBar(123);
    foo.setBar(456, 'another param');
  });

  it("tracks that the spy was called", function() {
    expect(foo.setBar).toHaveBeenCalled();
  });

  it("tracks all the arguments of its calls", function() {
    expect(foo.setBar).toHaveBeenCalledWith(123);
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
  });

  it("stops all execution on a function", function() {
    expect(bar).toBeNull();
  });
});

4.Xcode 8 运转一堆没用的logs消除办法

图片 34

 

上海教室大家来看,自个儿新建的二个工程啥也没干就打字与印刷一堆烂七八糟的东西,作者以为那几个理应是Xcode 8的问题,

切实也没细切磋,化解办法是设置OS_ACTIVITY_MODE : disable如下图:

 

第一步:

图片 35

第二步:

图片 36

 

第三步:

添加参数:

Name :OS_ACTIVITY_MODE 

Value :  disable

图片 37

3.1 describe 和 it

describe
用来对测试用例实行分组,分组能够嵌套,各个分组能够有1个讲述表达,这些注明将相会世在测试结果的页面中。

describe("Player", function() {
      describe("when song has been paused", function() {

而 it
就是测试用例,每种测试用例有3个字符串的求证,匿名函数内正是测试内容。

  // 检测正在歌手进行的歌曲确实是指定的歌曲
  it("should be able to play a Song", function() {
    player.play(song);
    expect(player.currentlyPlayingSong).toEqual(song);
  });

测试结果的断言使用 expect 实行,函数内提供测试的值,toXXX
中则是期待的值。

上边的测试使用 toEqual 实行相等断言判断。

用作开发者,怎么样适配iOS10吧?

3.2 beforeEach 和 afterEach

示范中还出现了 beforeEach。

图片 38

  var player;
  var song;

  beforeEach(function() {
    player = new Player();
    song = new Song();
  });

图片 39

顾名思义,它象征在本组的每一个测试在此以前须要开始展览的预备干活。在我们那边的测试中,总要用到
player 和 song 那多个对象实例,使用 forEach
有限帮忙在各类测试用例执行在此之前,重新对那多少个对象举办了初始化。

afterEach 会在每2个测试用例执行之后执行。

12.Xcode 8 插件不能够用的难题

世家都进步了Xcode 8,可是对于插件正视的开发者们,一边哭着贰头去网上搜寻消除办法。那么下边是化解办法:
让你的 Xcode8
继续利用插件(http://vongloo.me/2016/09/10/Make-Your-Xcode8-Great-Again/?utm\_source=tuicool&utm\_medium=referral
)

而是看到小说最后的解说,大家知晓假设用插件的话,大概安全上会有题目、并且付诸审核会被驳回,所以提议大家要么不要用了,消除办法总是有个别,比如在Xcode中添加注释的代码块也是很有益的。

 

【转】行使 Jasmine 进行测试驱动的 JavaScript 开发

6.iOS 10 UICollectionView 品质优化

乘机开发者对UICollectionView的深信,项目中用的地点也比较多,但是依旧存在有的标题,比如偶尔会卡顿、加载慢等。所以iOS
10 对UICollectionView越是的优化。

  • UICollectionView cell pre-fetching预加运载飞机制
  • UICollectionView and UITableView prefetchDataSource 新增的API
  • 针对self-sizing cells 的改进
  • Interactive reordering

  在iOS 10
以前,UICollectionView上边如若有恢宏cell,当用户活动赶快的时候,整个UICollectionView的卡顿会很明朗,为何会招致那样的题材,那里涉及到了iOS
系统的录取机制,当cell准备加载进显示器的时候,整个cell都已经加载成功,等待在显示器外面了,也正是全体一行cell都曾经加载完结,那就是导致卡顿的机要缘由,专业术语叫做:掉帧.
要想让用户觉得不到卡顿,大家的app必须帧率达到60帧/秒,也正是说每帧16飞秒要刷新3回.

 

  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创办也许生成1个cell.
    在iOS 第10中学,系统会cell保存一段时间,也便是说当用户把cell滑出显示器未来,就算又滑行回来,cell不用再走1遍生命周期了,只要求调用willDisplayCell措施就足以重新出今后显示器中了.
    iOS 第10中学,系统是三个一个加载cell的,二在此以前是单排一行加载的,那样就足以荣升广大性质;

    ##### iOS 10 新扩展的Pre-Fetching预加载

    本条是为了降低UICollectionViewCell在加载的时候所开支的小时,在 iOS 10中,除了数据源协议和代理协议外,新扩张了一个UICollectionViewDataSourcePrefetching切磋,那些体协会议里面定义了三个方法:

  - (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);

  - (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths  NS_AVAILABLE_IOS(10_0);

   在ColletionView prefetchItemsAt indexPaths其一措施是异步预加载数据的,个中的indexPaths数组是不变的,正是item接收数据的次第;
CollectionView cancelPrefetcingForItemsAt indexPaths本条主意是可选的,能够用来拍卖在滑行中收回也许下落提前加载数据的预先级.
   注意:那一个体协会议并不能够替代在此以前读取数据的格局,仅仅是帮扶加载数据.
   Pre-Fetching预加载对UITableViewCell同样适用.

 

15、推送的时候,开启Remote notifications

You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:],
but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.

化解方案:需求在Xcode 中期维修改应用的 Capabilities 开启Remote
notifications,请参见下图:

图片 40

16、One of the two will be used. Which one is undefined.”

  objc[5114]: Class PLBuildVersion is implemented in both
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices
(0x1109a5910) and
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices
(0x110738210). One of the two will be used. Which one is undefined.

  在模拟器中、发现“One of the two will be used. Which one is
undefined.”日志**

  查找资料发现原因:objc runtime 对所用app使用同三个命名空间(flat
namespace),运营机制如下:

  1. 先是二进制影象被加载,检查程序依赖关系
  2. 每二个二进制影像被加载的同时,程序的objc classes在objc
    runtime命名空间中注册
  3. 假使全数同等名称的类被再度加载,objc
    runtime的作为是不行预言的。一种大概的情状是专擅七个程序的此类会被加载(这应当也是私下认可动作)

    17、Invalid Bundle – The asset catalog at ‘Payload/XXXXX/Assets.car’
    can’t contain 16-bit or P3 assets if the app supports iOS 9.3 or earlier

在 Xcode 8中,当您财富文件中[含有16位图]或者[图形突显情势γ值为’P3′]且iOS
targets设定为iOS 9.3以下就会现出那个标题.
假诺你的app须要协助广色域展现的话,那您不能够不得把target设置成iOS
9.3+,相反,即便你的app不须要协理广色域且你想包容 iOS 9.3
此前的项目,你就得把装有的15人的恐怕展现形式为’P3’图片全都替换到伍位格局的S昂CoraGB颜色的图形。

 

你能够透过运转“assetutil”在iTunes Connect的错误新闻中找到16-bit 或 P3
财富文件。离线的化解方案如下:

1.导出档次的 ipa 文件

2.一定到该ipa文件修改后缀名.ipa 为 .zip.

  1. 解压该 .zip 文件. 解压后的目录里面会有贰个暗含着您的 app bundle
    文件的 Payload 文件夹.

  2. 打开终端病切换来您的app的Payload文件夹下的 .app
    bundle 文件夹内,情势如下:

cd path/to/Payload/your.app

  1. 用 find 命令定位到 Assets.car 文件 .app bundle , 方式如下:

find . -name ‘Assets.car’

  1. 动用 assetutil 命令找到任何带有着 16-bit or P3 的财富文件, 对各种Assets.car 之行以下命令 :

sudo xcrun –sdk iphoneos assetutil –info /path/to/a/Assets.car >
/tmp/Assets.json

  1.  打开上一步生成的 /tmp/Assets.json 文件并摸索包涵有 “DisplayGamut”:
    “P3” 也许有关的内容.
     那段json的”Name”字段对应的值正是十三位或显示的γ值为P3的财富文件名.

    1.  找到那个财富文件修改为 伍位的s福特ExplorerGB方式,重新编写翻译上传你的app即可. 
18、This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8 or later

  编辑项目时暗中同意使用Xcode8打开,导致笔者用Xcode7打开Xib是报错:

 This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8.0 or later

 
 导致用Xcode8打开的Xib全部打不开,只好用编辑器将Xib里面的下边一句话删除掉才能打开:

<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>



未完待续,持续更新~

 

10.iOS 10 UIScrollView新增refreshControl

图片 41

 

iOS 10 未来如若是后续UIScrollView那正是说就接济刷新效用:

@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;

13.iOS 10早先项目中有的文字显示不全难题

我用Xcode 8Xcode 7.3各自测试了下,如下图:

图片 42

Xcode 8

Xcode7 

创建一个Label然后让它自适应大小,字体大小都是17最后输出的宽度是不一样的,我们再看一下,
下面的数据就知道为什么升级iOS 10 之后App中有的文字显示不全了:



英文字母会不会也有这种问题,我又通过测试,后来发现英文字母没有问题,只有汉字有问题。
目前只有一个一个修改控件解决这个问题,暂时没有其他好办法来解决。

8.iOS 10 UITextContentType

// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil

在iOS 10
UITextField添加了textContentType枚举,提示文本输入区域所期待的语义意义。

运用此属性能够给键盘和体系新闻,关于用户输入的剧情的料想的语义意义。例如,您能够钦定八个文本字段,用户填写收到一封电子邮件确认uitextcontenttypeemailaddress。当您提供有关您愿意用户在文件输入区域中输入的情节的音讯时,系统可以在少数景况下活动接纳合适的键盘,并增强键盘改进和主动与其他文件输入机会的重组。

5.iOS 10 UIStatusBar方法过期:

图片 43

 

在我们付出中有大概用到UIStatusBar局地性质,在iOS 10中这一个主意已经晚点了,尽管您的种类中有效的话就得需求适配。

地点的图样也能窥见,假若在iOS
第10中学你供给运用preferredStatusBar譬如说那样:

//iOS 10 - (UIStatusBarStyle)preferredStatusBarStyle {    return UIStatusBarStyleDefault;
}

  iOS 10 此前UICollectionViewCell的生命周期是那般的:
  • 1.用户滑动显示屏,荧屏外有三个cell准备加载进来,把cell从reusr队列拿出来,然后调用prepareForReuse方法,在那一个点子里面,能够重置cell的状态,加载新的数据;
  • 2.继续滑动,就会调用cellForItemAtIndexPath格局,在那些艺术里面给cell赋值模型,然后回来给系统;
  • 3.当cell登时进入荧屏的时候,就会调用willDisplayCell艺术,在这几个法子里面大家还足以修改cell,为进入荧屏做最后的预备干活;
  • 4.执行完willDisplayCell艺术后,cell就进来显示屏了.当cell完全偏离显示屏现在,会调用didEndDisplayingCell方法.

2.ATS的问题

iOS
9中默许非HTTS的互联网是被明确命令禁止的,当然大家也能够把NSAllowsArbitraryLoads设置为YES禁用ATS。可是iOS
10从前年3月16日起苹果差异意大家经过那么些法子跳过ATS,也正是说强制大家用HTTPS,如若不那样的话提交App大概会被驳回。可是大家得以通过NSExceptionDomains来针对特定的域名开放HTTP能够简单通过核对。

NSExceptionDomains形式 设置域。能够大致明了成,把不帮衬https协议的接口设置成http的接口。

具体方法:

1)、在类型的info.plist中添加三个Key:App Transport Security
Settings,类型为字典类型。

2)、然后给它添加3个Exception Domains,类型为字典类型;

3)、把必要的扶助的域添加給Exception
Domains。个中域作为Key,类型为字典类型。

4)、每种域上边需求安装三个本性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。

如图:

图片 44

11.iOS 10 判断系统版本正确姿势

认清系统版本是我们平时使用的,特别是后天大家都有或许须要适配iOS
10,那么难题就应运而生了,如下图:

图片 45

我们收获了答案是:

//值为 1 [[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]

//值为10.000000 [[UIDevice currentDevice] systemVersion].floatValue,

//值为10.0 [[UIDevice currentDevice] systemVersion]

之所以说判断系统方法最棒依旧用前面包车型地铁三种办法,哦~作者记不清说了[[UIDevice currentDevice] systemVersion].floatValue其一措施也是不可相信的,好像在8.3本子输出的值是8.2,记不知底了反正是不可相信的,所以提出大家用[[UIDevice currentDevice] systemVersion]其一措施!

斯维夫特判断如下:

  if #available(iOS 10.0, *) {
            // iOS 10.0
            print("iOS 10.0");
        } else { }

3.iOS 10 隐衷权限设置

iOS 10 初步对隐衷权限特别严峻,假设您不安装就会直接崩溃,今后游人如织遇见崩溃难题了,一般化解办法都以在info.plist文本添加对应的KeyValue就足以了。

图片 46

 

以上Value值,圈出的红线部分的文字是显得给用户看的,必须抬高。

14.Xcode 8行使Xib awakeFromNib的警示难题

Xcode 8事先大家选择Xib初始化- (void)awakeFromNib {}皆以那般写也没怎么难题,可是在Xcode 8会有如下警告:

图片 47

官方解释:
You must call the super implementation of awakeFromNib to give parent classes the opportunity to perform any additional initialization they require.
Although the default implementation of this method does nothing, many UIKit classes provide non-empty implementations. 
You may call the super implementation at any point during your own awakeFromNib method.


你必须调用父类实现awakeFromNib来给父类来执行它们需要的任何额外的初始化的机会。
虽然这种方法的默认实现不做任何事情,许多UIKit类提供非空的实现。
你可以调用自己的awakeFromNib方法中的任何时候超级实现。