7

我们必须编写基于 OTP 的身份验证。我见过一些应用程序,比如我银行的应用程序,当它发送 OTP 时,它也会立即快速弹出刚刚到达的 SMS,这样我就可以在离开应用程序的情况下看到 OTP。我只是记住了这个数字,关闭弹出窗口,然后继续在该应用程序中登录。

他们是怎么做到的?是否有一些我应该查看的 iOS/Android 规范,它允许我们类似地弹出 OTP,而无需用户进入 SMS 屏幕,然后返回我们的应用程序?谢谢!

编辑:我有非常有用的 Android 建议。现在正在寻找这些建议的 iOS 变体。了解 iOS 有更严格的沙盒限制,所以“监听器”可能更复杂?

4

3 回答 3

11

这是一步一步的描述,以实现您的要求

  1. 在 AndroidManifest 中声明接收者

    <receiver android:name=".IncomingSms">   
     <intent-filter>
          <action android:name="android.provider.Telephony.SMS_RECEIVED" />
      </intent-filter>
    </receiver>
    

    2 在 AndroidManifest 中授予读取短信权限

     <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
     <uses-permission android:name="android.permission.READ_SMS" />
    

AndroidManifest.xml 文件的完整代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.androidexample.broadcastreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.androidexample.broadcastreceiver.BroadcastNewSms"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.androidexample.broadcastreceiver.IncomingSms">   
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS" />


</manifest>

IncomingSms.java 文件的完整代码:

public class IncomingSms extends BroadcastReceiver {

    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();

    public void onReceive(Context context, Intent intent) {

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    String senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();

                    Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);


                   // Show Alert
                    int duration = Toast.LENGTH_LONG;
                    Toast toast = Toast.makeText(context, 
                                 "senderNum: "+ senderNum + ", message: " + message, duration);
                    toast.show();

                } // end for loop
              } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);

        }
    }    
}

在您的活动中注册上述广播接收器,您将获得输出

于 2014-07-30T10:43:31.917 回答
1

对于android,您需要使用@rushabh 指出的SMSListener。你可以在这里查看一个很好的例子

于 2014-07-30T11:04:38.813 回答
1

为您的应用完成提及任务的一些技巧。
步骤 - 1 创建一个登录活动,其中包含必要的字段,如用户名、密码和 otp 以及登录按钮。

步骤 - 2 当用户填写用户名和密码时,进行 Web 服务调用。使用输入参数(用户名和密码)验证值,如果 true 意味着发送您的 OTP 号码作为响应,否则响应错误消息。

如果响应是数字,则步骤 -3 意味着为 Pop 窗口创建 AlertBuilder 以在同一活动中显示您的 OTP 编号。

第 4 步用户在登录活动本身中看到了 OTP,并在 opt 区域(即 EditText)中输入了 OTP。

步骤 - 5 当用户点击登录按钮时,验证 OTP 值。并继续下一个活动。

于 2014-07-30T11:09:57.023 回答