メインアプリケーションまたはApp Extensionターゲットでコードが実行されているかどうかを検出する方法
-
21-12-2019 - |
質問
アプリ内部の内部で実行している場合は、コード内から検出する方法がわかりますか?
アプリと拡張子との間のクラスを共有するアプリを持っています。アプリコードは[UIApplication sharedApplication]
を使用していますが、これは拡張子内から入手できないため、コンパイルされません。
'sharedApplication'は利用できません:利用不可IOS(App Extension)
だから私は拡張子にいることを検出する方法が必要です。
解決
プリプロセッサマクロを使用できます。
プロジェクト設定では、トップバーのドロップダウンを使用して拡張ターゲットを選択します。
それから:
- をクリックします
Build Settings
- の下に
Preprocessor Macros
Apple LLVM 6.0 - Preprocessing
を見つける(または検索)- DebugとReleaseの両方のセクションで、
TARGET_IS_EXTENSION
を追加します。
あなたのコードで:
#ifndef TARGET_IS_EXTENSION // if it's not defined
// Do your calls to UIApplication
#endif
. 他のヒント
AppleのDocumentation / P>
Xcodeテンプレートに基づいて拡張子を作成すると、.APPEXで終わる拡張バンドルが表示されます。
だから、次のコードを使用できます。
if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) {
// this is an app extension
}
. プリプロセッサマクロは主に機能しますが、共有ライブラリでは機能しません(例えば、CocoApodsまたはShared Frameworks)。
代替として、次のコードを使用できます。
@implementation ExtensionHelpers
+(BOOL) isAppExtension
{
return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"];
}
@end
.
App Extensionのみに拡張子 ".appex"を持つので、bundle実行可能パスをチェックすることでこの作業。
拡張子ターゲットにプリプロセッサマクロを追加してから、クラス内の#ifdef
に確認してください。
SWIFT 5
let bundleUrl: URL = Bundle.main.bundleURL
let bundlePathExtension: String = bundleUrl.pathExtension
let isAppex: Bool = bundlePathExtension == "appex"
// `true` when invoked inside the `Extension process`
// `false` when invoked inside the `Main process`
. 私の共有ライブラリのために私は別のターゲットを作成しました。
所属していません StackOverflow