有没有一种方式可以在Android和IOS上后台发送短信?

9
我想开发一个主要功能依赖于发送短信的应用程序。以前我是使用Android(本地)进行开发,但现在我使用React-Native来同时为iOS和Android制作应用程序。
在Android中,如果您获得用户权限,则可以在后台发送短信。但是在搜索过程中,我找不到在React-Native中实现此功能的方法。我了解到苹果不允许应用程序这样做。我想知道是否有任何方式可以在Android和iOS上在后台发送短信。
我已经看过的库会打开电话短信界面(填写号码和短信正文),然后用户必须按发送按钮(我想删除此步骤,即应用程序自动发送短信)。
最终,是否有任何方式(库等)可以在Android和iOS上在后台发送短信而无需打开短信界面?

4
在 iOS 上,想要在没有用户交互的情况下发送短信的唯一方法是使用外部提供商(例如 Twilio);但是此时短信将会从您的服务器号码发送,而非用户的号码。 - Paulw11
2个回答

7
在Android上是可以实现的。我也在自己的项目中实现了这个功能。按照以下步骤进行操作:
1. 创建DirectSmsModule 在你的android->app->src/main->java/com/yourProject文件夹中,与MainActivity.java文件相邻创建一个Java类,该类需要继承ReactContextBaseJavaModule类。
//DirectSmsModule.java
package com.security_notifier;
 
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;
import android.telephony.SmsManager;

 
public class DirectSmsModule extends ReactContextBaseJavaModule {
 
    public DirectSmsModule(ReactApplicationContext reactContext) {
        super(reactContext); //required by React Native
    }
 
    @Override
    //getName is required to define the name of the module represented in JavaScript
    public String getName() {
        return "DirectSms";
    }
 
    @ReactMethod
    public void sendDirectSms(String numbers, String msg) {
        try {    
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(numbers, null, msg, null, null);   
        } catch (Exception ex) {
            System.out.println("couldn't send message.");
        }
    }
}

2. 注册 DirectSmsModule

注册时,您应该创建一个新的包实现 ReactPackage 接口。在 DirectSmsModule 旁边创建一个 DirectSmsPackage:

//DirectSmsPackage.java
package com.security_notifier;
 
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.security_notifier.DirectSmsModule;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class DirectSmsPackage implements ReactPackage {
 
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        //this is where you register the module
        modules.add(new DirectSmsModule(reactContext));
        return modules;
    }
}

3. 注册 DirectSmsPackage

您需要正确注册新的 package。打开 MainApplication.java 并按照以下方式进行修改:

package com.security_notifier;

import android.app.Application;
import android.util.Log;

import com.facebook.react.PackageList;
import com.facebook.hermes.reactexecutor.HermesExecutorFactory;
import com.facebook.react.bridge.JavaScriptExecutorFactory;
import com.facebook.react.ReactApplication;
import com.tkporter.sendsms.SendSMSPackage;
// import com.tkporter.sendsms.SendSMSPackage;
import com.oblador.vectoricons.VectorIconsPackage;
import com.reactnativecommunity.netinfo.NetInfoPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.List;


import com.facebook.react.shell.MainReactPackage;

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      @SuppressWarnings("UnnecessaryLocalVariable")
      List<ReactPackage> packages = new PackageList(this).getPackages();
      // Packages that cannot be autolinked yet can be added manually here, for example:
      // packages.add(new MyReactNativePackage());

      packages.add(new DirectSmsPackage());

      return packages;
    }

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);

  }
}

4. 从javascript调用sendDirectSms方法

在您的javascript文件中:

import React from 'react';
    import {NativeModules} from 'react-native';
    var DirectSms = NativeModules.DirectSms;

export default class App extends React.Component {
       sendDirectSms() {
          DirectSms.sendDirectSms('0935...', 'This is a direct message');
      }
      render() {
        return (
                <View>
                    <TouchableOpacity onPress={() => this.sendDirectSms()}>
                        <Text>send SMS</Text>
                    </TouchableOpacity>
                </View>
               );
          }
}

5. 设置用户权限

  • 对于 API 级别低于 23 的版本:

    请在 manifest.xml 文件中添加所需的权限:

<uses-permission android:name="android.permission.SEND_SMS"/>
  • 针对API 23及以上版本

如果设备运行的是Android 6.0 (API level 23)或更高版本,并且应用的targetSdkVersion是23或更高版本,则用户在安装时不会收到任何关于应用权限的通知。您的应用必须在运行时要求用户授予危险权限。当您的应用请求权限时,用户会看到一个系统对话框,告知用户您的应用正在尝试访问哪个权限组。对话框包括拒绝和允许按钮。我们在javascript文件中处理权限请求:

async sendDirectSms() {
    try {
        const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.SEND_SMS,
            {
                title: 'YourProject App Sms Permission',
                message:
                'YourProject App needs access to your inbox ' +
                'so you can send messages in background.',
                buttonNeutral: 'Ask Me Later',
                buttonNegative: 'Cancel',
                buttonPositive: 'OK',
            },
        );
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
            DirectSms.sendDirectSms('0935...', 'This is a direct message');
        } else {
            console.log('SMS permission denied');
        }
    } catch (err) {
        console.warn(err);
    }
}

完成后,请运行react-native run-android。

参考: https://blog.usejournal.com/sending-direct-sms-in-react-native-android-d902d6bf1f04

在iOS上,唯一可以在没有用户交互的情况下发送短信的方法是使用外部提供商,例如Twilio; 但是消息将来自您的服务器号码而不是用户。 @Paulw11已在您的问题中进行了评论。


你知道我怎么用Expo做这个吗? - olawalejuwonm
不,实际上我从未使用过Expo。 - Md. Robi Ullah

0

发送后台短信无需编写大量代码。您只需要导入这个库(react-native-sms-x),就可以开始使用了。

安装

npm install react-native-sms-x --save

Android设置 1. 在您的android/settings.gradle文件中,进行以下添加:

include ':react-native-sms-x'
project(':react-native-sms-x').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sms-x/android/app')

2. 在你的 android/app/build.gradle 文件中,将 ':react-native-sms-x' 项目添加为编译时依赖项:

...
dependencies {
    ...
    compile project(':react-native-sms-x')
}

3.将MainApplication.java文件更新如下:

import com.facebook.react.ReactApplication;
...
import com.someone.sendsms.SendSMSPackage; // <--- add here! 


public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    protected boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
          new SendSMSPackage()     // <--- add here! 
      );
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
      return mReactNativeHost;
  }
}

4. 在你的 AndroidManifest.xml 文件中,添加一个用户权限以发送短信。

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

请注意:在iOS设备上无法在后台发送短信。
有关该项目的更多细节,请查看此处:https://www.npmjs.com/package/react-native-sms-x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接