メインアプリケーションまたはApp Extensionターゲットでコードが実行されているかどうかを検出する方法

StackOverflow https://stackoverflow.com//questions/25048026

質問

アプリ内部の内部で実行している場合は、コード内から検出する方法がわかりますか?

アプリと拡張子との間のクラスを共有するアプリを持っています。アプリコードは[UIApplication sharedApplication]を使用していますが、これは拡張子内から入手できないため、コンパイルされません。

'sharedApplication'は利用できません:利用不可IOS(App Extension)

だから私は拡張子にいることを検出する方法が必要です。

役に立ちましたか?

解決

プリプロセッサマクロを使用できます。

プロジェクト設定では、トップバーのドロップダウンを使用して拡張ターゲットを選択します。 ENTER IMENTDESCRUシストを入力

それから:

  1. Build Settings
  2. をクリックします
  3. Preprocessor Macros
  4. の下にApple LLVM 6.0 - Preprocessingを見つける(または検索)
  5. 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`
.

私の共有ライブラリのために私は別のターゲットを作成しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top