20201128のiOSに関する記事は7件です。

【swift】google admobを実装した際に「[UIView setAdUnitID:]: unrecognized selector sent to instance」が出力した場合の対応

swiftでgoogle admobを実装している際に下記エラーが出力した。

エラー内容

Thread 1: "-[UIView setAdUnitID:]: unrecognized selector sent to instance 0x7fce3a70abc0"

スクリーンショット 2020-11-28 21.34.03.png

対応方法

広告の枠としたいUIViewと「@IBOutlet weak var bannerView: GADBannerView!」をドラッグアンドドロップなどで紐付けるのだが、その際UIViewのCustom ClassのClass名に「GADBannerView」が記載されておらず実行時エラーとなっていた。

UIViewのCustom ClassのClass名に「GADBannerView」を記載することで、無事エラー回避できた。

修正前

スクリーンショット 2020-11-28 21.36.12.png

修正後

スクリーンショット 2020-11-28 21.40.09.png

最後に

コードを先に書いたあとに、UIViewにドラッグアンドドロップで紐付けると、UIViewのCustomClassは更新されないんですね。。。
ともあれ解消したのでよかったです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【swift5】APIを叩くときは「HTTP」を「HTTPS」に直しましょう

※本記事が筆者の初投稿です! 優しい目で参考程度にご活用ください!

はじめに

なーんにも考えずに、AlamoFireでAPIを叩いたりなどでHTTP通信をすると、
「エラーが出る」とか「想定より少ないデータしか取れない」
って問題が発生したりします。

HTTP通信は暗号化されていない安全性の低い通信のため、
appleがデフォルトでブロックさせています。

この状態でrequestを出しても、セキュリティでブロックされてる状態なので、
responseは返ってきません。
キャッチボールしようとしてるのに、二人の間に壁があるようなものです。
これでは投げても相手に届かないので投げ返してくれませんね。

壁に邪魔されない形式の通信に変更しましょう。

解決策

例えばAPIを使おうとして、サイトに載ってるサンプルクエリをコピペしてみます。
そうするとありがちなのが以下みたいなURL。
http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011」

このデフォルトで文頭が「http://」になってるのが引っかかりポイント。
単純に「http://」を「https://」に直してあげましょう。

これで壁に邪魔されない、安全性の高い通信形式に変更できました。

それでもダメな場合は

API側が、http通信しか対応していない場合があります。
「httpsに直してもダメだ〜」って時は、そもそもの壁を取っ払ってやりましょう。

①ATSを無効化する (簡易版)

下記URLの「info.plistの編集」を参照してください。
【swift】XcodeでiOSアプリのhttp通信を許可する方法

Info.plistに飛んで、ATSを無効化しましょう。
スクリーンショット 2020-11-28 18.49.55.png
ただ、上記の方法は全てのHTTP通信を許可しているため、安全性に欠けます。
審査に提出するとなると、apple様はこの方法では通してくれません。

特定のボール(ドメイン)だけ、壁(ATS)を通り抜けるようにしましょう。

②特定のドメインのみ許可する (発展版)

下記URLを参照して、特定のドメインだけ許可してあげましょう。
お菓子検索アプリ:iOS10でのATS設定について

これで指定したボール(ドメイン)だけは通り抜けられるようになりました。

ただATSという壁を設けている時点で、そもそもHTTP通信をappleは推奨していないことには留意してください。
2020年11月現在でも審査に通るかは未検証です。

終わりに

何がハマったって、これやらなくても「少量ならレスポンスが返ってきた時があった」のが、
1番のハマり&誤認ポイントだった。

「無制限にデータ受け取りたいのに、取得データが少ない」とか、
「10件くらいの少量なら大丈夫だけど、100件とか多量のデータを受け取ろうとするとエラー吐く」
とかいう方は「http通信になっていないか」、もしくは「ATSはどうなっているか」を確認してみてください。

自分と同じくらいの初学者さんの助けになれれば。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】Unity上からiOS端末の発熱状態を取得する

iOS端末の発熱状態を取得できるAPIが無いか調べていたところ、ProcessInfo.thermalState
から取得できることが分かりました。(※ドキュメントを見るに対応OSはiOS 11.0+である必要がありそう)

この値を知ることが出来れば、例えば重いシーンなどで状態を見てサーマルスロットリング対策を可変的に機能させる処理を書くことが出来るかもしれません。(e.g. 熱状態がヒドいときに一部の機能のクオリティや更新頻度を下げるなど)

今回はこちらをUnityからも参照できるようにネイティブプラグインも合わせて実装したのでメモ。
※コードだけ先に見たい方はこちら参照

  • Unity 2019.4.15f
  • Xcode 12.2

ProcessInfo.ThermalState について

thermalStateを参照するとProcessInfo.ThermalStateと言うenum型が返ってきます。
こちらは以下の様に定義されており、現在の端末の発熱状態を知ることが出来ます。

    // Describes the current thermal state of the system.
    @available(iOS 11.0, *)
    public enum ThermalState : Int {

        // No corrective action is needed.
        case nominal = 0

        // The system has reached a state where fans may become audible (on systems which have fans). Recommendation: Defer non-user-visible activity.
        case fair = 1

        // Fans are running at maximum speed (on systems which have fans), system performance may be impacted. Recommendation: reduce application's usage of CPU, GPU and I/O, if possible. Switch to lower quality visual effects, reduce frame rates.
        case serious = 2

        // System performance is significantly impacted and the system needs to cool down. Recommendation: reduce application's usage of CPU, GPU, and I/O to the minimum level needed to respond to user actions. Consider stopping use of camera and other peripherals if your application is using them.
        case critical = 3
    }

コメントには状態及び推奨される解決策などが記載されており、ざっと和訳すると以下のように分類できそうです。

  • nominal
    • 正常動作の範囲内
  • fair
    • 熱状態がやや上昇している
    • 推奨される対策:
      • ユーザーに表示されないアクティビティの遅延
  • serious
    • 熱状態が高い
      • (ファン搭載機の場合には)最大速度で動作しているために、システムのパフォーマンスに影響を及ぼす可能性がある
    • 推奨される対策:
      • 可能であればアプリのCPU,GPU,I/Oの使用率を下げる
      • 視覚効果を低品質のものに切り替えるなどしてフレームレートを下げる
  • critical
    • 熱状態がシステムパフォーマンスに大幅な影響を与えるレベルまで達したので、デバイスを冷やす必要がある
    • 推奨される対策:
      • アプリのCPU,GPU,I/Oの使用率をユーザーアクションに応答するために必要な最小限レベルまで削減すること
      • アプリがカメラやその他周辺機器を使用している場合には使用を停止することを検討

Unity上で参照するには

thermalStateはProcessInfoが持つstatic変数から参照することが出来るので、そのまま流すNativePluginを書くことでUnity上からも参照することが出来ます。(要iOSビルド)

以下にコードを載せておきます。
(※P/Invokeに於ける便宜上、ObjectiveC++で実装してます)

ProcessInfoWrapper.mm
#import <Foundation/Foundation.h>

@interface ProcessInfoWrapper : NSObject

// 結果はNSProcessInfoThermalStateに準拠
// - https://developer.apple.com/documentation/foundation/nsprocessinfothermalstate?language=objc
+ (int)getThermalState;
@end

@implementation ProcessInfoWrapper
+ (int)getThermalState {
    return (int) [NSProcessInfo.processInfo thermalState];
}
@end


#ifdef __cplusplus
extern "C" {
#endif

int __getThermalState() {
    return [ProcessInfoWrapper getThermalState];
}

#ifdef __cplusplus
}
#endif
ProcessInfoWrapperBridge.cs
using System.Runtime.InteropServices;

namespace iOSNative
{
    public static class ProcessInfoWrapperBridge
    {
        [DllImport("__Internal")]
        static extern int __getThermalState();

        /// <summary>
        /// 現在のiOS端末の発熱状態の取得
        /// </summary>
        /// <returns>iOS実機以外は常に.Nominalを返す</returns>
        public static ThermalState GetThermalState()
        {
#if !UNITY_EDITOR && UNITY_IOS
            return (ThermalState) __getThermalState();
#endif
            return ThermalState.Nominal;
        }
    }
}
ThermalState.cs
namespace iOSNative
{
    // https://developer.apple.com/documentation/foundation/processinfo/thermalstate
    public enum ThermalState
    {
        /// <summary>
        /// The thermal state is within normal limits.
        /// </summary>
        Nominal,

        /// <summary>
        /// The thermal state is slightly elevated.
        /// </summary>
        Fair,

        /// <summary>
        /// The thermal state is high.
        /// </summary>
        Serious,

        /// <summary>
        /// The thermal state is significantly impacting the performance of the system and the device needs to cool down.
        /// </summary>
        Critical,
    }
}

スクリプトからはProcessInfoWrapperBridge.GetThermalState()を参照することで状態を取得できます。

おまけ: 動作確認

簡単な動作確認としてGPUに負荷の掛かりそうな以下のシーンを用意して、手持ちのiPhoneXで動作確認を行ってみました。

シーン自体は大量の半透明なPlaneを重ねて配置しているだけです。(2枚目はOverdraw)

Shared.png

Overdraw.png

これをコルーチン上から1秒間隔で熱状態のポーリングを行い、結果を色とテキストで表示するようにします。

IEnumerator Check()
{
    // 発熱状態を1秒間隔でポーリング
    while (true)
    {
        var thermalState = ProcessInfoWrapperBridge.GetThermalState();

        // 結果の表示
        _text.text = thermalState.ToString();
        switch (thermalState)
        {
            case ThermalState.Nominal:
                _text.color = Color.green;
                break;
            case ThermalState.Fair:
                _text.color = Color.yellow;
                break;
            case ThermalState.Serious:
                _text.color = new Color32(255, 165, 0, 255);
                break;
            case ThermalState.Critical:
                _text.color = Color.red;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }

        yield return new WaitForSeconds(1);
    }
}

結果

起動したばかりの何も表示されていない状態ではNominalとなってます。

iphonex_resize.jpg

こちらを先程の大量のPlaneを表示して適当に放置すると、以下のようにSeriousに変わっていることが確認できました。

IMG_3454_resize.png

リンク

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apollo iOS チュートリアルにて「Command PhaseScriptExecution failed with a nonzero exit code」のエラーが出た際の対応

Apollo iOS チュートリアル(1)を実施したときに発生したエラーの対応

Apollo iOS チュートリアル(1)を実施している途中、「9. Xcodeでのコード生成 - API.swift」の(2)以前にコメント化したコード(codegen:generateを含む)のコメントアウトを解除を実施したところで、「Command PhaseScriptExecution failed with a nonzero exit code」とエラーになりました。
「Build Phases」の「Apollo CLI」にあるSwift Package Manager Run Scriptのコメントアウトを解除しますが、そのままではエラーになります。

解決

issueにあるようにスクリプトを変更することでビルドが通りました。

"${SCRIPT_PATH}"/check-and-run-apollo-cli.sh codegen:generate --target=swift --includes=.//*.graphql --localSchemaFile="schema.json" API.swift

"${SCRIPT_PATH}"/run-bundled-codegen.sh codegen:generate --target=swift --includes=.//*.graphql --localSchemaFile="schema.json" API.swift
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftって何?特徴は?

本記事は、swiftって何をするための言語?swiftを使うメリットは?
というプログラミング初心者向けの記事になります。

<目次>

  • 1. swift とは
  • 2. swift の特徴

1. Swift とは

SwiftはiOS、macOS向けアプリケーションの開発言語として
Appleが発表したプログラミング言語です。
swiftの発表後に登場したwatchOSやiPadOSにも対応しています。

iOS
-> iPhoneに搭載されているOS(オペレーティングシステム)
macOS
-> macに搭載されているOS(オペレーティングシステム)
世の中には、他にもWindows や Linux 、 Android などといった様々なOSが存在します。

2. Swift の特徴

swiftは、様々な人や企業が利用しています。
当たり前ですが、利用される多くの理由があるからです。

swiftには様々な特徴が存在するのでそれについて紹介していきます。

2-1. 静的型付き言語

静的型付き言語とは、コンパイル時などの実行前の段階で変数や定数の型を決定するプログラミング言語のことです。
もちろん実行するまで変数の型が決まっていない動的型付き言語も存在します。

もちろんどちらの言語体系にもメリット・デメリットは存在しますが、
今回は静的型付き言語のメリットのみ紹介します。

静的型付き言語の最大のメリットといえば,
誤った型の値の代入などがコンパイルエラーとして検出されるため、
実行時のエラーの一部を未然に防げるというところです。

var a: Int      //変数はInt型

a = 1000        //Int型の代入はコンパイルエラーは発生しない。
a = "こんにちは"   //String型の代入はコンパイルエラーが発生する。

上記のようなわかりやすいミスはほぼ起こりえませんが、
コードを書いている上で型の違いは稀に起こります。

実行後にエラーが発生し、アプリが強制終了してから型の不一致に気づくようでは、
機能が完成してから間違いに気づくようなものです。

型が違うだけで多くのコードを書き直さなければならない可能性も出てきます。
そうなると機能の再設計をしなければならない場合も...。

それを未然に防ぐことが出来るのが静的型付き言語の最大の特徴とも言えると思っています。

2-2. nilの許容性をコントロールすることが出来る

まずはじめに、nilとは何も値が存在しないことを示すものです。
別のプログラミング言語だとnullやnoneのような、別の名前で存在することもあります。

多くのプログラミング言語では、
値が存在しない状態や参照先が存在しない状態を表す際に使われてきました。

一方で、nilが存在するが故に実行時エラーを招いてしまうという問題もありました。
(nilは厄介なことに、コンパイル時にエラーが発生しませんでした。)

しかし、そのような問題を回避するために、
Swiftでは基本的にはnilを変数や定数に代入出来ないようになっています。

ですが、nilを許容する特別な型の変数や定数にのみnilを代入出来る仕様になっています。

nilを代入出来る型と、代入出来ない型の違いは次のようになります。

var a: Int    //nilを代入するとエラーが起きる

var b: Int!   //nilを代入してもエラーが起きない
var c: Int?   //nilを代入してもエラーが起きない 

このように型の最後に ! や ? を付けることによりnilを許容するInt型になります。
オプショナル型などと呼ばれるのですが、それについては後日記事にします。

この状態で、print()というメソッドを使用すると下記のようになります。

print(a)    //nilを許容出来ないInt型なのに値が入っておらずコンパイルエラーが発生する

print(b)    // nil
print(c)    // nil

一時的に変数の中に値を入れたくない場合などは ! や ? をつけておくのがいいかもしれません。

2-3. 型推理による簡潔な記述が可能

この機能は個人的にかなり便利だなと思いました。

swiftの変数や定数には、Int型やString型など様々な方があるのですが、
型推理という仕組みが導入されているため明示的に型を宣言する必要がありません。

つまり、どういうことかというと

var a: Int   // Int型
var b = 10   // Int型
var c = "こんにちは"  // String型

このように、aのように明示的にInt型と宣言しても平気ですし、
bのように10という値(Int型の値)のみを入れても自動的にInt型ということになります。

2-4. ジェネリクスによる汎用的な記述が可能

ジェネリクス・・・?
ワタシ、ヨコモジ、キライ・・・。

少し調べてみたのですが、
なんでも特定の型に制限されない汎用的なプログラミングを書くための機能だとか。

通常のプログラミングでは、関数の引数は
Int型やString型などの予め決められた型以外の引数を渡すことは出来ません。

しかし、ジェネリクスを使用したプログラミングなら
様々な型を引数として渡すことが可能になります。

今回は引数でもらった値をprintで出力する関数を作成したとします。

func printParameters<T>(_ x: T,_ y: T){
    print(x)
    print(y)
}

printParameters(1,22)     // 1 と 22 が表示されます。
printParameters("こんにちは","さようなら")     // こんにちは と さようなら が表示されます。
printParameters(10,"こんにちは")    // 型引数:T は同じ型を受け取るので Int型とString型を引数にするとエラーが発生する

このように、同じ関数でも様々な型を使用することが出来るのがジェネリクスになります。
また、_(アンダースコア)には引数名を使用しないという特別な意味があります。

2-5. Objective-Cと連携可能

iOS,macOS向けのアプリケーション開発には、今まではObjective-Cが採用されていました。

アプリケーションを開発するために使用するフレームワークは、
macOS向けのCocoa、iOS, watchOS, tvOS向けのCocoa Touch が提供されています。

Cocoaの大部分はObjective-Cで記載されているため、
Objective-Cと高い互換性を持っているswiftはCocoaの利用も可能となっています。

これまで使用してきたObjective-Cのコードはほぼ全てswiftで使用可能なので、
Objective-Cでサービスを作った企業もswiftへの段階的な移行は楽ですね!

これから新しい言語が出た時は、
swiftから楽に移行できる仕様になっていると嬉しいですね!

以上、最後まで読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftがこんなに使われる理由

本記事は、swiftって何をするための言語?swiftを使うメリットは?
というプログラミング初心者向けの記事になります。

<目次>

  • 1. swift とは
  • 2. swift の特徴

1. Swift とは

SwiftはiOS、macOS向けアプリケーションの開発言語として
Appleが発表したプログラミング言語です。
swiftの発表後に登場したwatchOSやiPadOSにも対応しています。

iOS
-> iPhoneに搭載されているOS(オペレーティングシステム)
macOS
-> macに搭載されているOS(オペレーティングシステム)
世の中には、他にもWindows や Linux 、 Android などといった様々なOSが存在します。

2. Swift の特徴

swiftは、様々な人や企業が利用しています。
当たり前ですが、利用される多くの理由があるからです。

swiftには様々な特徴が存在するのでそれについて紹介していきます。

2-1. 静的型付き言語

静的型付き言語とは、コンパイル時などの実行前の段階で変数や定数の型を決定するプログラミング言語のことです。
もちろん実行するまで変数の型が決まっていない動的型付き言語も存在します。

もちろんどちらの言語体系にもメリット・デメリットは存在しますが、
今回は静的型付き言語のメリットのみ紹介します。

静的型付き言語の最大のメリットといえば,
誤った型の値の代入などがコンパイルエラーとして検出されるため、
実行時のエラーの一部を未然に防げるというところです。

var a: Int      //変数はInt型

a = 1000        //Int型の代入はコンパイルエラーは発生しない。
a = "こんにちは"   //String型の代入はコンパイルエラーが発生する。

上記のようなわかりやすいミスはほぼ起こりえませんが、
コードを書いている上で型の違いは稀に起こります。

実行後にエラーが発生し、アプリが強制終了してから型の不一致に気づくようでは、
機能が完成してから間違いに気づくようなものです。

型が違うだけで多くのコードを書き直さなければならない可能性も出てきます。
そうなると機能の再設計をしなければならない場合も...。

それを未然に防ぐことが出来るのが静的型付き言語の最大の特徴とも言えると思っています。

2-2. nilの許容性をコントロールすることが出来る

まずはじめに、nilとは何も値が存在しないことを示すものです。
別のプログラミング言語だとnullやnoneのような、別の名前で存在することもあります。

多くのプログラミング言語では、
値が存在しない状態や参照先が存在しない状態を表す際に使われてきました。

一方で、nilが存在するが故に実行時エラーを招いてしまうという問題もありました。
(nilは厄介なことに、コンパイル時にエラーが発生しませんでした。)

しかし、そのような問題を回避するために、
Swiftでは基本的にはnilを変数や定数に代入出来ないようになっています。

ですが、nilを許容する特別な型の変数や定数にのみnilを代入出来る仕様になっています。

nilを代入出来る型と、代入出来ない型の違いは次のようになります。

var a: Int    //nilを代入するとエラーが起きる

var b: Int!   //nilを代入してもエラーが起きない
var c: Int?   //nilを代入してもエラーが起きない 

このように型の最後に ! や ? を付けることによりnilを許容するInt型になります。
オプショナル型などと呼ばれるのですが、それについては後日記事にします。

この状態で、print()というメソッドを使用すると下記のようになります。

print(a)    //nilを許容出来ないInt型なのに値が入っておらずコンパイルエラーが発生する

print(b)    // nil
print(c)    // nil

一時的に変数の中に値を入れたくない場合などは ! や ? をつけておくのがいいかもしれません。

2-3. 型推理による簡潔な記述が可能

この機能は個人的にかなり便利だなと思いました。

swiftの変数や定数には、Int型やString型など様々な方があるのですが、
型推理という仕組みが導入されているため明示的に型を宣言する必要がありません。

つまり、どういうことかというと

var a: Int   // Int型
var b = 10   // Int型
var c = "こんにちは"  // String型

このように、aのように明示的にInt型と宣言しても平気ですし、
bのように10という値(Int型の値)のみを入れても自動的にInt型ということになります。

2-4. ジェネリクスによる汎用的な記述が可能

ジェネリクス・・・?
ワタシ、ヨコモジ、キライ・・・。

少し調べてみたのですが、
なんでも特定の型に制限されない汎用的なプログラミングを書くための機能だとか。

通常のプログラミングでは、関数の引数は
Int型やString型などの予め決められた型以外の引数を渡すことは出来ません。

しかし、ジェネリクスを使用したプログラミングなら
様々な型を引数として渡すことが可能になります。

今回は引数でもらった値をprintで出力する関数を作成したとします。

func printParameters<T>(_ x: T,_ y: T){
    print(x)
    print(y)
}

printParameters(1,22)     // 1 と 22 が表示されます。
printParameters("こんにちは","さようなら")     // こんにちは と さようなら が表示されます。
printParameters(10,"こんにちは")    // 型引数:T は同じ型を受け取るので Int型とString型を引数にするとエラーが発生する

このように、同じ関数でも様々な型を使用することが出来るのがジェネリクスになります。
また、_(アンダースコア)には引数名を使用しないという特別な意味があります。

2-5. Objective-Cと連携可能

iOS,macOS向けのアプリケーション開発には、今まではObjective-Cが採用されていました。

アプリケーションを開発するために使用するフレームワークは、
macOS向けのCocoa、iOS, watchOS, tvOS向けのCocoa Touch が提供されています。

Cocoaの大部分はObjective-Cで記載されているため、
Objective-Cと高い互換性を持っているswiftはCocoaの利用も可能となっています。

これまで使用してきたObjective-Cのコードはほぼ全てswiftで使用可能なので、
Objective-Cでサービスを作った企業もswiftへの段階的な移行は楽ですね!

これから新しい言語が出た時は、
swiftから楽に移行できる仕様になっていると嬉しいですね!

以上、最後まで読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOSアプリエンジニアがM1搭載Macを購入するにあたっての検討事項

こんにちは。iOSアプリエンジニアの @zrn-ns です。

今月上旬、Apple独自チップであるM1チップを搭載したMacが登場しましたね。

発表イベント前までは(どうせ性能はIntelには及ばないだろう...)なんて思っていたんですが、実際はとんでもないバケモノ。
お値段据え置きにもかかわらず、既存のMacの中でも最上位モデルにも匹敵するほどの処理性能を持っている上、消費電力もめちゃくちゃ少ない。これまでのMacの歴史を塗り替えてしまうようなものが出てきてしまいました。

普段iOS開発をしている僕としては、すぐにでも購入して試してみたい衝動に駆られたのですが、いかんせん3機種(MacBook Air/Pro, Mac mini)同時に発売されてしまったこともあり、どのモデルを買うか、どのようにカスタマイズするか、かなり迷いました?

今回はiOSアプリエンジニア視点で、どのモデルをどんな構成で購入するか検討していきたいと思います!

? そもそも今M1 Macを買うべきでないユーザ

そもそも、現段階ではまだM1のMacを買うべきではないユーザもいます。

それは、 利用予定のソフトウェアが、まだM1 Macで動作しない ユーザと、
外部ディスプレイを複数接続して作業することを想定している ユーザです。

既にご存知の方も多いとは思いますが、M1チップはこれまでのIntel製チップとアーキテクチャが異なるため、これまでMacで動作していたIntelチップ向けのソフトウェアが動作しなくなる可能性があります。

基本的には Rosetta21 というApple製のトランスレータを使うことで動作させることが可能ですが、全てのアプリが動作するわけではないようなので、その点については注意が必要です。

各種開発ツールのM1 Macへの対応状況については、 @shibukawa さんの記事( https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7 )がよくまとまっているようなので、事前に確認しておくことをおすすめします。
(もちろん今後1〜2年の間にM1チップ向けの対応が進んでいくにつれて、この問題は解消していくはずです。)

また、 Mac miniでは2枚まで、MacBook Air/Proでは1枚までしか外部ディスプレイを接続することができません。
例えばMacBook Air/Proに複数ディスプレイを接続して、クラムシェルモードで運用するような使い方はできないので、注意しましょう。
(来年以降に登場するMacでは改善してほしい?)

? 機種ごとの違い

? GPU性能

今回発表されたMacは、基本的に同じ性能のM1チップを積んでいます。
ただしMacBook Airのうち、 ストレージが256GBモデルは、GPUのコア数が他の機種よりも1つ少なくなっています (その分価格が抑えられています)。

エンジニアとしては高性能こそ正義?なので、基本的にはGPUコア数も多いものを購入したいですが、iOSアプリ開発用途であればそこまで性能差を感じることはないと思うので、ここは個人の好みだと思います。
(動画編集などを行いたい場合や、高解像度モニターに接続したい場合には、GPUコア数が多いものを買っておくのが無難そうですね)

? MacBookの方が省電力性能を体感できる

M1 MacはIntel Macよりも圧倒的に省電力のため、MacBook Air/Proではコンセントがない場所でも長時間の作業が可能です。

Appleの公称値では、MacBook Proは最大17時間のワイヤレスインターネット、MacBook Airは最大15時間のワイヤレスインターネットが可能と記載されています2

実際に使った人のレビューを見ると、MacBook Proでは実測8時間程度の動画編集作業に耐えられるようです。3

長時間外で作業する方にはMacBook Proのほうがいいかもしれませんが、正直8時間も電源なしで作業することなんてほとんど無いので、個人的にはAirでもProでもどちらでも良いかなと思います。

また、M1チップを搭載したMacはほとんど発熱しないらしいです。これまでのMacBookは膝の上に載せて作業するとすぐにアツアツになりましたが、今後はその悩みは解消しそうですね。

? MacBook Air/Proはバッテリーの劣化によるメンテナンスコストが発生する

MacBook Pro/Airはリチウムイオンバッテリーを積んでいるため、バッテリーの経年劣化が発生します。
バッテリー交換費用は13000円程度とそこまで高くはないですが、メンテナンス費を抑えたい人にはMac miniがおすすめです。

ただし、M1チップは「熱」が発生しづらいため、従来のMacBookほどリチウムイオンバッテリーの劣化がしづらい可能性があります。
そういう観点では、バッテリーの交換コストはそこまで心配しなくてよいのかもしれません。

? TouchBar搭載か

MacBook ProにはTouchBarが搭載されていますが、ほとんど使わないですし、個人的には考慮に入れなくていいと思います。早くProからも廃止してほしい
強いこだわりがある人はMacBook Pro一択ですね。

? TouchID搭載か

MacBook Pro/AirにはTouchIDが搭載されていますが、miniには搭載されていません。
スリープ解除時にパスワードの入力を省略できるのはもちろん、ブラウザでのクレジットカード番号を入れる際やAppStoreでの購入、設定の変更時など、色々な場面で本人確認の代替手段として利用できるので、あると結構便利な機能です。

⌨️ Mac miniはモニターやキーボード、マウス、トラックパッドなどの周辺機器の購入が必要

Mac miniにはキーボードやマウス、トラックパッドなどの周辺機器が付属しないので、別途購入が必要です。
MacBook Air/Proを買うことでこのあたりの費用を浮かせられますが、MacBook Air/Proを買う場合は別途USB-Cハブを購入する事になったりするので、割と周辺機器の購入費用はトントンだったりします。

? ディスプレイ接続枚数について

Mac miniは2枚まで外部ディスプレイを接続できるのに対し、MacBook Pro/Airは1枚までしか外部ディスプレイを接続できません。(一部例外あり4
家での作業がメインで、複数の大型ディスプレイで作業したい場合には、Mac miniを選ぶのが無難そうです。

? ファンレスかどうか

MacBook ProとMac miniは排気用のファンが搭載されていますが、MacBook Airはファンレスになっています。
ファンレスだと、高負荷な処理を行った際に排熱が追いつかずに処理性能が低下することがありますが、そもそもM1チップが発熱しにくいため、MacBook Proを使っていてもほとんどファンが回ることは無いらしいです。

そうなると、ファンの有無はあまり重要ではないということになります。

?️‍♀️ 重量やサイズ感について

MacBook AirとProの重量差は110g程度です。
人によって捉え方は違うかもしれませんが、本体重量の10%程度しか変わらないので、その差を体感する機会はほぼ無いと思います。

サイズについてもほぼ同一で、Airの方がパッと見薄く見えますが、厚い部分の差はほぼありません。(というか寧ろAirのほうが厚い?)

? カスタマイズについて

? メモリ8GBモデルか、16GBモデルか

最近はメモリ32GBや64GBが当たり前だったので、メモリが16GBまでしか選択できないことには不安に感じましたが、M1チップに搭載されている ユニファイドメモリ はこれまでのメモリの概念とは少し異なるもののようです。
またSSDもこれまでの2倍程度に高速化しており5、スワップが発生しても高速に動作するため、メモリ不足によりスピードの低下を体感することはほとんど無さそうです。

Xcodeでのビルド時間はやはり16GBの方が早いらしい6ですが、そこまで大きな差ではないので8GBでも十分使えるような気はしています。
しかしメモリは後から拡張できない部分なので、多少でも不安があるのであれば、後悔しないためにも16GBに拡張しておくことをおすすめします。

? SSDの容量について

iOSアプリ開発で使用する場合、プロジェクトの規模にもよるかと思いますが、基本的には1TB程度容量があると容量不足になることはほぼ無いと思います。
さらに言えば、こまめに不要なファイルを削除する人であれば、512GBでも十分かと思います。

自宅のメインPCとして使用する場合や写真や音楽、動画ファイルを保存したいなどの用途がある場合については1TBで収まらない可能性もありますが、その場合は外付けのSSDを別途購入する方がコスパは良いかと思います。

? 価格について

Apple公式サイトにて、下記のスペックでカスタムした場合の各Macの価格を比較してみます。

  • メモリ: 16GB
  • ストレージ: 1TB
機種 GPUコア数 金額(税抜) 金額(税込10%)
Mac mini 8 132,800円 146,080円
MacBook Air 13インチ 7 164,800円 181,280円
MacBook Air 13インチ 8 169,800円 186,780円
MacBook Pro 13インチ 8 194,800円 214,280円

ちなみに、メモリを8GBにすると -20,000円、ストレージを512GBにすると -20,000円になります。

その他検討材料

? 納期

AppleStoreでは2020/11/28(土)現在、カスタマイズしなければ12月上旬、カスタマイズすると12月中旬から下旬頃には配送してくれるようです。
Apple以外のオンラインショップ、量販店で購入すれば、ポイントももらえます。
カスタマイズ不要でとにかく早くほしい人は、量販店で購入するのもアリかと思います。

結論どのモデルを買うのか

この記事を書いたあと、MacBook Air13インチ(GPU8コア、メモリ16GB、SSD1TB)モデル を注文しました。

MacBook ProとAirを比較すると、Proのほうが優れているのはバッテリー持ちくらいで、その差に3.5万円を払うのは勿体ないかなと感じます。
MacBook AirとMac miniを比較すると、MacBook Airは3.5万円ほど高いですが、TouchIDが搭載されていますし、ふとしたタイミングで外に持ち出すことができます。

そして何より、Mac miniではM1チップの省電力性能を体感する事ができません! せっかくこのタイミングで買うのなら、バッテリー搭載のモデルを購入したいですよね。?

ただ、外に持ち出す予定がなく、複数の外部モニターを繋いで作業したい人には Mac miniがオススメかなと思いました。
もし急いでいない場合は、来年以降に登場するであろうモデルを待つのも良いかもしれませんね。


ちょっと出遅れた感じがありますが、少しでも皆さんのMac選びの参考になれば幸いです。
ではでは?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む