React-native-iap: RNIap.getProducts gibt auf ios kein Versprechen zurück

Erstellt am 19. Dez. 2018  ·  24Kommentare  ·  Quelle: dooboolab/react-native-iap

Version von react-native-iap

"react-native-iap": "^ 2.3.25"

Version von React-Native

"reaktionsnativ": "0,57,4",

Plattformen, auf denen Sie den Fehler hatten (IOS oder Android oder beides?)

IOS

Erwartetes Verhalten

buyProduct sollte Versprechen zurückgeben (.then () wird nicht aufgerufen),

Tatsächliches Verhalten

buyProduct gibt kein Versprechen zurück, in Android funktioniert es gut, .then () ruft erfolgreich auf, aber in ios ist es nicht.

Getestete Umgebung (Emulator? Reales Gerät?)

Echtes Gerät

Schritte zum Reproduzieren des Verhaltens

onBuyNowPress() {
    this.setState({ loading: true });
    RNIap.getProducts(['product_id']).then(success => { 
       RNIap.buyProduct('product_id').then(purchase => { 
        console.log("Purchase >>", purchase)
        this.setState({
          loading: false,
          receipt: purchase.transactionReceipt, 
        });
        Alert.alert('Purchase Successful!');
        this.props.getPurchase();
       }).catch(err => { 
         console.log(err.code, err.message);
          this.setState({ loading: false });
          Alert.alert(err.message);
          if(err.message === "You already own this item.") {
            this.props.getPurchase();
          }
        }) 
      }).catch(error => { 
        alert(error); 
        this.setState({ loading: false });
      })
  }

In ios kaufe ich bereits ein Produkt. Wenn ich jetzt auf "Jetzt kaufen" drücke, wird ein Popup angezeigt, als ob Sie dieses Produkt bereits gekauft hätten. aber .then () oder .catch () werden nicht angerufen.

Ich habe auch versucht, getAvailablePurchases () Methode, es ist immer return []

📱 iOS 🙏 help wanted

Hilfreichster Kommentar

Könnten Sie 2.4.0-beta4 versuchen?

Alle 24 Kommentare

@LinusU Ich denke @JJMoon hatte recht. Ich habe alle async und das Problem tritt erneut auf. Was denkst du? @ ZeroCool00 Würden Sie 2.3.24 ?

@ ZeroCool00 Würden Sie bitte 2.3.26 für uns versuchen?

@hyochan Ich werde bald testen .. und lassen Sie es wissen, und danke für die schnelle Antwort.

@ Hyochan Ich habe es mit 2.3.26 versucht, es funktioniert nicht? irgendeine Lösung?

@ ZeroCool00 Dann muss es ein Verbindungsproblem sein. Sie sollten versuchen, unlink und link erneut.

@hyochan Ich habe versucht, auch ich die Verknüpfung

@ ZeroCool00 Wenn Sie sich im Fenster befinden, ist das 2.3.24 . Ich denke, Sie haben ein Konfigurationsproblem.

@hyochan Ich bin auf dem Mac, und ich

Gibt es eine andere Konfiguration für iOS? Ich stecke hier fest, gibt es einen anderen Weg, um zu bekommen, dass ich bereits kaufe.

@JJMoon Könnten Sie @ ZeroCool00 helfen?

@ ZeroCool00 Versuchen Sie auch, Alert entfernen und verwenden Sie stattdessen console zum Testen. Weil ios automatisch native Alert generiert, wenn der Kauf verarbeitet wird, was Ihren Code unterbrechen kann.

@hyochan Plz wieder öffnen .. Ich habe alles versucht .. Ich entferne auch Alert. Sogar ich höre auf zu debuggen und überprüfe .. es funktioniert einfach nicht. Ich wollte meine App veröffentlichen, aber ich stecke hier fest. Ich habe sogar diese Bibliothek https://github.com/chirag04/react-native-in-app-utils ausprobiert

Diese Bibliothek hat auch das gleiche Problem. Der Kaufprozess funktioniert gut, bekommt aber kein Versprechen.

Gibt es eine Lebenszyklusmethode, bei der ich einen Ereignisrückruf erhalte? Ich möchte nur einen Ereignis-Rückruf, bei dem ich die Server-API aufrufen kann.

@ ZeroCool00 Könnten Sie versuchen, auch async und await ? Ich verwende dies auch in unserer App und wir sind nicht mit diesem Problem konfrontiert.

@hyochan können Sie bitte Ihre Demo zur Verfügung stellen .. wie verwenden Sie es .. es wäre eine große Hilfe.

async forIOS() {
    let purchase =  await RNIap.buyProduct('product_id');
    console.log("BannerPurchase >>",purchase);  **<--- THIS IS NOT GETTING CALL**
    if(purchase) {
      console.log("Purchase >>", purchase)
      this.props.getPurchase();
      this.setState({
        loading: false,
        receipt: purchase.transactionReceipt, 
      });
      console.log('Purchase succesfully')
    }
  }

@hyochan Ich folge dem, was du sagst, es scheint, dass dieser Prozess unendlich ist und nichts zurückgibt. Ich bekomme nicht einmal das Protokoll.

Da heutzutage viele andere unsere Module verwenden, sieht Ihr Fall ziemlich seltsam aus. Es wäre schwer für uns herauszufinden, wenn wir nicht einen vollständigen Arbeitscode von Ihnen haben.

@hyochan Mit dem gleichen Problem wie @ ZeroCool00
Gerade von 2.3.26 auf 2.4.0-beta3 aktualisiert (Verknüpfung und Verknüpfung hergestellt), die gleiche Geschichte.
Abrufen dieser Protokolle vom Gerät. Mit echtem iPhone wird die Entwicklung über xCode (Kabel verbunden) erstellt.

[IAPInfoManager]: Update operation failed, error: Error Domain=SSErrorDomain Code=109 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store, SSErrorHTTPStatusCodeKey=401}

Aber Popups mit Kauf zeigen sich mit Erfolgsgeschichte. Aber keine Reaktion in Javascript Thread darauf :(
Das Versprechen wird im iOS-Modul nicht gelöst oder abgelehnt.

try {
      let purchase = false;

      console.log('BEFORE BUY');
      if (Platform.OS === 'ios') {
        purchase = await RNIap.buyProduct(selected);
      } else {
        purchase = await RNIap.buySubscription(selected);
      }
      console.log('AFTER BUY');

      await RNIap.finishTransaction();
      console.info('purchase >', purchase);
      setSubscription({type: selected, purchaseData: purchase});
    } catch (err) {
      console.log(err); // TODO add something went wrong
    }

AFTER BUY
Erscheint nicht einmal. Die gleiche Geschichte ohne Async / Warten, mit der Lösung von .then Versprechen.

Irgendwelche Ideen, was dieses Problem verursachen könnte?

Könnten Sie 2.4.0-beta4 versuchen?

@hyochan Vielen Dank 👍
Problem auf meiner Seite gelöst.

@IsaevTimur wie hast du es gelöst? Es funktioniert immer noch nicht.

@hyochan Hier ist der vollständige Code meines Inapp-Kaufmoduls

import React, { Component } from 'react';
import { View, ImageBackground, TouchableOpacity, Image, Alert, 
  ActivityIndicator, Platform } from 'react-native';
import {inapp, btnBuy, purple} from '../helper/constants';
import ImageResizeMode from 'react-native/Libraries/Image/ImageResizeMode'
import { connect } from 'react-redux';
import { Icon } from 'native-base';
import { Actions } from 'react-native-router-flux';
import * as RNIap from 'react-native-iap';
import { getItems, getPurchase, fetchCategory } from '../action';

const itemSkus = Platform.select({
  ios: [
    'max_asl_unlimited_access'
  ],
  android: [
    'max_asl_unlimited_access'
  ]
});

class Banner extends Component {

  constructor(props){
    super(props);
    this.onBuyNowPress = this.onBuyNowPress.bind(this);
    this.forAndroid = this.forAndroid.bind(this);
    this.forIOS = this.forIOS.bind(this);
  }

  state = {
    loading: false,
  }

  async componentDidMount() {
    try {
      const result = await RNIap.initConnection();
      console.log('result', result);
      this.props.getItems();
    } catch (err) {
      console.warn(err.code, err.message);
    }
}

  componentDidUpdate(prevProps) {
    if(prevProps.purchase !== this.props.purchase) {
      this.props.fetchCategory();
    } 
  }

  onBuyNowPress() {
    this.setState({ loading: true });
    RNIap.getProducts(itemSkus).then(success => { 
      if(Platform.OS == "ios") {
        this.forIOS()
      } else {
        this.forAndroid()
      }
    }).catch(error => { 
      alert(error); 
      this.setState({ loading: false });
    })
  }

  async forIOS() {
    console.log('BannerCall');
    try {
      const purchase = await RNIap.buyProduct('max_asl_unlimited_access');
      console.log("BannerPurchase >>",purchase);
      if(purchase) {
        this.props.getPurchase();
        this.setState({
          loading: false,
        });
        console.log('Purchase succesfully')
      }
    } catch (err) {
      console.log("BannerError >> ", err);
    }
  }

  forAndroid() {
    RNIap.buyProduct('max_asl_unlimited_access').then(purchase => { 
      this.props.getPurchase();
      this.setState({
        loading: false,
        receipt: purchase.transactionReceipt, 
      });
      console.log('Purchase succesfully')
      Alert.alert("Purchase succesfully")
     }).catch(err => { 
       console.log(err.code, err.message);
        this.setState({ loading: false });
        if(err.message === "You already own this item.") {
          this.props.getPurchase();
          Alert.alert("You already own this product, we are restoring your purchase.")
        }
      }) 
  }

  componentWillUnmount() {
    RNIap.endConnection();
  }

  renderSpinner() {
    if(this.state.loading) {
      return (
        <ActivityIndicator size="large" color="#F7CD52" />
      )
    }
    return null
}

  render() {
    const { container, bannerStyle, btnContainer, iconClose } = styles;
    return (
      <View style={container}>
          <ImageBackground source={inapp} style={bannerStyle} resizeMode={ImageResizeMode.contain}>
              <Icon name="close" style={iconClose} type="FontAwesome" onPress={() => {Actions.pop()}}/>
              <View style={btnContainer}>
                {this.renderSpinner()}
                <TouchableOpacity onPress={() => this.onBuyNowPress()}>
                    <Image source={btnBuy}  />
                </TouchableOpacity>
              </View>
          </ImageBackground>
      </View>
    );
  }
}


const styles = {
  container: {
    flex: 1,  
  },
  iconClose: {
    color: '#FFF',
    fontSize: 30,
    alignSelf: 'flex-end',
    margin: 20,
    fontWeight: 'bold',
  },
  bannerStyle: {
    flex: 1,
    width: '100%',
    height: '100%',
    backgroundColor: purple
  }, 
  btnBuy: {
    marginRight: 20,
    marginTop: 160,
    height: 85,
    width: 215,
  },
  btnContainer: {
    flex: 1,
    marginTop: 50,
    justifyContent: 'center',
    alignItems: 'center'
  }
};

function mapStateToProps({ purchase }) {
    return { purchase };
}

export default connect(mapStateToProps, { getItems, getPurchase, fetchCategory })(Banner);

@ ZeroCool00

Stellen Sie sicher, dass Sie - 2.4.0-beta4 verwenden.

Stellen Sie außerdem sicher, dass Sie den SANDBOX-Benutzer (in Entwicklung) verwenden. Welches kann in iTunes Connect konfiguriert werden. Diese Benutzer wurden hier erstellt - https://appstoreconnect.apple.com/access/users im Abschnitt Sandbox.

Ich hoffe es hilft :)

@ IsaevTimur
Aber mein Kaufprozess im App Store funktioniert einwandfrei, was bedeutet, dass alles konfiguriert ist, und ja, ich verwende 2.4.0-beta4.

Hier ist mein Eintrag in der Datei package.json

"react-native-iap": "^2.4.0-beta4",

@hyochan Ich habe endlich das Problem gelöst. Das Problem ist, als ich das erste Mal getestet habe, dass ich diese Zeile nicht geschrieben habe. await RNIap.finishTransaction(); in .then () Methode. Ich habe es danach hinzugefügt. Das war das Problem. Die Lösung ist, dass ich die Transaktion löschen muss ( await RNIap.clearTransaction(); ), und es funktioniert.

Nochmals vielen Dank für Ihre Unterstützung n für diese großartige Bibliothek.

@ ZeroCool00 Herzlichen Glückwunsch zum Erfolg! Ja, diese Art von Problem sollte auf Ihrer Seite besser gelöst werden, da wir etwas Traktion brauchen, was Sie falsch gemacht haben. Vielen Dank, dass Sie wiederkommen, für diejenigen, die unter der gleichen Sache leiden könnten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen