SpriteKitでiOS7/8で動作が異なっていたところ


SpriteKitでゲームを作っていてiOS7と8で異なっていたところがあったので、書こうと思います。
そんなにSpriteKit使い倒してるわけでもないので、認識違ってるところだったり、もっとよい方法などぜひアドバイス頂きたいです！m(_ _)m

##アプリをバックグラウンド/フォアグラウンド遷移時の挙動

###iOS8
・バックグラウンド遷移時、画面が一時停止する（SKNode.paused = YESしたときのような挙動）。
・フォアグラウンド遷移時、画面が一時停止が解除される（SKNode.paused = NOしたときのような挙動）。
　→コードで明示的にSKNode.paused = YESで一時停止ていても、フォアグラウンド遷移時に一時停止が解除される。

###iOS7
・バックグラウンド/フォアグラウンド遷移時に勝手に画面が一時停止/一時停止の解除がされない。

##バイクのタイヤの作成処理
バイクを走らせるゲームを作っているため、バイクの加速に合わせてタイヤを回転させる必要があり、そのときにタイヤの中心点を車体に固定するコードを書く必要がありました。
その処理を行うためのコードがiOS8,7で異なっていました。

###iOS8
・SKPhysicsBody.pinnedプロパティ(iOS8SDKで追加)にYESをセット。

###iOS7
・SKPhysicsJointPinクラスを使って、self.physicsWorldにaddJoint。


```タイヤの中心点を車体に固定するコード例

//selfのクラスは、SKSceneのサブクラスを想定。

@property(nonatomic,strong) SKSpriteNode *myWorld;//親ノード
@property(nonatomic,strong) SKSpriteNode *bikeFrame;//車体
@property(nonatomic,strong) NSMutableArray *tires;//タイヤ(後輪、前輪)

static const uint32_t Collision_bitmask_tire = 0x1 << 0;


/**
 * バイクノード作成
 * かなり汚いコードで恐縮ですが、★付きのところがタイヤの中心点を車体に固定するコードです。。
 */
- (void)createBikeNode
{
    self.bikeFrame = [SKSpriteNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(40.f, 38.f)];
    self.bikeFrame.position = CGPointMake(50, Y_GROUND_START + (self.bikeFrame.size.height/2));
    self.bikeFrame.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.bikeFrame.size];
    self.bikeFrame.physicsBody.dynamic = YES;//重力影響(default:YES)
    self.bikeFrame.physicsBody.collisionBitMask = Collision_bitmask_bikeframe;//衝突bitMask。ぶつかったときに物理的に影響受けるか。はねかえったりするか。
    self.bikeFrame.physicsBody.contactTestBitMask = 0;//接触bitMask。ぶつかったときにdelegate実行されるか。
    self.bikeFrame.physicsBody.restitution = 0;//できるだけ弾まないようにする
    self.bikeFrame.name = NAME_BIKE;
	
    self.tires = [NSMutableArray new];
    CGFloat tireRadius = 7.;
    CGFloat tireMargin = 5.5;
    //タイヤ
    CGPoint center[] = {
        //後輪
        CGPointMake(0 - tireRadius - tireMargin + 2.0,
                    0 - tireRadius - 3),
        //前輪
        CGPointMake(0 + tireRadius + tireMargin + 0.5,
                    0 - tireRadius - 3)
    };

    for (int i=0; i<2; i++) {
        SKSpriteNode* tire;
        tire = [SKSpriteNode spriteNodeWithImageNamed:@"tire"];
        tire.position = CGPointMake(center[i].x, center[i].y);
        tire.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:tire.size.width/2.];
        tire.physicsBody.collisionBitMask = Collision_bitmask_tire;//地面と接触可能にする
        tire.physicsBody.usesPreciseCollisionDetection = YES;
        if(i == 0) {
            tire.physicsBody.categoryBitMask = Category_bike_back_wheel;
        } else {
            tire.physicsBody.categoryBitMask = Category_bike_front_wheel;
        }
       
        tire.physicsBody.contactTestBitMask = Category_ground;//コンタクト対象
        tire.physicsBody.restitution = 0;//できるだけ弾まないようにする
        tire.physicsBody.dynamic = NO;

		if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
			tire.position = CGPointMake(center[i].x, center[i].y);
			[self.bikeFrame addChild:tire];
			//★★★★★★★★★★★★★★★
			tire.physicsBody.pinned = YES;//iOS8のときはここで親ノードにpin止め
			//★★★★★★★★★★★★★★★
		} else {
			tire.position = CGPointMake(self.bikeFrame.position.x + center[i].x,
										self.bikeFrame.position.y + center[i].y);
			[self.myWorld addChild:tire];
		}
		
        [self.tires addObject:tire];
    }
	
	//ここで車体をmyWorldに追加して、タイヤよりも前面表示にする。
	[self.myWorld addChild:self.bikeFrame];
	
    //★★★★★★★★★★★★★★★
    //iOS7の場合はここでタイヤをpin止め
	if([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
		for (SKSpriteNode* tire in self.tires) {
			SKPhysicsJointPin *pin = [SKPhysicsJointPin jointWithBodyA:self.bikeFrame.physicsBody bodyB:tire.physicsBody anchor:tire.position ];
			[self.physicsWorld addJoint:pin];
		}
	}
    //★★★★★★★★★★★★★★★
	
	
	//車体画像を追加。
	//iOS8ではここでやることにより、車体画像をタイヤよりも前面にしている
	SKSpriteNode* frame = [SKSpriteNode spriteNodeWithImageNamed:@"bikeFrame"];
	frame.position = CGPointMake(0.f, 0.f);//中央
	[self.bikeFrame addChild:frame];
}

```