نقل سريع من برامج المراسلة الفورية - QIWI Android Wallet

مرحبا!

اسمي أليكس ، أنا مطور في QIWI.

TL؛ DR

كيفية التحويل من برنامج المراسلة مباشرةً إلى نموذج الدفع:

  1. في البيان نضع آخر ج فارغة من intent-filter نوع ACTION_VIEWو ACTION_DIALمع نظام "الهاتف".
  2. في النشاط ، ننقل إلى نموذج الدفع من خلال الرابط العميق الحالي ، ونثريه ببيانات من الأصل intent- “tel:XXXXX”



الربح : من خلال النقر على رقم الهاتف المميز في برنامج المراسلة ، يحصل الشخص على نموذج التحويل مع الحقل المكتمل لمستلم التحويل.
المكافأة : سأخبرك بجمال تمكين هذه الميزة ، دون التمكن من تغيير قائمة عوامل التصفية في البيان في وقت التشغيل.

لماذا؟


لنفترض أن الشخص لديه مهمة تحويل الأموال من أجل هدية عيد ميلاد جماعية. يمكن للطرف المتلقي اختيار خيارات تحويل ملائمة: التحويل إلى بطاقة أو محفظة إلكترونية أو تحويل مباشر إلى حساب أو أي شيء آخر. تقبل العديد من الشركات التي تقدم خدمات الترجمة رقم هاتف كمعرّف مستخدم ثانوي أو أساسي. من أجل تجنب التحويلات الخاطئة ، يمكن للمستلم نقل رقم هاتفه عبر رسالة نصية: البريد الإلكتروني أو المراسلة الفورية أو الرسائل القصيرة. تشير الرسالة أيضًا إلى النظام اللازم للترجمة.

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

نظرية


يتعرف العديد من الرسائل الفورية في الهواتف الذكية على أرقام الهواتف ويبرزونها في شكل ارتباط تشعبي. افتراضيًا ، يوجد تطبيق لمعالجة هذا النوع من الروابط على أي جهاز محمول باستخدام وحدة GSM. عادة ما يطلق عليه "الهاتف". في Android ، يتم الإعلان عن القدرة على معالجة رقم هاتف مشترك في AndroidManifest. أمثلة على التطبيقات: "الهاتف" ، Viber ، Skype. إذا اعترضت هذه الأحداث ، يمكنك تزويد المستخدم فورًا بقائمة بالإجراءات الممكنة برقم هاتف. في حالتنا ، سيكون هذا عرض تحويل من خلال QIWI Wallet.

نحن مهتمون بالأحداث ذات الأنواع Intent.ACTION_VIEW، Intent.ACTION_DIAL, Intent.ACTION_CALLمع مخطط الهاتف. حدثIntent.ACTION_CALLلديها قيود على سياسة أمان Android وتتطلب عملية التهيئة إذنًا من المستخدم بدءًا من إصدار Marshmallow الشامل. وفقا لرسل بحثنا باستخدام أكثر عمومية Intent.ACTION_VIEW، Intent.ACTION_DIAL.

هناك العديد من الأنواع المماثلة خصيصًا لهواتف الطوارئ ، ولكن من الواضح أن هذا ليس حالتنا. شكل الجسم المقصود هو "الهاتف: 12345678". لا يمكن معالجة هذا النوع من النية android.content.UriMatcher، لأن المضيف مفقود هنا. أسهل طريقة للتعامل مع هذا النوع من Uri هي سؤاله schemeSpecificPart والتحقق مما إذا كان رقم هاتف صالحًا.

يجب تحديد قائمة مرشحات intent في AndroidManifest ، فمن المستحيل تغييرها أثناء تنفيذ التطبيق. كيفية تعطيل هذه الميزة عن بعد؟ الخيار الأول هو صد طلب المستخدم في وقت فتح النشاط - برسالة أو إغلاق التطبيق فقط. من وجهة نظرنا ، هذه ليست أفضل تجربة مستخدم ، لأننا سنقاطع تدفق المستخدم في المنتصف. من الأفضل إذا لم نسمح لشخص باختيار تطبيقنا على الإطلاق ، إذا تم تعطيل الوظيفة. من السهل تعطيل المكون باستخدام قائمة intent-filter في وقت التشغيل ، وهذا لن يمنح المستخدم أي وعود كاذبة في واجهة النظام. عند استخدام PackageManager ، لاحظ أن التحقق من تضمين المكون غير موثوق به للغاية. من الأفضل enabled فرض علم المكون دون الاعتماد على حالته الحالية باستخدام القيمCOMPONENT_ENABLED_STATE_ENABLED و COMPONENT_ENABLED_STATE_DISABLED. يتم حفظ التغييرات التي تم إجراؤها من خلال PackageManager حتى يتم إلغاء تثبيت التطبيق من الجهاز.

ممارسة


من أجل تعطيل الميزة ، نحتاج إلى مكون Android لتعطيلها.
أسهل طريقة هي استخدام نشاط فارغ ، وهو ما سنفعله. إذا قررت استخدام الخدمة مع مجموعة مماثلة من فلاتر intent ، فراجع أدلة Google ، التي تنص على وجه التحديد "لا تعلن عن فلاتر intent لخدماتك" . يرجى ملاحظة أنه تم تعطيل المكون بشكل افتراضي:android:enabled="false"

  <activity
            android:name=".messengerP2P.view.MessengerP2PActivity"
            android:configChanges="orientation"
            android:label="@string/title_activity_messenger_p2_p"
            android:enabled="false"
            android:screenOrientation="portrait">
            <!-- Open shared telephone number as dial application -->
            <intent-filter

                android:label="@string/title_activity_messenger_p2_p">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.DIAL" />

                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="tel" />
            </intent-filter>
        </activity>

يعيد النشاط نفسه التوجيه ببساطة إلى طريقة الدفع من خلال الشهادات الحالية.

class MessengerP2PActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var phoneNumberFromDial: String? = intent?.data?.schemeSpecificPart
        phoneNumberFromDial?.let {
            if (ru.mw.utils.Utils
                    .isPhoneNumber(phoneNumberFromDial)) {
                val phoneNumberFromDialLink = PaymentActivity.getUriForProviderId(
                        resources.getInteger(R.integer.providerIdQiwiWallet).toLong(), null, null)
                    .buildUpon()
                    .appendQueryParameter(PaymentActivity.QUERY_PARAM_ACCOUNT, phoneNumberFromDial)
                startActivity(
                    Intent(Intent.ACTION_VIEW, phoneNumberFromDialLink.build()))
            }
        }
        finish()
    }
}

يمكن التحكم في علامة التمكين: android من خلال فئة المساعد هذه.

import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager

class MessengerP2PUtils {

    companion object {
        private const val componentName = "ru.mw.messengerP2P.view.MessengerP2PActivity"

        private fun switchMessengerP2P(enabled: Boolean = true, packageName: String, packageManager: PackageManager) {
            val compName = ComponentName(packageName, componentName)
            packageManager.setComponentEnabledSetting(
                compName,
                when (enabled) {
                    true -> PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                    else -> PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                },
                PackageManager.DONT_KILL_APP)
        }

        fun enableMessengerP2P(applicationContext: Context) {
            val packageName = applicationContext.packageName
            val packageManager = applicationContext.packageManager
            switchMessengerP2P(enabled = true, packageName = packageName, packageManager = packageManager);
        }

        fun disableMessengerP2P(applicationContext: Context) {
            val packageName = applicationContext.packageName
            val packageManager = applicationContext.packageManager
            switchMessengerP2P(enabled = false, packageName = packageName, packageManager = packageManager);
        }

        fun isMessengerP2PEnabled(packageName: String, packageManager: PackageManager): Boolean {
            val state = packageManager.getComponentEnabledSetting(ComponentName(packageName, componentName))
            return state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
        }

    }
}

لا يتم استخدام طريقة "isMessengerP2PEnabled" هنا للتحقق من الحالة الحالية للمكون ، حيث أنه أثناء الاختبار أنتج نتائج غير موثوقة. إذا قررت استخدامه ، تحقق بعناية من تشغيله في ظروف منطق الأعمال غير المتزامن وعند تنزيل التطبيق.

وقت تغيير قيمة العلم enabled ليس مهمًا للغاية ، لقد اخترنا اللحظة التي تم فيها تحميل تكوين علامات الميزات بالكامل.

لذلك عند النقر على رقم الهاتف في برنامج المراسلة ، يوجد مربع حوار لتحديد النظام ، تحتاج إلى تزويد المستخدم بتعليمات حول كيفية التخلص من الإعدادات الافتراضية intent-a "tel: XXXXX". على سبيل المثال: "إذا كان بإمكانك إجراء مكالمة فقط عند النقر فوق رقم ما ، فانتقل إلى إعدادات الهاتف الذكي → حدد الهاتف في قائمة التطبيقات → أعد تعيين الإعداد على" فتح افتراضيًا ".


إذا قمت بتعطيل المكون أثناء التنقل ، عندما يظهر للمستخدم مربع حوار النظام هذا ، فلن يحدث شيء سيئ. سيختفي العنصر المقابل على الفور من القائمة ، في حالتنا "تحويل الأموال".

سيبدأ سلوك مثير للاهتمام إذا قام المستخدم بمعالجة الروابط من خلال تطبيقنا بشكل افتراضي. للقيام بذلك ، يكفي النقر على العنصر "تذكر التحديد" أو "دائمًا". إذا قمت بتعطيل المكون ، فسيتم منح المستخدم اختيار التطبيق الذي سيستخدمه ، وفي البداية لن يكون هناك عنصر "تذكر التحديد". بعد تمكين الميزات ، سيتم استعادة التدفق بأكمله ، سيتم نقل المستخدم إلى التطبيق مباشرة.

استنتاج


جاءت فكرة هذه الميزة إلينا منذ فترة طويلة ، وتم إنشاء التذكرة الأصلية في عام 2017. لم تفقد الفكرة أهميتها حتى الآن ، لم أتمكن من العثور على تطبيق مصرفي بوظائف مماثلة. أطلقنا "تحويلات من الرسول" في 29 أبريل ، في اليوم الأول استفاد منها حوالي 8000 مستخدم فريد. إذا كانت مؤشرات العمل في المستقبل القريب ترضينا ، فسوف نطور هذه الميزة بشكل أكبر.

ما رأيك ، كم عدد النوايا الأكثر إثارة للاهتمام من Android الذين ينتظرون بسلام تطبيق أعمالهم؟

All Articles