3

Android上的地图标记存在问题,似乎没有人可以修复它。解决方法是点击地图标记 3 次,它将正确打开带有图像的标注/注释。

如何,我可以以编程方式执行此操作吗?每次用户点击时,我想点击标记 3 次。

<MapView.Marker
  key={marker.key}
  coordinate={marker.latlng}
  title={marker.title}
  description={marker.description}
>
  <MapView.Callout style={styles.annotation}>
    <Image
      key={marker.key}
      source={{ uri: marker.image }}
      style={styles.thumbnail}
    />
  </MapView.Callout>
</MapView.Marker>
4

1 回答 1

5

tl; dr:出于安全原因,这是不可能的。如果用户应用程序能够创建“合成”触摸,则恶意应用程序可能会使用此功能来强制用户设备“自行”操作。如果您想阅读我对该主题的研究,请继续阅读。

据我所知,你不能在 React Native 的 JavaScript 端做到这一点。您需要设置一些自定义逻辑才能在本机端发出本机事件。

原因是 React Native 的 JS 端只能处理它通过原生桥接接收到的原生事件(如触摸)。然后这些事件将触发事件处理代码,例如由Touchable*组件(例如TouchableHighlightTouchableOpacity其他)提供的代码。据我所知,按照单向数据流的原则,没有办法从 JS 端发出原生事件。

另一方面,虽然您可以从本机端发出任意本机事件,但您将无法知道 JavaScript 端在做什么,除非您以某种方式检查发送到本机端渲染方法的数据,这将如果不是不可能的话,可能会非常艰难。

因此,解决此问题的最佳方法是在本机代码中创建一个自定义视图类,该类在被触摸时触发多个触摸事件,并将其包装到一个 React Native 组件中,如iOSAndroid指南中所述。但是,这样做时会出现问题:

在 iOS 中,用户代码没有公开可用的方法来创建UITouch对象并将它们分派到 UI。您需要使用未公开的 API 方法来执行此操作,该方法可能随时更改,并且如果您尝试将其提交到 App Store,您的应用程序将被拒绝这里记录了一种方法但它可能已经过时,因为 Apple 不保证未公开的 API 保持稳定。关于为什么在 iOS 上模拟触摸事件不是一个好主意并且导致您的应用被拒绝的原因,已经有一些 关于 SO 的答案。

在 Android 上,这已在 android-platform 邮件列表中进行了详细讨论,普遍的共识是不应该从用户代码触发任意触摸事件。尝试以编程方式调度MotionEvents 似乎会导致奇怪和不可靠的行为,如该问题的第二个答案、答案的后续评论和该问题的答案所示。

甚至 React Native 也不会创建自己的触摸事件——它只是接收原生视图生成的触摸事件。所有React Native Gesture Responder System都只是封装了本地可用的公共 API——创建触摸事件的 API 似乎并不公开。

所有这一切让我相信,如果不使用私有 iOS/Android API,您想要做的事情根本不可能,很可能是出于安全考虑

于 2017-04-16T04:34:54.110 回答