Mac catalyst 対応してみた いまだに object-C


Object-C

いまだに初心者Object-Cです。しかもコピペ野郎でございます。
最近Object-Cの情報も少なくなってきまして、困りごとやサンプルを調べてもどこもSWIFT,SWIFTだらけで困っております。今回のcatalyst対応も情報が少なく、ましてやObject-Cとなると壊滅的です。しぶしぶswift code 見ながら Object-Cならこーかな?あーかなと苦戦しました。
swiftもバージョンによる言語仕様および対応を落ち着きだしたので、そろそろ乗り換えないとまずいかなって思っておりますが、いまだにオブジェクト指向うんたらのどこがすばらしいのか理解できてないまま乗り換えて良いのか悩んでおります。

流行に周回遅れっていうのも・・・・・・・・・・・・・・・ございます。

catalyst って何?

APP登録してると、M1でiosのソフトがそのまま動くらしい事を聞いてくるので、調べて行くと catalyst たるキーワードがでてきました。(??????? 知らんかったわー)
いまさらですが、Appleさんが 「iPad AppのMacバージョンを創作しましょう。」と iPad の Appを ctalystでビルドしたら、なんとMacで動くようになるという代物です。つまり、Xcodeのコンパイルの設定を変えて iPad用appを Mac用にしてくれるという代物です。
これに気づかず、Appストアには1つのコードで提出しないといけないと思って、一つのプロジェクトでiPhone,iPad,Mac(catalyst)3つ混在のコードコード作成していました。(バカ)IDも別物用意するから別物として作成した方が楽かなと思います。でもM1ではAPPがそのまま動作するからでしょうか catalystは思いの外、盛り上がってないように見えるのですが・・・・

バージョン

いまのバージョンは、Ver14らしいがバージョン13からはじまっています。
で・・・・このバージョンって何か調べてみるとどうも バージョン番号は、iosと同じ番号で macOSのバージョンと紐付けされているようです。
catalina → Ver13
BigSure → Ver14
のようであるがXcodeがios13対応なら Ver13 ios14対応なら Ver14 である。

注意
1.macOs 10.15以上でないとだめらしい。
2.Xcode 11以上でないとだめらしい
※ macOs と Xcode で使用できるバージョンがきまるようです。

コンパイル

  1. プロジェクトファイルのTARGETS > Generalにiphoneとかipadとか選ぶチェックボックスが在るのですが、そこにMacが追加されておりますのでここをチェック
  2. 実機で実行する場合にデバイスを選択するのですが、そこにMacが出てきますので選択
  3. ビルドする

いろいろな問題

障害1

まず、コンパイルで謎の CodeSign failed with a nonzero exit code 発生してダメだよと怒られる。
ググりまくった結果 多くはキーチェーン関連でしたが効果なし、「効かん効かぬぞー」
何しても全く効果なしで凹凹凹凹んでました「俺のプログラムは糞すぎて Catalystさんでは理解できないらしい。だめかよーしくしく」
2日後に ひょんな事から対策内容見つけました。

https://stackoverflow.com/questions/52421999/xcode-10-command-codesign-failed-with-a-nonzero-exit-code

キター 「天は我に味方したー。✊」

障害2

エラーでカテゴリー云々怒られる
Macさんではカテゴリーを設定しないといけないようです。
Info.plistに追加(この場合 video)

<string>public.app-category.video</string>

障害3

ビルドができましたので実行します。 「いきまーす」
どっかん いきなり即死  
「うそ!そのままで動くんとちゃうんとちゃうん?」
冷静に見ていきます。

ipad対応であれば、SpritVewやSlideOverで

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

の処理をしていると思うのだが、タイミングがiPhone/iPadと違う
iPhone/iPadは

 - (void)viewDidAppear:(BOOL)animated

後で呼ばれていたが、Macさんは前で呼ばれるのである。(正確には、後ろになる場合もあった)

 - (void)viewWillAppear:(BOOL)animated

 - (void)viewDidLoad

にすれば良いみたいです。

下手にSplitViewやSlideOver対応しているのが仇となりました。

ジャーン 「こいつ動くぞ」

障害4

動作したが、なんか画面のバランスが変です。高さが・・・・
画面レイアウトが思ってたのと違う。「同じ画面になるんちゃうん?」
プログラムはiPad用なので Catalyst 専用処理が必要のようです。

#if TARGET_OS_MACCATALYST
     〜 Catalyst 専用処理 〜 
#endif

障害5

プライバシー設定お願い
たしかにMacでは、プライバシーの設定お願いを見た事なかったので「どのようになさるのかAPPLEさん。とくと見てみよう」
・・・・・・・・・・・・・・・・・・

なんもしてくれてませんでした。「くー甘かったー (ToT)/」

iosでは設定>APP名 にジャンプすればよかったが
Macのプライバシーは、システム環境>セキュリティ&プライバシーにあるので飛び先変更

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL: url
                                            options:@{}
                                            completionHandler:nil];

の url部分です。

https://www.fixes.pub/program/334243.html
ここの 参照用のURLのリスト参考に変更

障害6

iosにはないのだが Mac には画面の一番上にAPPのメニューバーがあって必要ない表示が出現してる。「iPadにそんなメニューないやん」これはじゃまですね。

#if TARGET_OS_MACCATALYST
    -(void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder
    {
        [super buildMenuWithBuilder:builder ];
        if( builder.system == UIMenuSystem.mainSystem )
        {
            [builder removeMenuForIdentifier:UIMenuFile ];
            [builder removeMenuForIdentifier:UIMenuEdit ];
            [builder removeMenuForIdentifier:UIMenuView ];
            [builder removeMenuForIdentifier:UIMenuFormat ];
            [builder removeMenuForIdentifier:UIMenuWindow ];
            [builder removeMenuForIdentifier:UIMenuHelp ];

            [builder removeMenuForIdentifier:UIMenuPreferences ];
            [builder removeMenuForIdentifier:UIMenuServices ];
            [builder removeMenuForIdentifier:UIMenuHide ];
        }
    }
#endif

こいつを AppDelegate.m に追加する。

viewController.mに追加しても動かなかった

障害7

元々 ios用APPなのですが、Mac CataLyst用で登録すると
APP登録でエラー 「ここは一発で通してくれよー」
そこはお厳しいAPPLEさん そんな簡単なわけないやんと印籠渡される。
フルボッコでめっさ凹んだ。
ぐぐってっぐぐってねてぐぐってたたいてたたいてねて
ガーガーのゴーゴーで かなり記憶うすいのだけれども

  1. iosアプリ用の Identifiers で ターゲットAPPの Capabilities にある Catalystのチェック追加

  2. Mac用 profile作成 Configration を Mac Catalyst with an associated App ID で登録

  3. 元々 ios用で使用していたprofile の certificates が iOS Distribution ですが これを
    Distribution にする。

で登録申請できました。
「ふぅー」

感想

最低なのは自分ですがこれぐらいの修正は必要と思います。
何かの助けになれば幸いです。

後日、なんとか Ready for Sale にこぎつけました。

ほんと、ネットには Object-Cの情報少ないですね。流行りのSWIFTでも昔のような活発な Deepな情報も少なくなってきてますね。さみしいです。
ざざーと記憶を頼りにメモった情報でした。