react-native集成微信分享記錄

前言

最近做了第一個用react-native寫的app,記錄下相關(guān)第三方插件的配置

關(guān)于微信分享芍碧,主要用到了這兩個庫 react-native-wechat-lib
react-native-wechat

其中第一個是在第二個基礎(chǔ)上優(yōu)化的号俐。更新相關(guān)微信SDK

備注:本文使用rn版本為0.61.5

步驟

  • 申請微信相關(guān)

去微信官方網(wǎng)址https://open.weixin.qq.com/,注冊移動應用踪危,填寫相關(guān)信息,獲取到相關(guān)到key

其中需要注意到是,安卓需要先生成release包袱结,然后使用Gen_Signature_Android2.apk獲取到app的簽名

安卓app包名地址:android/app/build.gradle文件中的applicationId字段

打開安卓獲取簽名軟件,輸入包名掩完,會得到一個簽名恶阴,這就是微信SDK需要的一個東西

image
  • android配置

app/src/main/java/com/companyName/ 下新建wxapi文件夾缓熟,新增WXEntryActivity.java彰触,WXPayEntryActivity.java文件

內(nèi)容如下:

WXEntryActivity.java 文件:


package com.logisticsrn.wxapi; // 你的包名.wxapi

import android.app.Activity;
import android.os.Bundle;
import com.theweflex.react.WeChatModule;

public class WXEntryActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WeChatModule.handleIntent(getIntent());
        finish();
    }
}

WXPayEntryActivity.java 文件

package com.logisticsrn.wxapi; // 你的包名.wxapi

import android.app.Activity;
import android.os.Bundle;
import com.theweflex.react.WeChatModule;

public class WXPayEntryActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WeChatModule.handleIntent(getIntent());
        finish();
    }
}

AndroidManifest.xml添加聲明,該文件在 app/src/main/AndroidManifest.xml

<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:exported="true"
/>
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:label="@string/app_name"
    android:exported="true"
/>

關(guān)于微信分享母债,安卓相關(guān)配置就這些衙熔,微信支付以后再研究

  • ios配置

先將微信Libraries 引入進來喇嘱,打開XCode作烟,點擊項目Libraries,右鍵添加文件到xx

image

我們使用的是react-native-wechat-lib,找到依賴下的該包压恒,打開ios文件夾期吓,將RCTWeChat.xcodeproj 導入進來

image

在工程Build Phases ? Link Binary With Libraries中添加如下幾個庫

libRCTWeChat.a
libz.tbd
libc++.tbd
libsqlite3.0.tbd
SystemConfiguration.framework
CoreTelephony.framework
image

TARGETS 下項目名 -> info ,添加我們申請得到的微信 AppId填寫在 "URL type""URL Schema"處路翻,ldentifier填寫為:weixin

注意:weixin對應的值就是微信開放者平臺上申請的那個key

image

iOS9 以上真竖,添加 微信白名單

image

在項目的AppDelegate.m添加以下代碼拐袜,啟動[LinkingIOS]

#import <React/RCTLinkingManager.h>

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  return [RCTLinkingManager application:application openURL:url
                            sourceApplication:sourceApplication annotation:annotation];
}

  • rn代碼中使用

在項目開始文件中,

import * as WeChat from 'react-native-wechat-lib';

WeChat.registerApp(
  'appid',
  'Universal Links',
);

封裝wxHandle.js處理微信分享邏輯

import * as WeChat from 'react-native-wechat-lib';
import CommonConfig from './config';
import toast from './toast';

/**
 * 分享到微信朋友圈
 * @param {object} shareMetadata
 * return Promise true:成功 false: 失敗
 */
export const shareToTimeline = async shareMetadata => {
  const defaultShareData = {
    title: '應用名',
    description: '',
    thumbImageUrl: ``, // 縮略圖
    webpageUrl: '',
    scene: 1, // 分享到, 0:會話 1:朋友圈 2:收藏
    isRemoveSuffix: true,
  };
  try {
    const isInstalled = await WeChat.isWXAppInstalled();
    if (!isInstalled) {
      toast('請先安裝微信');
      return Promise.resolve(false);
    }
    const metadata = {...defaultShareData, ...shareMetadata};
    if (!metadata.isRemoveSuffix) {
      metadata.title = cutTitleShort(metadata.title, 30);
    }
    const res = await WeChat.shareWebpage(metadata);

    if (res.errCode === 0) {
      // 在分享中取消 也正常返回
      toast('分享成功');
      return Promise.resolve(false);
    }
  } catch (e) {
    toast('分享失敗');
    if (e instanceof WeChat.WechatError) {
      console.warn(e.stack);
    } else {
      console.log(e);
    }
  }
  return Promise.resolve(false);
};

/**
 * 分享給朋友 對話框
 * @param {object} shareMetadata
 * return Promise true:成功 false: 失敗
 */
export const shareToSession = async shareMetadata => {
  const defaultShareData = {
    title: '應用名',
    description: '',
    thumbImageUrl: '', // 縮略圖
    webpageUrl: '',
    scene: 0, // 分享到, 0:會話 1:朋友圈 2:收藏
    isRemoveSuffix: false,
  };
  try {
    const isInstalled = await WeChat.isWXAppInstalled();
    if (!isInstalled) {
      toast('請先安裝微信');
      return Promise.resolve(false);
    }
    const metadata = {...defaultShareData, ...shareMetadata};
    if (!metadata.isRemoveSuffix) {
      metadata.title = cutTitleShort(metadata.title, 22);
    }
    const res = await WeChat.shareWebpage(metadata);
    if (res.errCode === 0) {
      // 分享成功
      toast('分享成功');
      return Promise.resolve(true);
    }
  } catch (e) {
    toast('分享失敗');
    if (e instanceof WeChat.WechatError) {
      console.warn(e.stack);
    } else {
      console.log(e);
    }
  }
  return Promise.resolve(false);
};

/**
 * 分享出去的標題不能太長
 * @param {string} titleString
 * @param {number} maxStrLength
 * @param isAddSuffix
 */
const cutTitleShort = (titleString, maxStrLength) => {
  if (!titleString) {
    return '應用名';
  }
  let newStr;
  if (titleString.length > maxStrLength - 7) {
    newStr = `${titleString.substring(0, maxStrLength - 7)}...【應用名】`;
  } else {
    newStr = `${titleString}【應用名】`;
  }
  return newStr;
};

/**
 * 分享圖片到微信
 * @param {string} imageUrl
 * @param {number} scene
 */
export const sharePicToWechat = async shareMetadata => {
  const defaultShareData = {
    imageUrl:'',
    scene: 0,
  };
  try {
    const isInstalled = await WeChat.isWXAppInstalled();
    if (!isInstalled) {
      toast('請先安裝微信');
      return Promise.resolve(false);
    }
    const metadata = {...defaultShareData, ...shareMetadata};
    const res = await WeChat.shareImage(metadata);
    if (res.errCode === 0) {
      // 分享成功
      toast('分享成功');
      return Promise.resolve(true);
    }
  } catch (e) {
    toast('分享失敗');
    if (e instanceof WeChat.WechatError) {
      console.warn(e.stack);
    } else {
      console.log(e);
    }
  }
  return Promise.resolve(false);
};

關(guān)于

微信分享還是很簡單的箍鼓,具體的一些API可以參考微信官方文檔與插件文檔,這里整理的是微信分享相關(guān)款咖,后面做到支付再補充支付項目內(nèi)容

本文首發(fā)于 react-native集成微信分享記錄

參考鏈接:react-native-wechat (react-native 微信分享铐殃、支付)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帘腹,更是在濱河造成了極大的恐慌,老刑警劉巖赴蝇,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菩浙,死亡現(xiàn)場離奇詭異,居然都是意外死亡考余,警方通過查閱死者的電腦和手機先嬉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楚堤,“玉大人,你說我怎么就攤上這事。” “怎么了樱哼?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵茄唐,是天一觀的道長蚁廓。 經(jīng)常有香客問我腿时,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任肤频,我火速辦了婚禮,結(jié)果婚禮上侠讯,老公的妹妹穿的比我還像新娘溜嗜。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布幻件。 她就那樣靜靜地躺著绰沥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天序攘,我揣著相機與錄音,去河邊找鬼。 笑死泛粹,一個胖子當著我的面吹牛们衙,可吹牛的內(nèi)容都是我干的宗侦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茴厉,長吁一口氣:“原來是場噩夢啊……” “哼而账!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锯茄,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤抓半,失蹤者是張志新(化名)和其女友劉穎狡孔,沒想到半個月后荚醒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年勾怒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍椅。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摘完,死狀恐怖孝治,靈堂內(nèi)的尸體忽然破棺而出谈飒,到底是詐尸還是另有隱情杭措,我是刑警寧澤刑桑,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響细诸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塘偎,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一褪那、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧式塌,春花似錦博敬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至武学,卻和暖如春祭往,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背火窒。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工硼补, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熏矿。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓已骇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親票编。 傳聞我的和親對象是個殘疾皇子褪储,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容