كيفية اكتشاف ما إذا كان الرمز قيد التشغيل في التطبيق الرئيسي أو هدف ملحق التطبيق؟
-
21-12-2019 - |
سؤال
هل يعرف أحد كيف تكتشف من داخل التعليمات البرمجية الخاصة بك إذا كنت تعمل داخل ملحق التطبيق؟
لدي تطبيق يشارك الفئات بين التطبيق والامتداد.يستخدم رمز التطبيق [UIApplication sharedApplication]
ولكن هذا غير متاح من خلال الامتداد، لذلك لن يتم تجميع القول:
"التطبيق المشترك" غير متاح:غير متوفر لنظام iOS (ملحق التطبيق)
لذلك أحتاج إلى طريقة لاكتشاف وجودي في الامتداد واستخدام بديل لـ sharedApplication
إذا كان هذا هو الحال.
المحلول
يمكنك استخدام ماكرو المعالج المسبق:
في إعدادات المشروع، استخدم القائمة المنسدلة في الشريط العلوي لتحديد هدف الامتداد الخاص بك:
ثم:
- انقر
Build Settings
- بحث (أو بحث)
Preprocessor Macros
تحتApple LLVM 6.0 - Preprocessing
- يضيف
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`
بالنسبة لمكتبتي المشتركة، قمت بإنشاء هدف منفصل تم تعيين علامة ملحقات التطبيق الخاصة به على نعم، واستخدمت وحدات الماكرو للمعالج المسبق ضمن إعدادات الإنشاء لهذا الهدف المحدد.