كيفية اكتشاف ما إذا كان الرمز قيد التشغيل في التطبيق الرئيسي أو هدف ملحق التطبيق؟

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

سؤال

هل يعرف أحد كيف تكتشف من داخل التعليمات البرمجية الخاصة بك إذا كنت تعمل داخل ملحق التطبيق؟

لدي تطبيق يشارك الفئات بين التطبيق والامتداد.يستخدم رمز التطبيق [UIApplication sharedApplication] ولكن هذا غير متاح من خلال الامتداد، لذلك لن يتم تجميع القول:

"التطبيق المشترك" غير متاح:غير متوفر لنظام iOS (ملحق التطبيق)

لذلك أحتاج إلى طريقة لاكتشاف وجودي في الامتداد واستخدام بديل لـ sharedApplication إذا كان هذا هو الحال.

هل كانت مفيدة؟

المحلول

يمكنك استخدام ماكرو المعالج المسبق:

في إعدادات المشروع، استخدم القائمة المنسدلة في الشريط العلوي لتحديد هدف الامتداد الخاص بك:enter image description here

ثم:

  1. انقر Build Settings
  2. بحث (أو بحث) Preprocessor Macros تحت Apple LLVM 6.0 - Preprocessing
  3. يضيف TARGET_IS_EXTENSION أو أي اسم آخر من اختيارك في كل من قسمي التصحيح والإصدار.

ثم في الكود الخاص بك:

#ifndef TARGET_IS_EXTENSION // if it's not defined
    // Do your calls to UIApplication
#endif

نصائح أخرى

مثل وثائق أبل يقول:

عندما تقوم بإنشاء ملحق بناءً على قالب Xcode، فإنك تحصل على حزمة ملحق تنتهي بـ .appex.

لذلك يمكننا استخدام الكود التالي:

if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) {
    // this is an app extension
}

سيعمل الماكرو المعالج مسبقًا في الغالب، لكنه لن يعمل في المكتبة المشتركة (على سبيل المثال.Cocopods أو الأطر المشتركة).

بدلا من ذلك يمكنك استخدام الكود التالي.

@implementation ExtensionHelpers

+(BOOL) isAppExtension
{
    return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"];
}

@end

يعمل هذا عن طريق التحقق من المسار القابل للتنفيذ للحزمة، حيث أن ملحق التطبيق فقط هو الذي له الامتداد ".appex".

يمكنك إضافة ماكرو معالج مسبق على هدف الامتداد ثم التحقق من ذلك باستخدام ملف #ifdef داخل صفك.

سويفت 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