GithubHelp home page GithubHelp logo

little-snow-fox / react-native-wechat-lib Goto Github PK

View Code? Open in Web Editor NEW
663.0 6.0 129.0 19.07 MB

🚀 WeChat login, share, favorite and payment for React-Native on iOS and Android

License: MIT License

Ruby 3.14% Java 34.31% JavaScript 11.35% Objective-C 29.34% Starlark 0.35% CMake 0.16% C++ 4.27% Objective-C++ 15.70% TypeScript 1.38%

react-native-wechat-lib's Introduction

React-Native-Wechat-Lib

Version npm version Wechat SDK Wechat SDK react version

本库为 react-native 项目提供 Wechat SDK 支持

[React Native] bridging library that integrates WeChat SDKs:

  • Android SDK 6.8.20
  • iOS SDK 2.0

路线图

  • 3.0.x
    • React native 70
    • Android SDK 6.8.20
    • iOS SDK 2.0
    • iOS SDK 2.0 No payment function
    • Example
  • 1.1.x
    • React native 60
    • Android SDK 5.5.6
    • iOS SDK 1.8.7.1
    • iOS SDK 1.8.7.1 No payment function

注意

如果你的 IOS 应用需要使用不带支付功能的 WeChat SDK,请使用带有 “-notpay” 后缀的 NPM 包。

目前最新代码版本为 3.0.x,但 NPM Last 版本暂时只到 1.1.26,因为 3.0.x 暂时还处于开发阶段,有小部分功能未经过测试

如果你需要使用 3.0.x 版本,请在 package.json 中加上版本号 [email protected],切换前请你清楚了解该版本的风险,该版本为开发版。

我会尽快推出 3.0.x 发行版。


附言

本库由 little-snow-fox 发起。

希望各位大佬积极提交 PR,单靠我一个人维护工作量大。


目录


安装

NPM 安装

npm install react-native-wechat-lib --save
# 3.0.0 开始弃用
react-native link react-native-wechat-lib

源码安装

git clone https://github.com/little-snow-fox/react-native-wechat-lib
cd react-native-wechat-lib
npm link
cd ../my-project
npm link react-native-wechat-lib

源码安装指定版本

git clone https://github.com/little-snow-fox/react-native-wechat-lib
cd react-native-wechat-lib
git checkout 1.1.x
npm link
cd ../my-project
npm link react-native-wechat-lib

起步


API 文档

本库支持 TypeScript,使用 Promiseasync/await 来接收返回。

接口名称和参数尽量跟腾讯官网保持一致性,除了嵌套对象变成扁平对象,你可以直接查看腾讯文档来获得更多帮助。

registerApp(appid) 注册

  • appid {String} the appid you get from WeChat dashboard
  • returns {Boolean} explains if your application is registered done

This method should be called once globally.

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

WeChat.registerApp('appid', 'universalLink');

isWXAppInstalled() 判断微信是否已安装

  • returns {Boolean} if WeChat is installed.

Check if the WeChat app is installed on the device.

isWXAppSupportApi() 检查支持情况

  • returns {Boolean} Contains the result.

Check if wechat support open url.

getApiVersion() 获取 API 版本号

  • returns {String} Contains the result.

Get the WeChat SDK api version.

openWXApp() 打开微信

  • returns {Boolean}

Open the WeChat app from your application.

sendAuthRequest([scope[, state]]) 微信授权登录

  • scope {Array|String} Scopes of auth request.
  • state {String} the state of OAuth2
  • returns {Object}

Send authentication request, and it returns an object with the following fields:

field type description
errCode Number Error Code
errStr String Error message if any error occurred
openId String
code String Authorization code
url String The URL string
lang String The user language
country String The user country

authByScan([scope, nonceStr, onQRGet]) 微信扫码授权登录

  • appId {String} the appId you get from WeChat dashboard
  • appSecret {String} the appSecret you get from WeChat dashboard
  • onQRGet (String) => void

调用 authByScan 后,需要监听二维码的获取,展示完二维码,用户扫码登录完成后才会回调 callback,字段如下

field type description
errCode Number Error Code
errStr String Error message if any error occurred
nickname String 微信昵称
headimgurl String 微信头像链接
openid String openid
unionid String unionid

示例如下

const ret = await WeChat.authByScan(WeiXinId, WeiXinSecret, (qrcode) => {
  console.log(qrcode)
  // 拿到 qrcode 用 Image 去渲染
});  
console.log('登录信息', ret);

如有不懂,可以查看微信官方文档

ShareText(ShareTextMetadata) 分享文本

ShareTextMetadata

name type description
text String 分享文本
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareText({
  text: 'Text content.',
  scene: 0,
});

ShareImage(ShareImageMetadata) 分享图片

ShareImageMetadata

name type description
imageUrl String 图片地址
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareImage({
  imageUrl: 'https://google.com/1.jpg',
  scene: 0,
});

ShareLocalImage(ShareImageMetadata) 分享本地图片

ShareImageMetadata

name type description
imageUrl String 图片地址
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred

ShareFile(ShareFileMetadata) 分享文件

ShareFileMetadata

name type description
url String 文件地址。如果是远程文件,则为 http 开头;如果是本地文件,则为绝对路径,如 /storage/emulated/0/Android/xxx
title String 文件标题
scene Number 分享到, 0:会话

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred

安卓实现分享本地文件需要对工程进行一些配置,详见 Android 安装

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

WeChat.shareFile({
  imageUrl: 'https://sdcard/test.png',
  title: '测试文件.pdf',
  scene: 0,
});

ShareMusic(ShareMusicMetadata) 分享音乐

ShareMusicMetadata

name type description
title String 标题
description String 描述
thumbImageUrl String 缩略图地址,本库会自动压缩到 32KB
musicUrl String 音频网页的 URL 地址
musicLowBandUrl String 供低带宽环境下使用的音频网页 URL 地址
musicDataUrl String 音频数据的 URL 地址
musicLowBandDataUrl String 供低带宽环境下使用的音频数据 URL 地址
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareMusic({
  title: 'Good music.',
  musicUrl: 'https://google.com/music.mp3',
  thumbImageUrl: 'https://google.com/1.jpg',
  scene: 0,
});

ShareVideo(ShareVideoMetadata) 分享视频

ShareVideoMetadata

name type description
title String 标题
description String 描述
thumbImageUrl String 缩略图地址,本库会自动压缩到 32KB
videoUrl String 视频链接
videoLowBandUrl String 供低带宽的环境下使用的视频链接
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareVideo({
  title: 'Interesting video.',
  videoUrl: 'https://google.com/music.mp3',
  thumbImageUrl: 'https://google.com/1.jpg',
  scene: 0,
});

ShareWebpage (ShareWebpageMetadata) 分享网页

ShareWebpageMetadata

name type description
title String 标题
description String 描述
thumbImageUrl String 缩略图地址,本库会自动压缩到 32KB
webpageUrl String HTML 链接
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareWebpage({
  title: 'Interesting web.',
  videoUrl: 'https://google.com/music.mp3',
  thumbImageUrl: 'https://google.com/1.jpg',
  scene: 0,
});

ShareMiniProgram(ShareMiniProgramMetadata) 分享小程序

ShareMiniProgram

name type description
title String 标题
description String 描述
thumbImageUrl String 缩略图地址,本库会自动压缩到 32KB
userName String 小程序的 userName,填小程序原始 id
path String 小程序的页面路径
hdImageUrl String 小程序新版本的预览图二进制数据,6.5.9 及以上版本微信客户端支持
withShareTicket String 是否使用带 shareTicket 的分享
miniProgramType Number 小程序的类型,默认正式版,1.8.1 及以上版本开发者工具包支持分享开发版和体验版小程序
webpageUrl String 兼容低版本的网页链接
scene Number 分享到, 0:会话 1:朋友圈 2:收藏

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.shareMiniProgram({
  title: 'Mini program.',
  userName: 'gh_d39d10000000',
  webpageUrl: 'https://google.com/show.html',
  thumbImageUrl: 'https://google.com/1.jpg',
  scene: 0,
});

LaunchMiniProgram (LaunchMiniProgramMetadata) 跳到小程序

LaunchMiniProgramMetadata

name type description
userName String 填小程序原始 id
miniProgramType Number 可选打开 开发版,体验版和正式版
path String 拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"

Return:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

WeChat.launchMiniProgram({
  userName: 'gh_d39d10000000',
  miniProgramType: 1,
});

ChooseInvoice (ChooseInvoice) 选择发票

ChooseInvoice

name type description
cardSign String 签名
signType String 签名类型
timeStamp Number 当前时间戳
nonceStr String 随机字符串

Invoice

name type description
appId String
cardId String 发票 Id
encryptCode String 加密串

Return:

name type description
errCode Number 0 if authorization succeed
cards Invoice[] 发票数据
errStr String Error message if any error occurred
import * as WeChat from 'react-native-wechat-lib';

// ios 什么都不填都可以,android可以填写以下假的内容都可以正常运行,具体参数获取可以去看微信文档
WeChat.chooseInvoice({
  cardSign: 'cardSign',
  signType: 'SHA256',
  timeStamp: Date.now(),
  nonceStr: `${Date.now()}`,
});

pay(payload) 支付

  • payload {Object} the payment data
    • partnerId {String} 商家向财付通申请的商家 ID
    • prepayId {String} 预支付订单 ID
    • nonceStr {String} 随机串
    • timeStamp {String} 时间戳
    • package {String} 商家根据财付通文档填写的数据和签名
    • sign {String} 商家根据微信开放平台文档对数据做的签名
  • returns {Object}

Sends request for proceeding payment, then returns an object:

name type description
errCode Number 0 if authorization succeed
errStr String Error message if any error occurred

subscribeMessage(SubscribeMessageMetadata) 一次性订阅消息

  • returns {Object}
name type description
scene Number 重定向后会带上 scene 参数,开发者可以填 0-10000 的整形值,用来标识订阅场值
templateId String 订阅消息模板 ID,在微信开放平台提交应用审核通过后获得
reserved String 用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验,开发者可以填写 a-zA-Z0-9 的参数值,最多 128 字节,要求做 urlencode

回调事件订阅

从小程序回到 APP,或者支付成功回到 APP 都会触发回调事件来返回相应信息,请在触发相应方法前提前添加事件队列。

    WeChat.registerApp(Global.APP_ID, Global.UNIVERSAL_LINK);
    DeviceEventEmitter.addListener('WeChat_Req', req => {
      console.log('req:', req)
      if (req.type === 'LaunchFromWX.Req') { // 从小程序回到APP的事件
        miniProgramCallback(req.extMsg)
      }
    });
    DeviceEventEmitter.addListener('WeChat_Resp', resp => {
      console.log('res:', resp)
      if (resp.type === 'WXLaunchMiniProgramReq.Resp') { // 从小程序回到APP的事件
        miniProgramCallback(resp.extMsg)
      } else if (resp.type === 'SendMessageToWX.Resp') { // 发送微信消息后的事件
        sendMessageCallback(resp.country)
      } else if (resp.type === 'PayReq.Resp') { // 支付回调
        payCallback(resp)
      }
    });

License

MIT

Author: little-snow-fox


Sponsor

如果觉得本库还行,你愿意的话可以请我喝咖啡 ^_^ 。

wepay

alipay

react-native-wechat-lib's People

Contributors

bamboosword avatar hengkx avatar hongbo-miao avatar iojh avatar little-snow-fox avatar norcy avatar patrickkzhao avatar rj9676564 avatar skychx avatar ulion avatar yesw6a avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

react-native-wechat-lib's Issues

android bitmapResizeGetBytes 压缩算法问题

经过分享小程序封面测试..分享图片非常模糊..应该是过于压缩了...

压缩算法应改为

private static byte[] bitmapResizeGetBytes(Bitmap image, int size) {
        // 这个压缩算法存在效率问题,希望有义士可以出手优化 by little-snow-fox 2019.10.20
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 质量压缩方法,这里100表示第一次不压缩,把压缩后的数据缓存到 baos
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        int options = 100;
        // 循环判断压缩后依然大于 32kb 则继续压缩
        while (baos.toByteArray().length / 1024 > size) {
            // 重置baos即清空baos
            baos.reset();
            // 每次都减少1
            options -= 1;
            // 这里压缩options%,把压缩后的数据存放到baos中
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);
        }
        return baos.toByteArray();
    }

之后图片就清晰了

关于 UIWebView 问题:ITMS-90809

使用命令: grep -r UIWebView node_modules/* 之后发现这个包还有 UIWebView 出现

Binary file node_modules/react-native-wechat-lib/ios/libWeChatSDK.a matches

Dear Developer,We identified one or more issues with a recent delivery for your app, "脸疼" 0.2.3 (55). Your delivery was successful, but you may wish to correct the following issues in your next delivery:ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.After you’ve corrected the issues, you can upload a new binary to App Store Connect.Best regards,The App Store Team

1.1.13版本 Android编译报错

react-native-wechat-lib/android/src/main/java/com/theweflex/react/WeChatModule.java:525: 错误: 程序包SubscribeMessage不存在
SubscribeMessage.Req req = new SubscribeMessage.Req();

sendAuthRequest返回没有获取到openid

WeChat.sendAuthRequest('snsapi_userinfo') .then(result => { console.log('wechat:sendAuthRequest : ', result) }) .catch(e => console.log('wechat_err:sendAuthRequest()', e));

返回的result里,没有openid

1.1.16 Android 编译报错

版本: 1.1.16

错误:

Task /node_modules/react-native-wechat-lib/android/src/main/java/com/theweflex/react/WeChatModule.java:10: 错误: 找不到符号
import androidx.annotation.Nullable;

本地打包是可以通过 Android studio 来解决这个问题,但是线上打包总不能每一次都去修改这个东西,fork 到进行修改,由于并不太熟悉原生安卓的开发,引入项目报错,希望解决

找不到WXApi.h

如果出现报错找不到WXApi、RCTLinkingManager,你需要在Build Settings中添加Header Search Path如下

$(SRCROOT)/../node_modules/react-native-wechat-lib/ios
$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS
配置Universal Link,在Xcode的Signing&Capability选项卡中添加Associated Domains,将你选定的域名填进去,必须是https的,然后在微信开放平台中设置UniversalLink,必须与xcode中的一致,universallink设置方法参考苹果的文档和微信的开发者文档
info.plist的LSApplicationQueriesSchemes

按照这个操作做没有作用,我这边是RN0.61.5 没有配置Universal Link,因为老的react-native-wechat是不需要这个参数的

Android 源码编译问题

/**
     * 分享本地图片
     * @param data
     * @param callback
     */
    @ReactMethod
    public void shareLocalImage(final ReadableMap data, final Callback callback) {
        FileInputStream fs = new FileInputStream(data.getString("imageUrl"));
        Bitmap bmp  = BitmapFactory.decodeStream(fs);
        // 初始化 WXImageObject 和 WXMediaMessage 对象
        WXImageObject imgObj = new WXImageObject(bmp);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        // 设置缩略图
        msg.thumbData = bitmapResizeGetBytes(bmp, THUMB_SIZE);

        // 构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = "img";
        req.message = msg;
        // req.userOpenId = getOpenId();
        req.scene = data.hasKey("scene") ? data.getInt("scene") : SendMessageToWX.Req.WXSceneSession;
        callback.invoke(null, api.sendReq(req));

    }

编译提示 符号: 类 FileInputStream 找不到

我看了源码,是没有 import

安卓配置报错

include ':RCTWeChat'
project(':RCTWeChat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat/android')
依照安卓文档中加入这个链接,会报这个错误
ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve project :RCTWeChat.
Show Details
Affected Modules: app

如果将上面的链接换成
include ':RCTWeChat'
project(':RCTWeChat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat-lib/android')

会报这个错误
ROR: The modules ['node_modules-react-native-wechat-lib-android-RCTWeChat', 'node_modules-react-native-wechat-lib-android-react-native-wechat-lib~1'] point to the same directory in the file system.
Each module must have a unique path.

同样react-native-wechat这个库也是会报这个错误,在react-native-wechat库中提了issue,应该是么有回复了,求帮忙看一下

ios setup 有疑问,请求帮助

按照README中的集成步骤:
https://github.com/little-snow-fox/react-native-wechat-lib/blob/master/docs/build-setup-ios.md#2-then-copy-the-following-in-appdelegatem

将下面的代码复制到 AppDelegate.m

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
  continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable
  restorableObjects))restorationHandler {
  return [WXApi handleOpenUniversalLink:userActivity
  delegate:self];
}

保错:Use of undeclared identifier 'WXApi'
于是 #import "WXApi.h",解决了上面的报错,
但是还报错:No known class method for selector 'handleOpenUniversalLink:delegate:'

LaunchMiniProgram is not a function

C:\work\testTiaoXiaoChengXv\node_modules\react-native\Libraries\YellowBox\YellowBox.js:71 Possible Unhandled Promise Rejection (id: 0):
TypeError: WeChat.LaunchMiniProgram is not a function
TypeError: WeChat.LaunchMiniProgram is not a function

rn60以上可以用吗?

老板有没有测试过在react-native60及以上版本可以正常使用吗?
求证一下.

不支持 RN 0.58?

目前 RN 版本0.58.6 , android 打包报错
image
应该是因为 0.58 的版本还不支持 AndroidX,目前处理上是把 Nullable 相关的代码都删了,如:public void invoke(@nullable Bitmap bitmap) => public void invoke(Bitmap bitmap)

目前打包是不报错了。因为不会android开发,不太清楚是否会影响代码的正常运行

Android 微信分享时报Uninitialized ActivityThread, likely app-created Instrumentation的异常

微信分享可以调起,在选择分享的用户时点击无反应。查看后台日志报:

2020-03-10 11:05:28.079 20294-20294/? E/Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
    java.lang.Throwable
        at android.app.Instrumentation.getFactory(Instrumentation.java:1233)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1224)
        at com.tencent.mm.splash.k.newActivity(SourceFile:61)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3340)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
        at android.os.Handler.dispatchMessage(Handler.java:112)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

请问有什么解决办法?

部分API不能使用

使用
WeChat.launchMiniProgram({
userName: 'gh_d39d10000000',
miniProgramType: 1
})

error:nativeLaunchMiniProgram is not a fucntion

分享小程序也是这样

WXApi genExtraUrlByReq:withAppData

版本:1.1.16
微信版本:7.0.12

WeChat.registerApp 正常运行
WeChat.isWXAppInstalled() 和 WeChat.getApiVersion() 这种不需要传参数的api能正常调用,也能正常调用api打开微信

但是我尝试使用的分享功能时却报错了
这是我的代码
WeChat.shareText({ text: 'Text content.', scene: 0 }).then(res => { console.log('res', res); }).catch(err => { console.log('err', err); })

以下是报错信息:
ExceptionsManager.js:126 Exception '+[WXApi genExtraUrlByReq:withAppData:]: unrecognized selector sent to class 0x1012706a0' was thrown while invoking shareText on target WeChat with params ( { scene = 0; text = "Text content."; }, 9663 ) callstack: ( 0 CoreFoundation 0x00000001a8188178 9624AAFD-5437-3772-A507-0F357875808D + 1253752 1 libobjc.A.dylib 0x00000001a7e9cc1c objc_exception_throw + 60 2 CoreFoundation 0x00000001a808b440 9624AAFD-5437-3772-A507-0F357875808D + 218176 3 CoreFoundation 0x00000001a818c85c 9624AAFD-5437-3772-A507-0F357875808D + 1271900 4 CoreFoundation 0x00000001a818eb60 _CF_forwarding_prep_0 + 96 5 RCTWeChat 0x000000010124ec68 +[WXApi sendReq:isAutoResend:forceScheme:completion:] + 1948 6 RCTWeChat 0x000000010124e4b8 +[WXApi sendReq:completion:] + 68 7 RCTWeChat 0x0000000101236574 -[RCTWeChat shareText::] + 504 8 CoreFoundation 0x00000001a818ed14 9624AAFD-5437-3772-A507-0F357875808D + 1281300 9 CoreFoundation 0x00000001a8057de8 9624AAFD-5437-3772-A507-0F357875808D + 7656 10 CoreFoundation 0x00000001a8058a10 9624AAFD-5437-3772-A507-0F357875808D + 10768 11 React 0x00000001015899e8 -[RCTModuleMethod invokeWithBridge:module:arguments:] + 1860 12 React 0x000000010158d45c _ZN8facebook5reactL11invokeInnerEP9RCTBridgeP13RCTModuleDatajRKN5folly7dynamicE + 648 13 React 0x000000010158cff4 _ZZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEiENK3$_0clEv + 144 14 React 0x000000010158cf58 ___ZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEi_block_invoke + 28 15 libdispatch.dylib 0x000000010252dd10 _dispatch_call_block_and_release + 32 16 libdispatch.dylib 0x000000010252f18c _dispatch_client_callout + 20 17 libdispatch.dylib 0x000000010253dd14 _dispatch_main_queue_callback_4CF + 996 18 CoreFoundation 0x00000001a810341c 9624AAFD-5437-3772-A507-0F357875808D + 709660 19 CoreFoundation 0x00000001a80fe034 9624AAFD-5437-3772-A507-0F357875808D + 688180 20 CoreFoundation 0x00000001a80fd660 CFRunLoopRunSpecific + 480 21 GraphicsServices 0x00000001b250e604 GSEventRunModal + 164 22 UIKitCore 0x00000001ac2d215c UIApplicationMain + 1944 23 duonuo_xixun_app 0x000000010028a7c4 main + 128 24 libdyld.dylib 0x00000001a7f791ec 95B366E7-F5BD-3308-9416-24B35999029B + 4588 )

然后我去微信官网搜索错误信息,得到的答案都是 添加 other linker flags 选项 -Objc -all_load,但是不起任何作用,依旧是报错。

分享到小程序略缩图不存在导致app闪退

按照文档的写法

WeChat.shareMiniProgram({
  title: 'Mini program.',
  userName: 'gh_d39d10000000',
  webpageUrl: 'https://google.com/show.html',
  thumbImageUrl: 'https://google.com/1.jpg',
  scene: 0
})

执行后报错闪退,希望能在 java 里 catch 一下不要崩溃.log:

1.png

关于Universal Links

没配置Universal Links时,使用不了,后面配了之后,debug可以使用,但是分享都是跳转到朋友圈,且中间会有正在连接小程序的过程,关于这块文档中可以写得更详细一些吗?

API文档有问题,分享scene错了

/*! @brief 请求发送场景
 *
 */
enum WXScene {
    WXSceneSession          = 0,   /**< 聊天界面    */
    WXSceneTimeline         = 1,   /**< 朋友圈     */
    WXSceneFavorite         = 2,   /**< 收藏       */
    WXSceneSpecifiedSession = 3,   /**< 指定联系人  */
};

朋友圈是1,收藏是2。readme文档里朋友圈是2,收藏是3 。

ios Universal Link doesn't trigger url event. 用universal link 回到app后 Linking.addEventListener('url', this._handleUrl); 不工作

求大神帮助!
在更改 AppDelegate.m 之前 universal link是可以tigger url event的
JS代码 如下

componentDidMount() {
    Linking.getInitialURL().then(url => {
      this._handleUrl({ url });
    });
    Linking.addEventListener('url', this._handleUrl);
}

加了下面的代码到AppDelegate.m之后,getInitialURL 还工作 但是url event没有反应(已经打开app一次以后)

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
  // Triggers a callback event.
  // 触发回调事件
  [RCTLinkingManager application:app openURL:url options:options];
  return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
  continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable
  restorableObjects))restorationHandler {
  // 触发回调方法
  [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
  return [WXApi handleOpenUniversalLink:userActivity
  delegate:self];
}

我尝试加了一行代码 改成

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
  // Triggers a callback event.
  // 触发回调事件
  [super application:app openURL:url options:options]; //加了这行
  [RCTLinkingManager application:app openURL:url options:options];
  return [WXApi handleOpenURL:url delegate:self];
}

改完以后用schema link跳转时就能得到url event,但是universal link 还是不行
e.g. 点击 myapp://something 可以跳转到app,url event 也会被trigger 可以在app里拿到url
点击 www.myapp.com/something 可以跳转到app,但是url event不会trigger,无法获取跳转的url
微信登陆 分享 还有universal link本身都工作,只是url event 不会被trigger

registerApp是强制要求universalLink?

  1. registerApp 是强制要求 universalLink 吗 如果没写会抛出异常,状态如下
{ [Error: WeChat API invoke returns false.]
  line: 116691,
  column: 36,
  sourceURL: 'http://192.168.2.13:8081/index.bundle?platform=ios&dev=true&minify=false' },
  1. 如果没注册成功会导致其他api都没法正常调用, 这个应该是正常的,但是出错了缺没有将错误抛出,导致js层没法处理异常,如关闭Loading层。

而且我建议重新封装js层来更加友好的抛出异常, 更好的回馈不应该是由errCode来决定成功和失败, 而是成功就是顺利执行, 失败则是抛到异常层 (如果需要的话,我可以帮忙封装RN对接层)
看好这个库 之前的react-native-wechat真的太老了

nativeShareToTimeline is not a function

环境:rn0.59 ios12.4.3

try {
let result = await WeChat.shareToTimeline({
type: 'text',
description: 'hello, wechat'
});
console.log('share text message to time line successful:', result);
} catch (e) {
console.log("haha",e);
}

报错:
haha TypeError: nativeShareToTimeline is not a function
at index.js:300
at initializePromise (promisify.js:709)
at new Promise (promisify.js:1133)
at Object.shareToTimeline (index.js:299)
at Share.wechatShareSession$ (index.js:50)
at tryCatch (runtime.js:45)
at Generator.invoke [as _invoke] (runtime.js:271)
at Generator.prototype. [as next] (runtime.js:97)
at tryCatch (runtime.js:45)
at invoke (runtime.js:135)

ios 設置完後,需不需要做任何教程以外的事?

我照著教程做了一次 包含npm install, link 還有 ios的設置
需求只有分享到好友圈
做完教程設定後,每次分享還是一直跳出
Error: WeChat API invoke returns false.

我的universal link放的 https://www.google.com
我是看作者說可以隨意放,所以就放了這個
然後在微信公開平台上
我也把app 的universal link設置為 https://www.google.com

我用了 WeChat.register("appid", "https://www.google.com")
這頁沒有出現問題
但是當用了分享到好友圈時
一直出現 Error: WeChat API invoke returns false.
想知道除了教程的步驟外 需要額外設置什麼嗎?
因為我看了微信的SDK文檔 還要設定一些跟universal link有關的設置
(文檔網址: https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html)
想知道我們需要自己做那些事情嗎?

IOS Use of undeclared identifier 'WXApi'

大佬您好 iOS引入这一块之后 会找不到WXApi 这个应该怎么解决
` - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:self];
}

  • (BOOL)application:(UIApplication *)application
    continueUserActivity:(NSUserActivity *)userActivity
    restorationHandler:(void(^)(NSArray<id> * __nullable
    restorableObjects))restorationHandler {
    return [WXApi handleOpenUniversalLink:userActivity
    delegate:self];
    }`

android 打包后分享 `shareWebpage` 报错

debug版没问题,release后报错

 Attempt to invoke virtual method 'boolean 
android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, 
java.io.OutputStream)' on a null object reference

release 模式调起微信后直接返回APP,没有任何响应,直到超时

版本:1.1.16
微信版本:7.0.12
debug 模式下一切正常。
release 模式下调起微信后直接返回APP,没有任何响应,直到超时报错

` finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."

UserInfo={_kCFStreamErrorCodeKey=60, NSUnderlyingError=0x2806eaa60 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=60, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <38FF3F67-8F2B-45C6-80F0-5F04AC93B979>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <38FF3F67-8F2B-45C6-80F0-5F04AC93B979>.<1>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://clients3.google.com/generate_204, NSErrorFailingURLKey=https://clients3.google.com/generate_204, _kCFStreamErrorDomainKey=1}`

手动升级到1.8.6.1的步骤

原理:替换原生sdk,替换桥接文件
老项目一般都是使用的微信三方组件react-native-wechat,react-native-wechat最新的版本使用的1.7.2的微信sdk,由于微信通知要在2020年6月1日之前逐步回收老版本的sdk能力,所以不得不对微信sdk进行升级,以下分别是iOS和安卓的升级步骤
首先从github下载react-native-wechat-lib的项目源码,该项目是使用了最新版本微信sdk的rn组件
组件作者推荐使用npm安装,但是我测试发现npm安装会产生一些其他的问题,于是全部采用手动操作
进行升级之前先将react-naitve-wechat-lib项目源码拷贝至你项目根目录的node-modules文件夹内

#iOS升级步骤

  1. 在xcode中删除原有RCTWeChat项目的引用,添加react-native-wechat-lib的project引用(项目名字也是RCTWeChat)
  2. 在Build Phase选项卡中打开Link Binary With Libraries,将libRctWeChat.a、WebKit.framework添加到列表中
  3. 打开AppDelegate.h,添加#import "WXApi.h",并在AppDelegate中添加WXApiDelegate,如图
    WX20200323-095500@2x.png

然后再AppDelegate.m中添加如下代码

#pragma mark - 跳转微信必须加以下代码否则无法跳转
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application
  continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable
  restorableObjects))restorationHandler {
  // 触发回调方法
  [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
  return [WXApi handleOpenUniversalLink:userActivity
  delegate:self];
}

如果出现报错找不到WXApi、RCTLinkingManager,你需要在Build Settings中添加Header Search Path如下

$(SRCROOT)/../node_modules/react-native-wechat-lib/ios
$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS
  1. 配置Universal Link,在Xcode的Signing&Capability选项卡中添加Associated Domains,将你选定的域名填进去,必须是https的,然后在微信开放平台中设置UniversalLink,必须与xcode中的一致,universallink设置方法参考苹果的文档和微信的开发者文档
  2. info.plist的LSApplicationQueriesSchemes
    WX20200323-100338@2x.png

安卓升级步骤

安卓升级相对简单,打开rn工程目录,用Android Studio打开android原生项目,将setting.gradle中的react-native-wechat改为react-native-wechat-lib
include ':RCTWeChat'
project(':RCTWeChat').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-wechat-lib/android')

然后编译,Android Studio会报错,根据提示添加缺少的引用即可,之后编译没有问题,即可升级成功

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.