Xcode 8.0でOS_ACTIVITY_MODE = disableを指定すると、実機実行時にNSLogが出力されなくなるので注意

# 【追記】Xcode 8.1 beta2で修正されました

Xcode 8.0でシミュレーター実行時にログノイズが大量に出力されてしまうことは、やはり一時的なバグだったようで、修正されました :tada: 

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Xcode 8.1b2 release notes: …no longer shows extra logging from system frameworks when debugging applications in the Simulator. 💫</p>&mdash; zachary ✌ (@zadr) <a href="https://twitter.com/zadr/status/783356758005690368">October 4, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[‎Xcode 8.1 beta 2 Release Notes](http://adcdownload.apple.com/Documentation/Xcode_8.1_beta_2_SDK_Release_Notes/Release_Notes_for_Xcode_8.1_beta_2.pdf)
> Xcode Debug Console no longer shows extra logging from system frameworks when debugging applications in the Simulator. (26652255, 27331147)

Xcode 8.0での開発中は以下の対処などでしのぎつつ、Xcode 8.1に移行したら速やかに`OS_ACTIVITY_MODE = disable`指定を消すのが良いかと思います。

---

Xcode 8.0でシミュレーター実行時にログノイズが大量に出力されてしまうことの対策として、Environment Variablesに`OS_ACTIVITY_MODE` = `disable`を設定する方法が、[Xcode 8 の不要なログを非表示にする方法 - Qiita](http://qiita.com/plasticstraw/items/77d93cdb644dc66c48f8)やTweetなどで広まっていますが、注意です。

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">To stop the Xcode 8 iOS Simulator from logging like crazy, set OS_ACTIVITY_MODE = disable in your debug scheme. <a href="https://t.co/hKbrOXAyuC">pic.twitter.com/hKbrOXAyuC</a></p>&mdash; Russell Ivanovic (@rustyshelf) <a href="https://twitter.com/rustyshelf/status/775505191160328194">September 13, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

問題は解決するものの、代わりに**実機実行時に`NSLog`が出力されなくなってしまいます**。

`print`は出力されるものの、[Swift: print() vs println() vs NSLog()](http://stackoverflow.com/a/25951564/1524942)などにあるように、`print`はデバイスコンソールに出力されないので、ログ目的だと`NSLog`使うことも多いです。

というわけで、まずこの挙動理解していないと、実機実行時にNSLogが出力されずハマることになると思います。

実際にけっこうハマっています:
[xcode - iOS 10 doesn't print NSLogs - Stack Overflow](http://stackoverflow.com/questions/37886600/ios-10-doesnt-print-nslogs)

# シミュレーターと実機実行時で設定を変える運用

普段、Environment Variablesに`OS_ACTIVITY_MODE` = `disable`を設定しておいて、適当に変えれば良いのでは？と思うかもしれませんが、実機実行時のログを無効化している状態で再現難しい系の問題が発生してログを遡れないのは辛いので、きちんとシミュレーターと実機実行時で設定を切り替えたいと思いました。

賢く切り替える方法は無さそうなので、下記のように`application(_:didFinishLaunchingWithOptions:)`などでassertionかけるしかないかな、という感じです（´・ω・｀）

```swift
let osActivityMode = ProcessInfo.processInfo.environment["OS_ACTIVITY_MODE"]
let isDisabled = osActivityMode == "disable"
let isSimulator = ObjcHelper.isSimulator()
assert((isDisabled && isSimulator) || (!isDisabled && !isSimulator))
```

シミュレーターでノイズ出まくるのは許容として、`assert(isSimulator || (!isDisabled && !isSimulator))`でも良いかもしれません。

シミュレーターかどうかは、以下のコードで判定しています。
(Swiftでも書けないことは無いですが、微妙な書き方しか見つからなかったので、これで判定していました。今改めて探しましたが、やはりObjective-C使った方がマシな感じがしました。)

```objc
@interface ObjcHelper : NSObject
+ (BOOL)isSimulator;
@end 
```

```objc
#import "ObjcHelper.h"
@import UIKit;

@implementation ObjcHelper

+ (BOOL)isSimulator {
#if (TARGET_IPHONE_SIMULATOR)
    return YES;
#endif
    return NO;
}

@end 
```

# デフォルトはオフが良さそうです

以下のように思っています。

- 「Xcode 8でシミュレーター実行時にログノイズが大量に出力されてしまうこと」→ バグ(【追記】Xcode 8.1 beta2で修正されました。)
    - 直り次第、`OS_ACTIVITY_MODE` = `disable`の設定は不要になる
- 「`OS_ACTIVITY_MODE` = `disable`を設定すると実機実行時にNSLogが出力されなくなること」→ 正常動作

なので、shared schemeでバージョン管理している場合、以下の状態でコミットして、必要に応じてオンにするのが良いと思いました。

<img width="578" alt="Screen Shot 2016-09-27 at 15.21.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/6e715e61-77da-87fb-fabc-d5bac2164dd4.png">