无论如何,是否可以在后台为 Android 和 IOS 发送短信?

CTr*_*leC 7 android ios react-native react-native-ios

我想做一个应用程序,它的主要功能取决于发送短信。在我开发 android(native) 之前,但现在我使用 React-Native 为 IOS 和 Android 制作它。

在 android 中,如果您获得用户许可,则可以在后台发送短信。但是在通过网络搜索后,我找不到在 react-native 中做到这一点的方法。我读到苹果不允许应用程序这样做。我想知道是否可以在后台为 Android 和 IOS 发送短信。

我已经看过的库,打开手机短信界面(填充号码和短信正文),然后用户必须按下发送按钮(我想删除这一步。我的意思是应用程序自动发送短信)。

毕竟,有没有(库,...)可以在后台发送短信而无需打开 android 和 ios 的短信界面?

Md.*_*lah 7

在安卓上,这是可能的。我也在自己的项目中实现了。请按照给定的步骤操作:

\n

1.创建DirectSmsModule

\n

在您的android-> app-> src/main-> java/com/yourProject中MainActivity.java 旁边创建一个扩展ReactContextBaseJavaModule类的 java 类。

\n
//DirectSmsModule.java\npackage com.security_notifier;\n \nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.bridge.ReactContextBaseJavaModule;\nimport com.facebook.react.bridge.Callback;\nimport com.facebook.react.bridge.ReactMethod;\nimport com.facebook.react.uimanager.IllegalViewOperationException;\nimport android.telephony.SmsManager;\n\n \npublic class DirectSmsModule extends ReactContextBaseJavaModule {\n \n    public DirectSmsModule(ReactApplicationContext reactContext) {\n        super(reactContext); //required by React Native\n    }\n \n    @Override\n    //getName is required to define the name of the module represented in JavaScript\n    public String getName() {\n        return "DirectSms";\n    }\n \n    @ReactMethod\n    public void sendDirectSms(String numbers, String msg) {\n        try {    \n            SmsManager smsManager = SmsManager.getDefault();\n            smsManager.sendTextMessage(numbers, null, msg, null, null);   \n        } catch (Exception ex) {\n            System.out.println("couldn\'t send message.");\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

2.注册DirectSmsModule

\n

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

\n
//DirectSmsPackage.java\npackage com.security_notifier;\n \nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.bridge.NativeModule;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.uimanager.ViewManager;\nimport com.security_notifier.DirectSmsModule;\n \nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n \npublic class DirectSmsPackage implements ReactPackage {\n \n    @Override\n    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {\n        return Collections.emptyList();\n    }\n\n    @Override\n    public List<NativeModule> createNativeModules(\n            ReactApplicationContext reactContext) {\n        List<NativeModule> modules = new ArrayList<>();\n        //this is where you register the module\n        modules.add(new DirectSmsModule(reactContext));\n        return modules;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

3.注册DirectSmsPackage

\n

您需要正确注册新包。打开MainApplication.java并修改如下:

\n
package com.security_notifier;\n\nimport android.app.Application;\nimport android.util.Log;\n\nimport com.facebook.react.PackageList;\nimport com.facebook.hermes.reactexecutor.HermesExecutorFactory;\nimport com.facebook.react.bridge.JavaScriptExecutorFactory;\nimport com.facebook.react.ReactApplication;\nimport com.tkporter.sendsms.SendSMSPackage;\n// import com.tkporter.sendsms.SendSMSPackage;\nimport com.oblador.vectoricons.VectorIconsPackage;\nimport com.reactnativecommunity.netinfo.NetInfoPackage;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport java.util.List;\n\n\nimport com.facebook.react.shell.MainReactPackage;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      @SuppressWarnings("UnnecessaryLocalVariable")\n      List<ReactPackage> packages = new PackageList(this).getPackages();\n      // Packages that cannot be autolinked yet can be added manually here, for example:\n      // packages.add(new MyReactNativePackage());\n\n      packages.add(new DirectSmsPackage());\n\n      return packages;\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return "index";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

4.从javascript调用sendDirectSms方法

\n

在你的 JavaScript 文件中:

\n
import React from \'react\';\n    import {NativeModules} from \'react-native\';\n    var DirectSms = NativeModules.DirectSms;\n\nexport default class App extends React.Component {\n       sendDirectSms() {\n          DirectSms.sendDirectSms(\'0935...\', \'This is a direct message\');\n      }\n      render() {\n        return (\n                <View>\n                    <TouchableOpacity onPress={() => this.sendDirectSms()}>\n                        <Text>send SMS</Text>\n                    </TouchableOpacity>\n                </View>\n               );\n          }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

5.设置用户权限

\n
    \n
  • 对于API级别<23

    \n

    添加权限到你的manifest.xml:

    \n
  • \n
\n
<uses-permission android:name="android.permission.SEND_SMS"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 适用于 API 23 及更高版本
  • \n
\n

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

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

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

\n

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

\n

在 iOS 上,无需用户交互即可发送短信的唯一方法是使用外部提供商,例如 Twilio;但该消息将来自您的服务器号码,而不是来自用户。@Paulw11 已经在你的问题中发表了评论

\n