React-native-iap: RNIap.getProducts tidak mengembalikan janji di ios

Dibuat pada 19 Des 2018  ·  24Komentar  ·  Sumber: dooboolab/react-native-iap

Versi react-native-IAP

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

Versi react-native

"react-native": "0.57.4",

Platform yang Anda hadapi kesalahan (IOS atau Android atau keduanya?)

IOS

Perilaku yang diharapkan

buyProduct harus mengembalikan janji (.then () bukan panggilan),

Perilaku sebenarnya

buyProduct tidak mengembalikan janji apa pun, di android berfungsi dengan baik, panggilan .then () berhasil, tetapi di iOS tidak.

Lingkungan yang diuji (Emulator? Perangkat Nyata?)

Perangkat Nyata

Langkah-langkah untuk mereproduksi perilaku

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 });
      })
  }

Di ios saya sudah membeli produk, jadi ketika saya tekan beli sekarang, saya mendapatkan popup seperti Anda sudah membeli produk ini. tapi kemudian mengucapkan selamat () atau .catch () tidak mendapatkan panggilan.

saya juga mencoba metode getAvailablePurchases (), selalu kembali []

📱 iOS 🙏 help wanted

Komentar yang paling membantu

Bisakah Anda mencoba 2.4.0-beta4 ?

Semua 24 komentar

@LinusU Saya pikir @JJoon benar. Saya telah menghapus semua async dan masalah muncul lagi. Bagaimana menurut anda? @ ZeroCool00 Apakah Anda akan menurunkan versi ke 2.3.24 untuk saat ini?

@ ZeroCool00 Sebenarnya, maukah Anda mencoba 2.3.26 untuk kami?

@hyochan saya akan segera menguji .. dan memberi tahu Anda, dan terima kasih atas balasan cepatnya.

@ Hyochan saya coba dengan 2.3.26, tidak berhasil? ada solusi?

@ ZeroCool00 Maka itu pasti ada masalah penautan. Anda harus mencoba unlink dan kembali- link lagi.

@hyochan saya mencoba, bahkan saya memutuskan tautan dan kemudian menghapus dan menginstal lagi, dan menautkan lagi. tapi masih belum berhasil

@ ZeroCool00 Jika Anda berada di jendela, skrip tautan react-native bahkan lebih tidak stabil. Apakah Anda mencoba secara manual? Juga coba 2.3.24 juga. Saya pikir Anda menghadapi beberapa masalah konfigurasi.

@hyochan im di mac, dan saya memutuskan tautan dan kemudian menghapus instalan lalu menginstal 2.3.24, dan melakukan pengaturan manual, ikuti setiap langkah, ini berfungsi dengan android, di ios masih belum muncul. proses bekerja dengan baik. im mendapatkan popup dan produk juga mendapatkan pembelian, tetapi tidak ada janji pengembalian.?

apakah ada konfigurasi lain untuk ios? Saya terjebak di sini, apakah ada cara lain untuk mendapatkannya yang sudah saya beli.

@JJMoon Bisakah Anda membantu @ ZeroCool00 ?

@ ZeroCool00 Coba juga hapus Alert dan gunakan console sebagai gantinya. Karena ios secara otomatis menghasilkan Alert saat pembelian sedang diproses yang dapat mengganggu kode Anda.

@hyochan Tlg buka lagi ini .. saya sudah mencoba semuanya .. saya juga menghapus Alert. bahkan saya berhenti debugging dan memeriksa .. itu hanya tidak berfungsi. saya ingin mempublikasikan aplikasi saya, tetapi saya terjebak di sini. saya bahkan mencoba lib ini https://github.com/chirag04/react-native-in-app-utils

lib ini juga memiliki masalah yang sama .. proses pembelian bekerja dengan baik tetapi tidak mendapatkan janji apapun.

apakah ada metode siklus hidup di mana saya mendapatkan event callback. saya hanya ingin event callback dimana saya bisa memanggil api server.

@ ZeroCool00 Bisakah Anda mencoba menggunakan async dan await juga? Saya juga menggunakan ini di aplikasi kami dan kami tidak menghadapi masalah ini.

@hyochan dapatkah Anda memberikan demo Anda .. bagaimana Anda menggunakannya .. itu akan sangat membantu.

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 Saya mengikuti apa yang Anda katakan, tampaknya proses ini tidak terbatas, tidak mengembalikan apa pun. saya bahkan tidak mendapatkan log.

Karena banyak orang lain menggunakan modul kami hari ini, casing Anda terlihat cukup aneh. Akan sulit bagi kami untuk mengetahuinya kecuali kami memiliki kode kerja Anda yang lengkap.

@hyochan Memiliki masalah yang sama seperti @ ZeroCool00
Baru saja diupgrade dari 2.3.26 ke 2.4.0-beta3 (membuat unlink dan link), cerita yang sama.
Mendapatkan ini di log dari perangkat. Menggunakan iPhone asli, pengembangan dibangun melalui xCode (terhubung kabel).

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

Tapi pop-up dengan pembelian muncul, dengan kisah sukses. Tapi tidak ada reaksi di Javascript Thread di atasnya :(
Janji tidak diselesaikan atau ditolak dalam modul iOS.

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
Bahkan tidak muncul. Cerita yang sama tanpa async / await, dengan menyelesaikan janji .then .

Adakah ide apa yang mungkin menyebabkan masalah ini?

Bisakah Anda mencoba 2.4.0-beta4 ?

@hyochan Terima kasih banyak 👍
Masalah diselesaikan di pihak saya.

@IsaevTimur bagaimana Anda mengatasinya? itu masih tidak berfungsi.

@hyochan Berikut adalah kode lengkap modul pembelian aplikasi saya

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);

@ Zero

Pastikan Anda menggunakan - 2.4.0-beta4.

Juga, pastikan bahwa Anda menggunakan pengguna SANDBOX (dalam pengembangan). Yang dapat dikonfigurasi di koneksi iTunes. Pengguna ini dibuat di sini - https://appstoreconnect.apple.com/access/users , di bawah bagian Sandbox.

Semoga membantu :)

@Tokopedia
tetapi proses pembelian toko aplikasi saya berfungsi dengan baik yang berarti semuanya sudah dikonfigurasi, dan ya saya menggunakan 2.4.0-beta4.

ini entri saya di file package.json

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

@hyochan saya akhirnya memecahkan masalah .. Masalahnya adalah ketika saya tes pertama saya tidak menulis baris ini await RNIap.finishTransaction(); dalam metode .then (). saya menambahkannya sesudahnya. itu masalahnya, solusinya adalah saya perlu menghapus transaksi ( await RNIap.clearTransaction(); ), dan itu berhasil.

Sekali lagi terima kasih atas dukungan Anda untuk perpustakaan hebat ini.

@ ZeroCool00 Selamat atas kesuksesannya !! Ya, masalah semacam itu harus diselesaikan dengan lebih baik di pihak Anda karena kami membutuhkan daya tarik atas kesalahan Anda. Terima kasih telah kembali lagi untuk mereka yang mungkin menderita pada hal yang sama.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat