【XCode】AppExtensionのバージョンを本体アプリのバージョンと一致させるスクリプト

仕事で現在NotificationServiceExtensionについて調べながら作業をしています

そこでこんな情報を得ました

アプリ本体のバージョンとExtensionのバージョン異なると
ストア申請時のメールにて怒られるらしい

そこで、ビルド時のRunScriptにてバージョンを合わせるようにしてやろうと考えて実装をしてみました

versionNumber="$MARKETING_VERSION"

buildNumber="$CURRENT_PROJECT_VERSION"

/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $versionNumber""{extensionの名前}/Info.plist"

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber""{extensionの名前}/Info.plist"


上記をアプリ本体側の「Build Phase」の先頭に「RunScript」を追加して登録します
ビルドを実行するとアプリ本体→Extensionの順でビルドが行われるので、Extension側実行前に書き換えが終わります

StackOverFlowとかでXCode10までの手法だと
Extension側にスクリプトを登録して本体側からバージョンを取得するやり方ばかりでしたが
XCode11になってからInfo.plistから表記場所が変わったことにより
めっちゃめんどくさいことになってしまったため、本体からならさくっと取れるので順番を逆にしてやりました


【XCode】RemoteNotificationを受信し、バナーをタップしたときのイベント

UIApplicationDelegateの

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler


基本的にはこのメソッドのイベントが発生する

しかし、これだけではアプリがフォアグラウンドになっていると通知バナーがでない(メソッドは実行される)

フォアグラウンド対策のために


UNUserNotificationCenterDelegateの

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler


これを実装すると

フォアグラウンド時は上記が呼ばれ、最初のメソッドは実行されなくなる

バックグラウンド時は最初のメソッドが実行される


んだけどもあわせて

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler


これを実装していると、最初に説明したメソッドが一切処理されなくなる


気をつけよう