# الأسئلة الشائعة حول iOS SDK

### الأسئلة الشائعة حول تكامل iOS

#### س: كيف يمكنني تثبيت Pushwoosh SDK في مشروع iOS الخاص بي؟
يمكنك دمج Pushwoosh SDK باستخدام إما Swift Package Manager أو CocoaPods.

#### س: كيف أقوم بتثبيت Pushwoosh SDK باستخدام Swift Package Manager؟
في Xcode، انتقل إلى قسم **Package Dependencies** وأضف الحزمة باستخدام عنوان URL التالي: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`.

#### س: كيف أقوم بتثبيت Pushwoosh SDK باستخدام CocoaPods؟
افتح `Podfile` الخاص بمشروعك وأضف السطر `pod 'PushwooshXCFramework'`. ثم، قم بتشغيل الأمر `pod install` في الطرفية.

#### س: ما هي الإمكانيات التي أحتاج إلى إضافتها إلى مشروعي لتمكين الإشعارات الفورية (Push Notifications)؟
في قسم Signing & Capabilities في إعدادات مشروعك، تحتاج إلى إضافة إمكانيات `Push Notifications` و `Background Modes`. عند إضافة `Background Modes`، تأكد من تحديد مربع `Remote notifications`.

#### س: ما هي الإمكانية الإضافية المطلوبة للإشعارات الحساسة للوقت (Time Sensitive Notifications)؟
إذا كنت تنوي استخدام Time Sensitive Notifications (iOS 15+)، فأنت بحاجة أيضًا إلى إضافة إمكانية `Time Sensitive Notifications`.

#### س: أين أحتاج إلى إضافة كود تهيئة Pushwoosh؟
يجب إضافة كود التهيئة إلى فئة `AppDelegate` الخاصة بك.

#### س: ما هو كود التهيئة الذي يجب أن أضيفه في AppDelegate الخاص بـ SwiftUI؟
يرجى الرجوع إلى [مثال كود Swift المقدم لدمج Pushwoosh في مشروع SwiftUI](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### س: ما هو كود التهيئة الذي يجب أن أضيفه في AppDelegate قياسي لـ Swift؟
يرجى الرجوع إلى [مثال كود Swift المقدم لدمج Pushwoosh في مشروع Swift قياسي](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### س: ما هو كود التهيئة الذي يجب أن أضيفه في AppDelegate لـ Objective-C؟
يرجى الرجوع إلى [مثال كود Objective-C المقدم لدمج Pushwoosh في مشروع Objective-C](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### س: ما هي المفاتيح التي أحتاج إلى إضافتها إلى ملف Info.plist الخاص بي؟
تحتاج إلى إضافة مفتاح `Pushwoosh_APPID` المعين إلى Application Code الخاص بك ومفتاح `PW_API_TOKEN` المعين إلى API Token الخاص بك في ملف `Info.plist` لتطبيقك.

#### س: ما هو الغرض من تتبع تسليم الرسائل؟
يدعم Pushwoosh تتبع أحداث التسليم للإشعارات الفورية باستخدام Notification Service Extension.

#### س: كيف أضيف Notification Service Extension إلى مشروعي؟
في Xcode، انتقل إلى **File** > **New** > **Target...**، اختر **Notification Service Extension**، واضغط على **Next**. أدخل اسمًا للهدف واضغط على **Finish**. عندما يُطلب منك التنشيط، اضغط على **Cancel**.

#### س: كيف أضيف Pushwoosh SDK إلى Notification Service Extension؟
أضف [مقتطف كود Swift أو Objective-C المقدم](/ar/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#add-pushwoosh-sdk-to-notification-service-extension) إلى ملف `.swift` أو `.m` الرئيسي لـ Notification Service Extension الخاص بك. يستخدم هذا الكود `PWNotificationExtensionManager` لمعالجة طلب الإشعار.

#### س: ما هو الغرض من App Groups؟
إمكانية App Groups مطلوبة للسماح لـ Notification Service Extension بالاتصال بالتطبيق الرئيسي.

#### س: كيف أقوم بتمكين App Groups للهدف الرئيسي و Notification Service Extension؟
لكلا الهدفين، انتقل إلى **Signing & Capabilities**، أضف إمكانية **App Groups**، وأنشئ مجموعة جديدة بالضغط على زر +. تأكد من أن اسم المجموعة يبدأ بـ `group.` واستخدم نفس اسم المجموعة لكلا الهدفين.

#### س: ما هي المفاتيح التي أحتاج إلى إضافتها إلى Info.plist الخاص بالهدف الرئيسي لـ App Groups؟
في `Info.plist` الخاص بالهدف الرئيسي، أضف مفتاح `PW_APP_GROUPS_NAME` واضبط قيمته على اسم مجموعة App Groups الخاصة بك.

#### س: ما هي المفاتيح التي أحتاج إلى إضافتها إلى Info.plist الخاص بـ Notification Service Extension؟
في `Info.plist` الخاص بـ Notification Service Extension، أضف مفتاح `PW_APP_GROUPS_NAME` (معين إلى اسم App Groups الخاص بك) ومفتاح `Pushwoosh_APPID` (معين إلى Application Code الخاص بك).

#### س: كيف أتحقق من تكامل Pushwoosh؟
بعد بناء وتشغيل مشروعك، انتقل إلى Pushwoosh Control Panel وأرسل إشعارًا فوريًا إلى تطبيقك. يجب أن ترى الإشعار يظهر على جهازك.

#### س: ما هما الاستدعاءان الرئيسيان لمعالجة الإشعارات الفورية في Pushwoosh SDK؟
الاستدعاءان الرئيسيان هما `onMessageReceived` و `onMessageOpened`.

#### س: متى يتم استدعاء `onMessageReceived`؟
يتم استدعاء طريقة `onMessageReceived` عند استلام إشعار فوري من قبل التطبيق.

#### س: متى يتم استدعاء `onMessageOpened`؟
يتم استدعاء طريقة `onMessageOpened` عندما يتفاعل المستخدم مع إشعار فوري ويفتحه.

#### س: كيف يمكنني الوصول إلى حمولة (payload) إشعار فوري تم استلامه أو فتحه؟
يمكن الوصول إلى حمولة كائن `PWMessage` (الذي يتم تمريره إلى استدعاءات `onMessageReceived` و `onMessageOpened`) من خلال خاصية `payload` الخاصة به.

#### س: كيف يمكنني تعيين معرف مستخدم (user ID) في Pushwoosh؟
استخدم طريقة `setUserId(_:)` لكائن `Pushwoosh.sharedInstance()`، ومرر معرف المستخدم كوسيط.

#### س: كيف يمكنني تعيين عنوان البريد الإلكتروني للمستخدم في Pushwoosh؟
استخدم طريقة `setEmail(_:)` لكائن `Pushwoosh.sharedInstance()`، مع توفير البريد الإلكتروني للمستخدم.

#### كيف يمكنني تعيين معلومات مستخدم إضافية كعلامات (tags) في Pushwoosh؟
استخدم طريقة `setTags(_:)` لكائن `Pushwoosh.sharedInstance()`، ومرر قاموسًا حيث تكون المفاتيح هي أسماء العلامات والقيم هي قيم العلامات المقابلة.

#### كيف يمكنني تتبع حدث مستخدم بسمات إضافية؟**
استخدم طريقة `postEvent(_:withAttributes:)` لـ `PWInAppManager.shared()`، مع توفير اسم الحدث (على سبيل المثال، `"login"`) وقاموس من السمات (على سبيل المثال، `"name"`، `"last_login"`).

#### س: كيف يمكنني تتبع حدث شراء مستخدم مع تفاصيل المنتج؟
استخدم طريقة `postEvent(_:withAttributes:)` لـ `PWInAppManager.shared()` مع اسم الحدث `"purchase"` وقاموس يحتوي على تفاصيل المنتج مثل `"product_id"`، `"product_name"`، `"price"`، و `"quantity"`.

#### س: كيف أقوم بإعداد مفوض (delegate) للتعامل مع عرض الوسائط الغنية (rich media)؟
في وحدة التحكم في العرض (view controller) أو فئة أخرى مناسبة، قم بالامتثال لبروتوكول `PWRichMediaPresentingDelegate` واضبط خاصية `delegate` لـ `PWRichMediaManager.shared()` على المثيل الممتثل الخاص بك.

#### س: كيف يمكنني تكوين نمط عرض الوسائط الغنية؟
استخدم كائن `PWModalWindowConfiguration.shared()` لتكوين خصائص مثل موضع النافذة المشروطة ورسوميات العرض/الإخفاء باستخدام طريقة `configureModalWindow(with:present:dismiss:)`.

#### س: ما هي المعلومات التي يمكنني الوصول إليها في طرق مفوض الوسائط الغنية؟**
توفر طرق المفوض الوصول إلى كائن `PWRichMedia`، الذي يحتوي على معلومات حول محتوى الوسائط الغنية، بما في ذلك `pushPayload` الخاص به. توفر طريقة `presentingDidFailForRichMedia:withError:` أيضًا كائن `Error` يصف الفشل.


### استكشاف الأخطاء وإصلاحها

<Aside type="caution">
لأغراض موازنة التحميل، قد نحتاج إلى تغيير نقاط نهاية API في تطبيقك. يحدث هذا تلقائيًا ويتم التعامل معه بواسطة SDK الخاص بنا. **يرجى التأكد من عدم وجود أي شيء في تطبيقك يمنع الوصول إلى أي عنوان URL يحتوي على \*.pushwoosh.com.**
</Aside>

<Aside type="note">
#### إذا كنت خلف جدار ناري (Firewall) أو جهاز توجيه WiFi الخاص بك يعمل كجدار ناري

إذا كان جهازك متصلاً بالإنترنت عبر WiFi، ولم تصل الرسائل إلى الجهاز، فيرجى **التأكد من أن منافذ APNs ليست محظورة بواسطة جدارك الناري.**\
غالبًا ما يكون مقدمو خدمة الإشعارات الفورية وأجهزة iOS وأجهزة كمبيوتر Mac خلف جدران نارية. لإرسال الإشعارات، ستحتاج إلى السماح بحزم TCP الواردة والصادرة عبر المنفذ 2195. ستحتاج الأجهزة وأجهزة الكمبيوتر التي تتصل بخدمة الإشعارات الفورية عبر **Wi-Fi إلى السماح بحزم TCP الواردة والصادرة عبر المنفذ 5223.**\
يمكن أن يتغير نطاق عناوين IP لخدمة الإشعارات الفورية؛ ومن المتوقع أن يتصل مقدمو الخدمة عن طريق اسم المضيف بدلاً من عنوان IP. تستخدم خدمة الإشعارات الفورية نظام موازنة تحميل ينتج عنه عنوان IP مختلف لنفس اسم المضيف. ومع ذلك، يتم تعيين كتلة العناوين 17.0.0.0/8 بالكامل لشركة Apple، لذا يمكنك تحديد هذا النطاق في قواعد جدارك الناري.
</Aside>

#### س: خطأ "Your provisioning profile does not have APS entry"

إذا رأيت رسالة الخطأ "Your provisioning profile does not have APS entry."، فتأكد من أن ملف تعريف التوفير (provisioning profile) الخاص بك متوافق مع الإشعارات الفورية ويحتوي على سلسلة `aps-environment` بقيمة `production` أو `development`. أسهل طريقة للتحقق هي فتح ملف تعريف التوفير المحمول في أي محرر نصوص والبحث عن سلسلة `aps-environment`. يجب أن تكون موجودة.

إذا كانت موجودة، واستمر ظهور الخطأ، فهذا يعني أن XCode لا يزال يختار ملف تعريف "غير متوافق مع الإشعارات الفورية". يرجى التأكد من أنك توقع بالملف الصحيح - أحيانًا إذا كان لديك ملفا تعريف لنفس App ID، فإن XCode يخلط الأمور ويوقع بالملف القديم.

الخطوات الموصى بها هي:

1. [إزالة](https://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5) جميع ملفات تعريف XCode؛
2. إضافة ملف التعريف الجديد والوحيد؛
3. إعادة بناء التطبيق.

#### س: كيف يبدو رمز الإشعار الفوري لـ iOS و hwid؟

رموز الإشعارات الفورية لأجهزة iOS هي سلاسل نصية مكونة من 64 رمزًا سداسيًا عشريًا. مثال على رمز الإشعار الفوري:\
`03df25c845d460bcdad7802d2vf6fc1dfde97283bf75cc993eb6dca835ea2e2f`\
تأكد من أن رموز الإشعارات الفورية لـ iOS التي تستخدمها عند استهداف أجهزة معينة في طلبات API الخاصة بك تكون **بأحرف صغيرة**.

يستخدم Pushwoosh IDFV كـ HWID للجهاز. لاحظ أنه قد يتغير في حالة قيام المستخدم بإعادة تثبيت جميع التطبيقات من بائع معين.

`CBAF8ED1-17FB-49A3-73BD-DC79B63AEF93`

#### س: كيف يمكنني تشغيل وإيقاف اللافتة (banner) أثناء تشغيل تطبيقي؟

بشكل افتراضي، يعرض أحدث إصدار من iOS SDK الخاص بنا لافتة الإشعار عندما يكون التطبيق قيد التشغيل في المقدمة.\
يمكنك التحكم في هذا السلوك عن طريق تغيير العلامات التالية في Info.plist:

العلامة `Pushwoosh_ALERT_TYPE` – نوع سلسلة نصية، القيم هي:

* `BANNER` – القيمة الافتراضية، تعرض تنبيه لافتة داخل التطبيق
* `ALERT` – تنبيه إشعار
* `NONE` – لا تعرض الإشعارات عندما يكون التطبيق في المقدمة

#### س: كيف أحصل على رمز الإشعار الفوري لجهاز iOS الخاص بي لاستخدامه في الأجهزة التجريبية (Test Devices)؟

للحصول على رمز الإشعار الفوري لجهاز iOS الخاص بك،

1. افتح Xcode => Devices & Simulators؛
2. قم بتوصيل الجهاز التجريبي بجهاز الكمبيوتر الخاص بك؛
3. حدد جهازك المتصل في قائمة الأجهزة على اليسار؛
4. انقر فوق زر Open Console.

<img src="/ios-push-notifications-ios-faq-1.webp" alt=""/>

قم بتشغيل التطبيق الذي تحتاج إلى رمز الإشعار الفوري الخاص به، وحدد موقع رمز الإشعار الفوري لجهازك المكون من 64 حرفًا سداسيًا عشريًا في سطر "Registered for push notifications":

<img src="/ios-push-notifications-ios-faq-2.webp" alt=""/>

#### س: لماذا لا يتم مسح الشارات (badges) بعد إلغاء تثبيت تطبيقي وإعادة تثبيته في فترة قصيرة؟

هذا سلوك متوقع - تتم معالجة الشارات بواسطة iOS نفسه ويتم تخزين قيمها في تفضيلات التطبيق، والتي لا تتم إزالتها على الفور عند إلغاء تثبيت تطبيقك. تظل قيمة الشارة هناك لبعض الوقت في حالة إعادة التثبيت الفوري، مما يؤدي إلى عرض نفس الشارات بعد إعادة تثبيت التطبيق.