UIActivityViewController مع HTML
سؤال
عندما أقوم بتمرير سلسلة تحتوي على محتوى HTML كعنصر صفيف إلى ملف UIActivityViewController initWithActivityItems
الطريقة لا تقدمه كـ HTML في وحدة التحكم "المشاركة" المحددة، ولكنها تقدم بدلاً من ذلك مصدر HTML (أي.الترميز بدلاً من تفسيره).
وبينما أستطيع أن أفهم سبب قيامه بذلك لأهداف المشاركة التي لا تدعم محتوى HTML، فإنه لن يفسره لأشياء مثل البريد الإلكتروني أيضًا، والتي تفعل ذلك (في السابق كان يتم ذلك عن طريق تعيين isHTML
الملكية ل YES
على ال MFMailComposeController
).
هل يجب أن أضيع وقتي في إنشاء ملف UIActivityItemProvider
الذي يُرجع محتوى مخصصًا بناءً على "نوع النشاط" أو أنه لا توجد طريقة حقًا للحصول على وحدة تحكم البريد المقدمة من قبل UIActivityViewController
لتفسير المحتوى على أنه HTML؟
المحلول
ما هي الأنشطة التي تتطلع إلى دعمها؟تعتمد أنواع الأنشطة على الخدمة، وهي جميلة محددة بوضوح.لا توجد طريقة تتيح للخدمات معرفة أن السلسلة عبارة عن نص عادي أو نص مرمز، على سبيل المثال - قد ترغب في لصق كود HTML عن قصد.
يمكنك دائمًا القيام بالأشياء بالطريقة القديمة ونسخ نص عادي وHTML إلى لوحة اللصق، أو الاتصال بمؤلف البريد مباشرة، أو أي شيء تحاول إنجازه.
نصائح أخرى
في الاختبار الذي أجريته، إذا كانت السلسلة تبدأ بـ "<html><body>" وتنتهي بـ "</body></html>"، فسيتم التعامل معها على أنها HTML.
إذا كنت تريد الحصول على نتيجة جيدة مع خدمات المشاركة التي لا تعتمد على HTML، فإنك تحتاج بدلاً من ذلك إلى استخدام كائن يقوم بتنفيذ UIActivityItemSource البروتوكول وإرجاع سلسلة HTML عندما يكون من -activityViewControllerPlaceholderItem:
و من -activityViewController:itemForActivityType:
إذا كان النشاط UIActivityTypeMail
و nil
خلاف ذلك.
ثانية UIActivityItemSource تقوم بإرجاع سلسلة مناسبة غير HTML من -activityViewControllerPlaceholderItem:
و من -activityViewController:itemForActivityType:
إذا لم يكن النشاط UIActivityTypeMail
(و nil
إذا كان كذلك) هو بقية اللغز.
أوصي بعدم استخدام كائن واحد للقيام بالوظيفتين، كما هو الحال في UIActivity
يحق للمحرك اتخاذ قرارات مختلفة بناءً على ما إذا كان العنصر النائب يبدو وكأنه HTML أم لا.
لم أجرب أيًا من هذه الأشياء، لكنها بدت معقولة لهدفك عندما كنت أتعرف على UIActivityViewController.
1) يمكنك كتابة مصدر HTML إلى ملف محلي، على سبيل المثال، my_mail_message.html
, ، ثم قم ببناء NSURL
كائن بهذا الملف، على سبيل المثال، [NSURL URLWithString:@"file://my_mail_message.html"]
, ، ثم استخدم ذلك NSURL
كائن كعنصر من عناصر activityItems
المصفوفة التي تتغذى عليها initWithActivityItems:applicationActivities:
.
2) إذا كنت تعرف المستلم المقصود، على سبيل المثال، foo@example.com
, ، ربما يمكنك بناء NSURL
كائن مع mailto
المخطط ومصدر HTML باسم body
, ، مثل ذلك: mailto:foo@example.com?body={my HTML source goes here}
.يجب عليك حذف الأقواس المتعرجة {}
.كما كان من قبل، يجب عليك بعد ذلك استخدام ذلك NSURL
كائن كعنصر من عناصر activityItems
مجموعة مصفوفة.
نأمل أن يعطيك هذا بعض الأفكار.
كل ما عليك فعله هو التأكد من أن السطر الأول من سلسلة HTML عبارة عن علامة.