تنصيب أضف الإدخال إلى ملف.plist لنظام iOS عبر Cordova config.xml




تنصيب cordova (11)

لقد استخدمت هذا المكون الإضافي لحل المشكلة ، وربما يمكن أن يساعدك في ذلك:

https://www.npmjs.com/package/cordova-plugin-queries-schemes

أنا جديد على Cordova CLI.

أحتاج إلى تنفيذ الخطوات التالية برمجيًا عبر Cordova.

  1. في المشروع .plist إضافة صف جديد
  2. أدخل القيم التالية في الصف الجديد:
  3. المفتاح : GDLibraryMode النوع : String (افتراضي) القيمة : GDEnterpriseSimulation

أعتقد أنني بحاجة إلى القيام بذلك في ملف config.xml في جذر مشروعي (أو ربما في مجلد "المنصات").

هل يمكن لأي شخص أن يشرح لي كيفية إضافة الإدخال عبر config.xml بحيث يتم إضافة الإدخال أعلاه في وقت التحويل البرمجي؟

أنا أستخدم كوردوفا 3.3.1-0.42 (أعرف أنها ليست الأحدث). لقد جعلت مشروعي بالفعل وكل شيء على ما يرام ، أنا فقط بحاجة لإضافة هذا الإدخال إلى pList.


يمكنك تعيين اسم العرض في قائمة التطبيقات عن طريق تحرير ios.json في دليل الإضافات مباشرةً.

ستؤدي إضافة ما يلي إلى قسم config_munge.files في ملف ios.json إلى القيام بالخدعة وسيتم الاحتفاظ بها حتى عند استخدام واجهة سطر الأوامر (CLI).

"*-Info.plist": {

    "parents": {
        "CFBundleDisplayName": [
            {
                "xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
                "count": 1
            }
        ]
    }
}

إليك مثال كامل


أنا أفضل ربط after_prepare لمشاريع أكبر أو إذا كان لديك ملحقات إضافية باستخدام نفس الأذونات. ولكن يمكنك دائمًا الذهاب بطريقة بسيطة:

ببساطة: - قم بإزالة البرنامج المساعد الذي يتطلب الإذن المرغوب - أضفه مرة أخرى مع - حفظ - في config.xml ، يحتوي المكون الإضافي الآن على متغير جديد مع وصف فارغ يمكنك ملء - الآن بناء دائرة الرقابة الداخلية مع - الإصدار و سيتم ضبطها.


ما عليك سوى اتباع الخطوات 1.

انتقل إلى Project navigator حدد الهدف انقر فوق خيار المعلومات من علامة التبويب خيار آخر هي إنشاء مرحلة إنشاء مرحلة سترى قيمة نوع المفتاح عند الإشارة إلى أي اسم مفتاح ستجد + و - انقر فوق علامة على Key: GDLibraryMode + كتابة الكتابة Key: GDLibraryMode في القسم الرئيسي Type:String in tyoe section Value:GDEnterpriseSimulation in value section


هذه هي الخطوات التي انتهى بها الأمر لتمكين تطبيقي من مشاركة الملفات عبر أي تيونز بين الأجهزة.

1. في تطبيقك ، انتقل إلى ملف config.xml الخاص بك. اكتب هذه القطعة في التكوين الخاص بك تحت علامة <platform name="ios"> .

 <config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
      <true/>
  </config-file>

2. ثم انتقل إلى أداة سطر الأوامر الخاصة بك واكتب: cordova التحضير

  1. ألغِ تثبيت تطبيقك وأعد تثبيته على جهازك ، وسترى تطبيقك يظهر على جهاز itunes لتتمكن من مشاركة أي ملفات بين أجهزتك.

بعض الأشياء ، تأكد من أن Cordova محدثة ، وأنك أضفت النظام الأساسي لـ ios.

npm install -g cordova

هذا الأمر يثبت cordova.

cordova platform add ios

يضيف هذا الأمر النظام الأساسي لـ ios.

ما يحدث هو عندما تقوم بتشغيل الأمر cordova prepare فأنت تستخدم Xcode SDK من Apple الذي تم إنشاؤه في مجلد النظام الأساسي / ios. هناك يمكنك رؤية ملف plist الذي تم إنشاؤه للتطبيق الخاص بك ، والذي تم تصنيفه كـ "yourApp-info.plist". هناك يمكنك رؤية المفتاح الجديد والسلسلة التي تم إنتاجها في تنسيق xml والتي تبدو كالتالي:

 <key>UIFileSharingEnabled</key>
 <true/>

أيضا كلمة تحذير ، أسقطت شركتي هذا الإطار الأيوني تطبيق في حضني قبل بضعة أسابيع (مع مهلة قصيرة حقا). يعتمد كل شيء أخبرك على أسابيع من التعلم. لذلك قد لا يكون هذا أفضل الممارسات ، ولكن آمل أن يساعد ذلك شخصًا ما.


يبدو أن solution TachyonVortex هو الخيار الأفضل ، ولكنه كان ينهار في حالتي. كانت المشكلة بسبب حقل NSMainNibFile فارغ لم يتم تحويله بشكل صحيح بواسطة حزمة NPM plist. في ملف .plist

    <key>NSMainNibFile</key>
    <string></string>
    <key>NSMainNibFile~ipad</key>
    <string></string>

يتم تحويلها إلى:

    <key>NSMainNibFile</key>
    <string>NSMainNibFile~ipad</string>

أصلحته بإضافة النص:

    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

يبدو النص البرمجي أخيرًا مثل (scripts / my-hook.js):

var fs    = require('fs');     // nodejs.org/api/fs.html
var plist = require('plist');  // www.npmjs.com/package/plist

var FILEPATH = 'platforms/ios/***/***-Info.plist';

module.exports = function (context) {

    var xml = fs.readFileSync(FILEPATH, 'utf8');
    var obj = plist.parse(xml);

    obj.GDLibraryMode = 'GDEnterpriseSimulation';
    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

    xml = plist.build(obj);
    fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' });

};

و config.xml:

<platform name="ios">
    <hook type="before_build" src="scripts/my-hook.js" />
</platform>

يبدو أن هذا ممكن الآن باستخدام config.xml: على الأقل بعض مؤلفي البرنامج المساعد الأساسيين يقولون ذلك. على سبيل المثال ، في المستندات الخاصة بـ Cordova Camera Plugin ، يناقشان المتطلبات الجديدة في iOS 10 التي تقوم بتوفير سلسلة رسائل الإذن بها في المخطط. لإنجاز ذلك ، يقترحون تنفيذ الأمر add plug with arguments ، وبالتالي:

cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."

ينتج عن ذلك أنك لن تحصل فقط على <plugin> يضاف إلى config.xml ، بل يحتوي على طفل <variable> :

<plugin name="cordova-plugin-camera" spec="~2.3.0">
    <variable name="CAMERA_USAGE_DESCRIPTION" value="My App would like to access your camera, to take photos of your documents." />
</plugin>

ما الذي يبدو بعد ذلك مرتبطًا بالمفاتيح الجديدة في info.plist ، وربما بطريقة ما تمرير القيم في وقت التشغيل؟

  <key>NSCameraUsageDescription</key>
  <string/>
  <key>NSPhotoLibraryUsageDescription</key>
  <string/>

سأكون كاذباً إذا قلت أنني أعرف بالضبط كيف يعمل ، لكن يبدو أنه يشير إلى الطريق.


أنا أستخدم ما يلي في الأيونية 3 بدون أي ملحق إضافي أو استيراد ، وأعتقد أن هذا قد يكون مفيدًا للآخرين:

<platform name="ios">
    <edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
        <string>Location is required so we can show you your nearby projects to support.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
        <string>Camera accesss required in order to let you select profile picture from camera.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
        <string>Photo library accesss required in order to let you select profile picture from gallery / library.</string>
    </edit-config>
</platform>

يمكنك استخدام الأداة المساعدة PlistBuddy داخل برنامج نصي docs لتعديل الملف * -Info.plist.

على سبيل المثال ، لدي البرنامج النصي التالي ضمن <project-root>/hooks/after_prepare/010_modify_plist.sh الذي يضيف خاصية القاموس ويضيف إدخالًا داخل هذا القاموس:

#!/bin/bash

PLIST=platforms/ios/*/*-Info.plist

cat << EOF |
Add :NSAppTransportSecurity dict
Add :NSAppTransportSecurity:NSAllowsArbitraryLoads bool YES
EOF
while read line
do
    /usr/libexec/PlistBuddy -c "$line" $PLIST
done

true

تأكد من جعل البرنامج النصي قابل للتنفيذ ( chmod +x ).

true في نهاية البرنامج النصي لأن PlistBuddy يعود مع رمز إنهاء الخطأ إذا كان المفتاح المضاف موجود بالفعل ، ولا يوفر طريقة للكشف عن وجود المفتاح بالفعل. سيقوم Cordova بالإبلاغ عن خطأ بناء في حالة إنهاء البرنامج النصي hook مع حالة خطأ. التعامل مع الخطأ بشكل أفضل أمر ممكن ولكن هناك ألم يجب تنفيذه.


إذا كنت تحاول تعديل .plist في المكون الإضافي لـ iOS الأصلي باستخدام علامة <config-file> في plugin.xml ، فإليك ما يجب عليك فعله:

  1. تأكد من أن .plist هو xml ، وليس .plist ثنائيًا! يمكنك استخدام plutil لتحويل ملف .plist إلى xml ، وارتكابه للتحكم في الإصدار.

    plutil -convert xml1 Info.plist

  2. تشير الإرشادات الخاصة بـ <config-file> إلى أن target= هو نسبة إلى مشروع xcode الذي تم إنشاؤه في platforms/ios/<project>/ ، ولكنني وجدت أنني أحتاج إلى إضافة حرف بدل إلى طريقتي لتشغيله:

    target="*/Resources/MyResources.bundle/Info.plist"

  3. إذا كنت تريد إضافة مفتاح في المستوى الأعلى من .plist ، فستحتاج إلى تعيين الأبوين مساويًا لاسم المفتاح ، ثم تضمين علامة <string> بالقيمة. سيؤدي استخدام <array> أو <dict> مثل أي عرض من الأمثلة إلى جعل هذه المفاتيح متداخلة تحت parent .

في ما يلي مثال كامل يعمل لي لإضافة العديد من خصائص المستوى الأعلى:

<platform name="ios">
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyDistribution">
        <string>Cordova</string>
    </config-file>
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyVersion">
        <string>3.2.0</string>
    </config-file>
</platform>

لا أعتقد أنه يمكنك القيام بذلك عبر تعديل config.xml مباشرة. على الأقل ، لم أر أي ذكر لهذا في المستندات: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html

أعتقد أنه يجب عليك إنشاء مكون إضافي ، نظرًا لأنه يمكن إدخال إدخالات plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

راجع قسم "عنصر ملف التكوين". في ما يلي تخمين لما plugin.xml القسم المناسب من الملف plugin.xml :

<platform name="ios">
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
    <dict>
        <key>GDLibraryMode</key>
        <string>GDEnterpriseSimulation</string>
    </dict>
</array>
</config-file>
</platform>

ثم يمكنك تثبيت المكون الإضافي: cordova plugin add <your plugin name or file location>





cordova-plugins