React-native-onesignal: (v3.2.1) (iOS) pushToken null 在真实设备上

创建于 2018-05-14  ·  36评论  ·  资料来源: OneSignal/react-native-onesignal

描述:
无法获得 pushToken,仪表板上没有一个 ios 用户,我尝试了 evthing,我重新创建了证书、密钥,使用了配置工具,尝试了不同的真实设备。

在 android 上,一切都像魅力一样。

环境

  1. 您使用的是哪个版本的 OneSignal React-Native SDK: latest 3.2.1
  2. 您是如何将 SDK 添加到您的项目中的(例如 npm) npm i --save react-native-onesignal
  3. [email protected]
  4. Xcode Version 9.3 (9E145)
  5. Node.js 8.4.0

我的 package.json

package json rbtse 2018-05-14 11-59-05

重现问题的步骤:

  1. 在 onesignal.com 上遵循所有可能的变体
  2. 在这个 repo 的示例文件夹中添加 js 代码
  3. 在真实设备上测试(iphone x with ios 11, iphone 6s with ios 10)

js代码

export default class App extends Component {
  componentWillMount() {
    OneSignal.setLogLevel(7, 0);
    OneSignal.init('here my ONESIGNAL APP ID - I checked it twenty times', { kOSSettingsKeyAutoPrompt: true });
    OneSignal.setSubscription(true);
    OneSignal.enableSound(true);
    OneSignal.enableVibrate(true);
    OneSignal.inFocusDisplaying(2);

    OneSignal.getPermissionSubscriptionState((response) => {
      console.log('Received permission subscription state: ', response);
    });
  }

我收到了getPermissionSubscriptionState回复:

{
  emailAddress:null
  emailSubscribed:false
  emailUserId:null
  hasPrompted:true
  notificationsEnabled:true
  pushToken:null
  subscriptionEnabled:false
  userId:null
  userSubscriptionEnabled:true
}

当然,仪表板上没有一个 ios 用户。

另外我在 xcode 中看到日志

Called init with app ID: (null)
2018-05-14 11:21:03.636571+0300 rbtse[15320:6135130] Called init with app ID: xxxxxx-ea78-4b29-8b91-xxxxxxxxx (I changed app id)
2018-05-14 11:21:03.636758+0300 rbtse[15320:6135130] DEBUG: Downloading iOS parameters for this application
2018-05-14 11:21:03.642023+0300 rbtse[15320:6135181] VERBOSE: getNotificationTypes:mSubscriptionStatus: -1
2018-05-14 11:21:03.643531+0300 rbtse[15320:6135130] VERBOSE: registerForPushNotifications Called:waitingForApnsResponse: 1
2018-05-14 11:21:03.690752+0300 rbtse[15320:6135130] VERBOSE: oneSignalApplicationWillResignActive
2018-05-14 11:21:03.986984+0300 rbtse[15320:6135181] VERBOSE: network response (OSRequestGetIosParams): {
    fba = 1;
}
2018-05-14 11:21:05.778574+0300 rbtse[15320:6135130] VERBOSE: oneSignalApplicationDidBecomeActive
2018-05-14 11:21:05.778918+0300 rbtse[15320:6135130] VERBOSE: getNotificationTypes:mSubscriptionStatus: -1
2018-05-14 11:21:05.792324+0300 rbtse[15320:6135130] VERBOSE: updateNotificationTypes called: 15
2018-05-14 11:21:05.792388+0300 rbtse[15320:6135130] VERBOSE: startedRegister: 1

最有用的评论

大家好@dooboolab @hhunaid @408dev @el-lsan @neo125874 @Jarred-Sumner

新的更新 (3.2.3)已经发布,应该可以解决这个问题。 如果您再次看到此问题(或其他问题),请随时告诉我,我们很乐意进行调查。

所有36条评论

我发现了同样的问题https://github.com/geektimecoil/react-native-onesignal/issues/502
所以我尝试降级到https://github.com/geektimecoil/react-native-onesignal/tree/3.1.4 - 按照所有步骤操作,现在它可以工作了!

react native debugger - connected port 8081 2018-05-14 12-24-59

users rbtse onesignal 2018-05-14 12-27-59

所以最后一个版本不起作用

嗨,当您安装最新版本的 react-native-onesignal (3.2.2) 并运行react-native link react-native-onesignal ,您能否打开 Xcode 项目并验证 RCTOneSignal 是否正确显示为您项目中的依赖项?

alt text

pushTokenuserId在真实设备上对我来说也是空的(在发布模式下)
image

[email protected]:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/react-native-onesignal/-/react-native-onesignal-3.2.2.tgz#d1ae1e95cc301b940120de29a29ae90f478c9a97"
  dependencies:
    invariant "^2.2.2"

(这次它不在我的 podfile 中)

@Jarred-Sumner 尝试从您的设备上卸载该应用程序,然后重新安装它,它是否提示您接受推送通知权限?

另外,只是为了检查一下,您确实在项目设置 > 功能中启用了推送通知功能,对吗?

@Jarred-Sumner 尝试从您的设备上卸载该应用程序,然后重新安装它,它是否提示您接受推送通知权限?

是的

另外,只是为了检查一下,您确实在项目设置 > 功能中启用了推送通知功能,对吗?

是的
image
image

我降级为v3.1.4 ,现在它发送pushTokenuserId

@Jarred-Sumner 为了更好地理解这个问题,ID 为空,但推送通知真的有效吗? 他们不应该,但我想仔细检查一下。

另外,你可以尝试更新到3.2.2,用JS初始化,然后在调用init之前调用OneSignal.setLogLevel(6, 0)吗? 你能告诉我你是否看到打印到控制台的任何错误吗?

问题在 3.2.2 上仍然存在。
设置日志级别打印以下输出

使用应用程序 ID 调用 init:(空)
(然后在日志下面的某个地方)
使用应用程序 ID 调用 init: (my-app-id)

但是 userId 仍然为空。 如果有帮助,我已经使用 CocoaPods 包含了该库

@hhunaid预计应用 ID 第一次为空(也许我们应该删除第一个日志语句以避免混淆)。

在用户接受真实 iOS 设备上的推送权限之前,用户 ID 也应该为空。 你能确认是这种情况吗? 如果是这样,你能不能发布一个链接到至少 15 秒的 Xcode 日志输出的日志级别(确保在调用 init 之前调用 setLogLevel)

@Nightsd01这不仅仅是 LOG 语句。 实际上有一个对具有空 appId 的 OneSignal 初始值设定项的调用。 我刚刚检查了一下,如果我在initOneSignal方法中删除该 init 行,一切正常。

@hhunaid是的,预计对初始化程序的第一次调用将使用空应用 ID,这是我们的包装器 SDK 的工作量。 你是说如果你删除第一个调用,“一切正常”......?

为了排除您可能进行的其他更改,您能否再次取消对 initOneSignal 的注释以验证它停止工作...?

你可以发布你的package.json以便我可以看到你使用的依赖项吗?

我已经尝试过使用和不使用提到的代码段,现在我可以自信地说它确实是罪魁祸首。 至少在我的应用程序中。
删除它会给我一个有效的 playerId 并且我的设备显示在 OneSignal 仪表板上。 这是以前没有发生的。

同样在这里。 PushToken 始终为空。 我将粘贴下面的屏幕截图。
screen shot 2018-05-16 at 3 55 07 am

我的 package.json 如下。

    "abortcontroller-polyfill": "^1.1.9",
    "immutability-helper": "^2.7.0",
    "mobx": "^4.2.1",
    "mobx-react": "^5.1.2",
    "moment": "^2.22.1",
    "react": "^16.3.2",
    "react-native": "^0.55.4",
    "react-native-amplitude-analytics": "^0.1.15",
    "react-native-animatable": "^1.2.4",
    "react-native-audio-recorder-player": "^1.0.15",
    "react-native-iap": "^1.0.1",
    "react-native-image-picker": "^0.26.10",
    "react-native-linear-gradient": "^2.4.0",
    "react-native-loading-spinner-overlay": "^0.5.2",
    "react-native-localization": "^1.0.7",
    "react-native-marquee": "^0.3.1",
    "react-native-modalbox": "^1.4.2",
    "react-native-onesignal": "^3.2.2",
    "react-native-permissions": "^1.1.1",
    "react-native-pinch-zoom-view": "^0.1.6",
    "react-native-sentry": "^0.36.0",
    "react-native-status-bar-height": "^2.0.0",
    "react-native-swiper": "^1.5.13",
    "react-navigation": "^2.0.1",
    "serializr": "^1.2.0"

@doobolab您正在使用 JS 初始化,对吗?

你能告诉我你在你的项目中在哪里调用OneSignal.init()吗?

对于我的生活,我_无法_重现这个问题。 如果有人可以在演示项目中重现此问题并将其发布,我们将能够_更快__更快地解决此问题。

@tavriaforever嗨,所以降级并调用 onesignal.init('app id') 会起作用吗?

同样的问题在这里,任何解决方案?

    "react": "16.3.1",
    "react-native": "0.55.3",
    "react-native-onesignal": "^3.2.0",

@Nightsd01
我在我的根index.tsx中调用它包装 RootStackNavigator。

class App extends React.Component {
  public componentDidMount() {
    OneSignal.init('****');
    OneSignal.addEventListener('received', this.onReceived);
    OneSignal.addEventListener('opened', this.onOpened);
    OneSignal.addEventListener('ids', this.onIds);
    OneSignal.enableVibrate(true);
    OneSignal.enableSound(true);

.....
public render() {
    return (
      <Provider
        store={ appStore }
        user={ userStore }
        player={ playerStore }
      >
        <View style={styles.container}>
          <RootStackNavigator />
        </View>
      </Provider>
    );

仍然遭受获得空令牌的痛苦。

@Nightsd01这里也一样。
在 RCTOneSignal.m 中使用appId:nil删除 init 有帮助

@Nightsd01我刚在 android 上试过,android 也有同样的问题。

我猜 JS 端初始化不是一个好主意。
我知道它使网络开发人员或没有本地背景的人更容易使用该库。

@hhunaid听起来我应该降级?

@doobolab @408dev是的,如果您遇到此问题,我建议您暂时降级到 3.1.4,直到我们解决此问题。 道歉。 请记住,JS init 在 3.1.4 中不受支持,因此您需要按照指南将本机初始化代码添加到您的项目中。

@hhunaid它确实让

作为更新,我们已经能够重现此问题并确定了原因,我们将很快推出更新以解决该问题。

大家好 - 这个问题已经在一个新的 PR (#512) 中得到解决。 我们希望在接下来的一两个小时内将其合并并发布新的更新。 谢谢你的耐心!

大家好@dooboolab @hhunaid @408dev @el-lsan @neo125874 @Jarred-Sumner

新的更新 (3.2.3)已经发布,应该可以解决这个问题。 如果您再次看到此问题(或其他问题),请随时告诉我,我们很乐意进行调查。

@Nightsd01
我正在使用

  "react": "16.3.1",
  "react-native": "0.55.3",
  "react-native-onesignal": "^3.2.3",

在真实设备上一切正常,但我仍然在simulators上随机收到null userId simulators并且我没有看到任何设备被添加到我的播放器列表中! (到目前为止,我测试了 50 次以上,只有 2 次有效!)
我尝试清理和重建应用程序以及rm -rf node_modules/ && yarn cache clean && yarn install && yarn start -- --reset-cache但我仍然没有从OneSignal.getPermissionSubscriptionState获得预期的状态

{ userSubscriptionEnabled: true,
  subscriptionEnabled: false,
  pushToken: null,
  emailAddress: null,
  userId: null,
  hasPrompted: true,
  notificationsEnabled: true,
  emailUserId: null,
  emailSubscribed: false }

@el-lsan 这是预期的。 这是 Apple 的限制,而不是我们的限制。 iOS 模拟器无法接收推送通知。 他们不会获得 APNS 推送令牌,也不会注册 OneSignal。

如果您正在测试推送通知,则必须在真实的​​ iOS 设备上进行,无论您是否使用 OneSignal。

@Nightsd01
抱歉,我上一个帖子不是很清楚。 我的意思不是接收模拟器的推送,而是列出模拟器设备。
因此,在OneSignal.init('ONESIGNAL_APP_ID');我希望模拟设备会以Ios Simulator Unsupported标签列在我的订阅用户中,如下面的屏幕截图所示:

image

这是列出的模拟器的 OneSignal.getPermissionSubscriptionState 的响应:

image

但是大多数时候在模拟器上初始化失败,我在https://onesignal.com/apps/ONESIGNAL_APP_ID/players下看不到它

@el-lsan 我有同样的问题推送令牌为空,您找到解决方案了吗?

@adirzoari更新到"react-native-onesignal": "^3.2.3"该问题已针对真实设备修复,如果您的意思是为模拟器接收空令牌,我相信应该是这样。

另一方面,我希望为模拟器设置userId ,但由于某些奇怪的原因,它大部分时间都失败并返回 null!

我使用真实设备并获得空令牌

@adirzoari这很奇怪! 尝试清除缓存rm -rf node_modules/ && yarn cache clean && yarn install && yarn start -- --reset-cache并仔细检查步骤

@el-lsan pushToken 为空,但在 userId 中有唯一的字符串。 在一个信号中我得到
Google Play 服务库错误

我在 3.2.7(模拟器 - 正常/真实设备 - NOK)上遇到了同样的问题,但是按照@el-lsan 的建议清理缓存让它运行起来没有问题

@Nightsd01这里也一样。
在 RCTOneSignal.m 中使用appId:nil删除 init 有帮助

嗨,请您添加以下更改的图像。

@adirzoari更新到"react-native-onesignal": "^3.2.3"该问题已针对真实设备修复,如果您的意思是为模拟器接收空令牌,我相信应该是这样。

另一方面,我希望为模拟器设置userId ,但由于某些奇怪的原因,它大部分时间都失败并返回 null!

嗨,我在模拟器中得到pushToken:null ,并且只得到模拟器的 userId。
我会得到真实设备的pushToken吗,请确认,(我是否必须担心模拟器中的pushToken null问题?)。

此页面是否有帮助?
0 / 5 - 0 等级