• react-native 信鸽推送集成


    一. git链接: react-native-xinge-push

    1.1 安装

    npm install --save react-native-xinge-push
    
    react-native link react-native-xinge-push
    

    二. android配置

    2.1. android/settings.gradle

    include ':react-native-xinge-push'
    project(':react-native-xinge-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-xinge-push/android')
    

    2.2. android/app/build.gradle

    defaultConfig: {
      ...
      manifestPlaceholders = [
        XG_ACCESS_ID: "xxx", // 此处需要替换
        XG_ACCESS_KEY: "xxx", // 此处需要替换
        HW_APPID: "",
        PACKAGE_NAME: "xxx" // 此处需要替换
      ]
    
    }
    
    ...
    
    dependencies {
      ...
      compile project(':react-native-xinge-push')
      ...
    }
    

    2.3. android/app/src/main/java/com/nativeboilerplate/MainApplication.java

    import com.jeepeng.react.xgpush.PushPackage;
    
    ...
    @Override
        protected List<ReactPackage> getPackages() {
          return Arrays.<ReactPackage>asList(
            ...
            new PushPackage(),
            ...
          );
        }
    ...
    

    2.4. android/app/src/main/AndroidManifest.xml

    <application
      ...>
    
      ...
    
      <receiver android:name="com.jeepeng.react.xgpush.receiver.MessageReceiver"
        android:exported="true" >
        <intent-filter>
            <!-- 接收消息透传 -->
            <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" />
            <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
            <action android:name="com.tencent.android.tpush.action.FEEDBACK" />
        </intent-filter>
      </receiver>
    
      ...
    </application>
    

    三. ios配置

    3.1 ios/项目名.xcodeproj/project.pbxproj

    参考: example/ios/example.xcodeproj/project.pbxproj

    3.2 ios/项目名/AppDelegate.m

    #import <XGPush/XGPushManager.h>
    #import <XGPush.h>
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      ...
      [[XGPush defaultManager] reportXGNotificationInfo:launchOptions];
      return YES;
    }
    }
    
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
      return [RCTLinkingManager application:application openURL:url
                          sourceApplication:sourceApplication annotation:annotation];
    }
    
    
    // Required to register for notifications
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
      [XGPushManager didRegisterUserNotificationSettings:notificationSettings];
    }
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        [XGPushManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    }
    
    // Required for the registrationError event.
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    	NSLog(@"[XGPush] register APNS fail.
    [XGPush] reason : %@", error);
      [XGPushManager didFailToRegisterForRemoteNotificationsWithError:error];
    }
    
    // Required for the localNotification event.
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
      [XGPushManager didReceiveLocalNotification:notification];
    }
    
    /**
     收到通知消息的回调,通常此消息意味着有新数据可以读取(iOS 7.0+)
    
     @param application  UIApplication 实例
     @param userInfo 推送时指定的参数
     @param completionHandler 完成回调
     */
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      NSLog(@"[XGPush] receive slient Notification");
      NSLog(@"[XGPush] userinfo %@", userInfo);
      UIApplicationState state = [application applicationState];
      BOOL isClicked = (state != UIApplicationStateActive);
      NSMutableDictionary *remoteNotification = [NSMutableDictionary dictionaryWithDictionary:userInfo];
      if(isClicked) {
        remoteNotification[@"clicked"] = @YES;
        remoteNotification[@"background"] = @YES;
      }
      [[XGPush defaultManager] reportXGNotificationInfo:remoteNotification];
      [XGPushManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
    }
    
    // iOS 10 新增 API
    // iOS 10 会走新 API, iOS 10 以前会走到老 API
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
    // App 用户点击通知
    // App 用户选择通知中的行为
    // App 用户在通知中心清除消息
    // 无论本地推送还是远程推送都会走这个回调
    - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
    	NSLog(@"[XGPush] click notification");
    	if ([response.actionIdentifier isEqualToString:@"xgaction001"]) {
    		NSLog(@"click from Action1");
    	} else if ([response.actionIdentifier isEqualToString:@"xgaction002"]) {
    		NSLog(@"click from Action2");
    	}
    
    	[[XGPush defaultManager] reportXGNotificationResponse:response];
    
    	completionHandler();
    }
    
    // App 在前台弹通知需要调用这个接口
    - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    	[[XGPush defaultManager] reportXGNotificationInfo:notification.request.content.userInfo];
    	completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
    }
    #endif
    
    
    @end
    

    3.3 修改ios capabilities

    3.3.1 remote nitifications

    3.3.2 push notifications

    3.4 ios证书(开发/生产)

    1. 证书生成步骤
    2. p12转pem
    openssl pkcs12 -in 项目名-Development-Certificates.p12 -out 项目名-Development-Certificates.pem -nodes
    
    openssl pkcs12 -in 项目名-Prod-Certificates.p12 -out 项目名-Prod-Certificates.pem -nodes
    

    注:证书运用场景

    1. 开发证书
        xcode run debug
        xcode run release
    2. 生产证书
        TestFlight
        Appstore
    

    四. index.js中配置

    参考: example/app/index.js

    import React from 'react';
    import XGPush from 'react-native-xinge-push';
    import { Platform } from 'react-native';
    import { Actions } from 'react-native-router-flux';
    
    class AppRouter extends React.Component {
      constructor(props) {
        super(props);
    
        this.initPush();
      }
      componentDidMount() {
        this.onXGAddEvent();
      }
      componentWillUnmount() {
        this.onXGRemoveEvent();
      }
    
      // 信鸽通知跳转
      async onLinkToSceneKeyPath(notification) {
        const accessToken = await auth.getToken();
        if (!accessToken) return;//非登陆用户
    
        const customContent = isIOS ? notification.custom
          : JSON.parse(notification.custom_content);
        if (!customContent) return;//没有跳转参数
    
    
        // 根据信鸽push中的定制参数,进行链接跳转
        const { sceneKeyPath, notificationId } = customContent;
        if (!sceneKeyPath) return;
    
        const funcName = Actions.currentScene === sceneKeyPath ? 'replace' : 'push';
        Actions[funcName](sceneKeyPath, { notificationId });
      }
      // 信鸽增加事件
      onXGAddEvent() {
        XGPush.addEventListener('register', this.onRegister);
        XGPush.addEventListener('notification', this.onNotification);
      }
      // 信鸽移除事件
      onXGRemoveEvent() {
        XGPush.removeEventListener('register', this.onRegister);
        XGPush.removeEventListener('notification', this.onNotification);
      }
      // 初始化推送
      initPush = () => {
        if (Platform.OS === 'android') {
          XGPush.init(ACCESS_ID, ACCESS_KEY); //此处需要替换
        } else {
          XGPush.init(ACCESS_ID, ACCESS_KEY); //此处需要替换
        }
        this.initXGRegister();
      }
      // 注册
      initXGRegister = () => {
        XGPush.register('packageName')
          .then((result) => result)
          .catch((err) => {
            console.warn('xinge registration fail', err);
          });
      }
      // 注册成功
      onRegister = (deviceToken) => {
        console.log(`onRegister: ${deviceToken}`);
      }
      // 通知到达
      onNotification = (notification) => {
        if (notification.clicked === true) {
          this.onLinkToSceneKeyPath(notification);
          console.log(`app处于后台时收到通知${JSON.stringify(notification)}`);
        } else {
          console.log(`app处于前台时收到通知${JSON.stringify(notification)}`);
        }
      }
    
    
      render() {
          ...
      }
    }
    
    

    1、信鸽推送需要在app 打开,才能收到通知

  • 相关阅读:
    Linux下Utuntu使用
    模拟退火算法
    五大常用算法:分治、动态规划、贪心、回溯和分支界定
    图像处理与机器视觉行业分析
    数字图像处理知识结构整理
    算法之美--读书笔记
    台湾大学林轩田和李宏毅机器学习课程
    下载SCI论文
    OpenCV机器学习库函数--SVM
    fmri的图像数据在matlab中显示,利用imagesc工具进行显示,自带数据集-by 西南大学xulei教授
  • 原文地址:https://www.cnblogs.com/qiqi715/p/9926322.html
Copyright © 2020-2023  润新知