React Native Android 集成 JPush 推送服务遇到的问题及解决方式

背景

JPush 是一款免费的推送服务,支持 Android 和 iOS 平台。在 React Native 开发中,集成 JPush 推送可以使得应用程序具有消息推送的能力,更加智能和用户友好。

在本文中,我们将介绍 React Native Android 集成 JPush 推送服务遇到的问题及解决方式,帮助开发者实现推送功能。

步骤

1. 注册 JPush

在开始之前,您需要注册 JPush 账户并创建一个应用程序。

1.1 注册账户和创建应用程序

首先,您需要访问 JPush 的官方网站,进入“控制台”页面。如果您没有注册过账户,可以先注册一个新账户。

接着,您需要创建一个新的应用程序。在“控制台”页面的左侧导航栏中,选择“应用管理”,然后点击“新建应用”。

在创建应用程序时需要填写基本信息,例如应用程序名称、包名和平台类型(Android 或 iOS)。注意,包名必须和您的 React Native 应用程序的包名相同。

在创建完应用程序后,您将在应用程序管理页面中获得一个 AppKey。您将在稍后使用此 AppKey 配置您的应用程序。

1.2 添加 Android 应用程序

接下来,您需要添加 Android 应用程序。

在您的应用程序管理页面中,点击“添加应用”,然后选择“Android”平台。

在填写应用程序信息时,您需要提供您的应用程序包名、应用程序版本号和应用程序签名。如果您还没有为您的应用程序签名,可以参考这篇文章

在填写完您的应用程序信息后,您将获得一个 Registration ID。您将在稍后使用此 Registration ID 配置您的应用程序。

2. 集成 JPush SDK

接下来,您需要集成 JPush SDK,以便您的应用程序可以与 JPush 服务器通信并使用推送服务。

2.1 下载 JPush SDK

首先,您需要从 JPush 的开发者中心,下载最新版本的 JPush SDK。解压缩后,将其中的 libs 目录下的 jpush-android-x.x.x.jar 和架构相关的so文件添加到您的 React Native 应用程序的 libs 和 jniLibs 目录下。如果您想在 react-native link 命令中自动添加此库,请将 jpush-react-native 提供的 android 具体的配置添加到android/app/build.gradle。

2.2 集成 JPush SDK

在您的 React Native 应用程序中,您需要添加一个 JPushPackager 类,以便于访问 JPush SDK。这个类将帮助您发送推送通知,管理消息和事件,并注册和注销推送服务。请确保您的包名与您在 JPush 注册时提供的包名相同。

以下是 JPushPackager 类的实现示例代码:

package com.yourapplicationname;

import android.util.Log;
import cn.jpush.android.api.JPushInterface;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class JPushPackager extends ReactContextBaseJavaModule {
  private static final String TAG = "JPushPackager";

  public JPushPackager(ReactApplicationContext reactContext) {
    super(reactContext);
    JPushInterface.setDebugMode(true);  // 调试模式
    JPushInterface.init(reactContext);  // 初始化
  }

  @Override
  public String getName() {
    return "JPushPackager";
  }

  @ReactMethod
  public void getRegistrationId(Callback callback) {
    String id = JPushInterface.getRegistrationID(getReactApplicationContext());
    callback.invoke(id);
  }
}

您还需要将此类添加到您的应用程序的 MainActivity 中。

以下是 MainActivity 的示例代码:

package com.yourapplicationname;

import com.facebook.react.ReactActivity;

public class MainActivity extends ReactActivity {
  @Override
  protected String getMainComponentName() {
    return "YourApplicationName";
  }
}

在清单文件中引用MainActivity时,要将其指向JPush提供的PushActivity或PushService

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.jpushdemo.SplashActivity" />
            </intent-filter>
        </activity>
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER" />
                <action android:name="cn.jpush.android.intent.REPORT" />
                <action android:name="cn.jpush.android.intent.PushService" />
                <action android:name="cn.jpush.android.intent.PUSH_TIME" />
            </intent-filter>
        </service>
        <service android:name="cn.jpush.android.service.DownloadService" />

3. 向 JPush 发送推送通知

现在您已经准备好向 JPush 发送推送通知。您可以使用 JPush 提供的 API 来发送通知,或者使用 JPush 提供的 Web 推送控制台。

以下是使用 API 发送推送通知的示例代码:

package com.yourapplicationname;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.PushNotificationBuilder;
import cn.jpush.android.api.TagAliasCallback;

public class PushNotification {
  public static void sendNotification(String message) {
    JPushInterface.setAliasAndTags(getApplicationContext(), null, null, new TagAliasCallback() {
        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            if (code == 0) {
                Log.d(TAG, "设置别名成功");
            } else {
                Log.e(TAG, "设置别名失败,错误代码:" + code);
            }
        }
    });
    PushNotificationBuilder builder = new PushNotificationBuilder();
    builder.setNotificationId(1)
      .setRingtoneType(AudioAttributes.USAGE_ALARM)
      .setChannelId("CHANNEL_JPUSH_DEFAULT")
      .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
      .setPriority(NotificationCompat.PRIORITY_MAX)
      .setStyle(new NotificationCompat.BigTextStyle()
        .bigText(message)
        .setBigContentTitle("标题")
        .setSummaryText("这是摘要"))
      .setContentTitle("通知")
      .setContentText(message)
      .setAutoCancel(true)
      .setSmallIcon(R.mipmap.ic_launcher)
      .setBadgeNumber(1);
    JPushInterface.setPushNotificationBuilder(1, builder);
    JPushInterface.addLocalNotification(getApplicationContext(), builder.build());
  }
}

在此示例代码中,我们将推送通知实现为静态方法,并在方法中设置了推送通知的标题、内容和声音等属性。

4. 推送服务的事件

当您的应用程序接收到推送通知时,JPush SDK 将触发推送服务事件回调。您可以在应用程序中注册推送服务事件,以便您的应用程序可以处理这些事件。

以下是推送服务事件的示例代码:

package com.yourapplicationname;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import cn.jpush.android.api.JPushInterface;

public class PushReceiver extends BroadcastReceiver {
  private static final String TAG = "PushReceiver";

  @Override
  public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();

    if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
      String registrationId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
      Log.d(TAG, "Registration Id: " + registrationId);
    } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
      String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
      Log.d(TAG, "Message: " + message);
    } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
      int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
      Log.d(TAG, "Notification Id: " + notificationId);
    } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
      Intent startActivityIntent = new Intent(context, MainActivity.class);
      startActivityIntent.putExtras(bundle);
      startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      context.startActivity(startActivityIntent);
    }
  }
}

在此示例代码中,我们使用 BroadcastReceiver 类来注册推送服务事件。当您的应用程序接收到消息时,将调用 onReceive 方法,并根据 ACTION_REGISTRATION_ID、ACTION_MESSAGE_RECEIVED、ACTION_NOTIFICATION_RECEIVED 和 ACTION_NOTIFICATION_OPENED 分别处理注册、消息、通知和打开通知点击事件。

在 ACTION_NOTIFICATION_OPENED 事件中,我们创建一个新的 MainActivity,并将收到的数据传递给该活动。然后,我们使用 flags 标志将这个活动设置为应用程序的“根”活动,以确保当用户打开通知时,该活动将成为用户界面的前端。

问题与解决

在实现过程中,我们遇到了一些常见的问题和错误。以下是我们的解决方案和建议:

问题一:无法收到推送通知

原因

问题可能是由于一些错误的配置和设置引起的,例如:

  • 您的 JPush 应用程序不处于“LIVE”模式;
  • 您的网络连接不正确;
  • 您的代码逻辑存在问题,例如数据结构是空的;
  • 您的推送服务代码没有正确运行/绑定;
  • 您的推送服务在设备上被禁用。

解决方案

为了解决这个问题,您要:

  • 检查您的 JPush 应用程序是否处于“LIVE”模式,并且您的服务可以接收到推送通知;
  • 检查您的网络是否正常;
  • 检查代码逻辑并确保数据结构不为空;
  • 检查您的推送服务是否正确启动/绑定,例如使用正确的 AppKey 和 Registration ID;
  • 检查您的推送服务是否在设备设置中处于禁用状态,并启用推送服务。

问题二:禁用无线电

原因

问题可能是由于 Android 设备上的“禁用无线电”功能引起的。这个功能可以禁用无线电和移动数据网络来节省电池寿命。

解决方案

为了解决这个问题,您需要:

  • 打开 Android 设备的“设置”选项;
  • 打开“电池”选项;
  • 打开“省电”选项;
  • 转到“无线电禁用”选项,并确保它是禁用状态;
  • 如果需要,打开“省电”选项并选择“无限制”。

总结

在本文中,我们详细介绍了 React Native Android 集成 JPush 推送服务遇到的问题及解决方式。通过本文,您可以了解如何使用 JPush 注册、添加应用程序,并配置推送通知服务和推送服务事件等操作,同时也解决了一些常见问题和错误。

无论是初学者还是经验丰富的开发者,都可以从本文中获得有价值的信息和指导。如果您有任何疑问或意见,请随时在评论区留言。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a65c2aadd4f0e0fff20ef8


纠错反馈