3.3.9
0.59.9
iOSãšAndroid
Playã³ã³ãœãŒã«ãšAppstoreã§äœæãããäžé£ã®è£œåãšãµãã¹ã¯ãªãã·ã§ã³ãååŸã§ããããšãæåŸ ããŠããŸãã
é¢æ°RNIap.getProducts
ããã³RNIap.getSubscriptions
åžžã«ç©ºã®é
åãè¿ããŸãã
iOSã·ãã¥ã¬ãŒã¿ãŒãAndroidãšãã¥ã¬ãŒã¿ãŒãAndroidå®ããã€ã¹
ç§ã¯24æé以äžåŸ ã¡ãŸããã ãŸããGoogle Play Consoleã§å éšãªãªãŒã¹ãšã¢ã«ãã¡ãªãªãŒã¹ãäœæããŸããããããã§ã空ã®é åããè¿ãããŸããã
ç§ã¯ããããã€æ©èœãå§ãããšæ£ç¢ºã«æåŸ
ãã¹ããã«ã€ããŠå°ãäžæ確ã ãšæããŸãã ããšãã°ãã¢ã«ãã¡ãã¹ãã®ããŒã«ã¢ãŠãããŸã Google Play Consoleã§ã®å
¬éãä¿çããŠããå Žåãããã¯react-native-iap
ãæ©èœããªãããšãæå³ããŸããïŒ ã¢ããªãå
¬éããããŸã§åŸ
ã£ãŠããè©Šãå¿
èŠããããŸããïŒ
ãŸããã·ãã¥ã¬ãŒã¿ãŒ/ãšãã¥ã¬ãŒã¿ãŒã§ãã¹ã賌å
¥ããã§ããªãããšãç¥ã£ãŠããŸããã getProducts
/ getSubscriptions
ã¯ãšãã¥ã¬ãŒã¿ãŒã§åäœããå¿
èŠããããŸããããããšããã¹ãããããã«å®éã®ããã€ã¹ãå¿
èŠã§ããïŒ
const itemSkus = Platform.select({
ios: ['product_1'],
android: ['1', '2']
});
const itemSubs = Platform.select({
ios: ['subscription_1'],
android: ['subscription_1', 'subscription_2']
});
let purchaseUpdateSubscription;
let purchaseErrorSubscription;
class App extends Component {
constructor(props) {
super(props);
this.state = {
productList: [],
receipt: '',
availableItemsMessage: ''
};
}
async componentDidMount() {
SplashScreen.hide();
try {
const result = await RNIap.initConnection();
await RNIap.consumeAllItemsAndroid();
console.log('result', result);
} catch (err) {
console.warn(err.code, err.message);
}
purchaseUpdateSubscription = purchaseUpdatedListener(async purchase => {
console.log('purchaseUpdatedListener', purchase);
if (purchase.purchaseStateAndroid === 1 && !purchase.isAcknowledgedAndroid) {
try {
const ackResult = await acknowledgePurchaseAndroid(purchase.purchaseToken);
console.log('ackResult', ackResult);
} catch (ackErr) {
console.warn('ackErr', ackErr);
}
}
this.setState({ receipt: purchase.transactionReceipt }, () => this.goNext());
});
purchaseErrorSubscription = purchaseErrorListener(error => {
console.log('purchaseErrorListener', error);
Alert.alert('purchase error', JSON.stringify(error));
});
}
componentWillMount() {
if (purchaseUpdateSubscription) {
purchaseUpdateSubscription.remove();
purchaseUpdateSubscription = null;
}
if (purchaseErrorSubscription) {
purchaseErrorSubscription.remove();
purchaseErrorSubscription = null;
}
}
goNext = () => {
Alert.alert('Receipt', this.state.receipt);
};
getItems = async () => {
try {
const products = await RNIap.getProducts(itemSkus);
console.log('Products', products);
this.setState({ productList: products });
} catch (err) {
console.warn(err.code, err.message);
}
};
getSubscriptions = async () => {
try {
const products = await RNIap.getSubscriptions(itemSubs);
console.log('Products', products);
this.setState({ productList: products });
} catch (err) {
console.warn(err.code, err.message);
}
};
getAvailablePurchases = async () => {
try {
console.info('Get available purchases (non-consumable or unconsumed consumable)');
const purchases = await RNIap.getAvailablePurchases();
console.info('Available purchases :: ', purchases);
if (purchases && purchases.length > 0) {
this.setState({
availableItemsMessage: `Got ${purchases.length} items.`,
receipt: purchases[0].transactionReceipt
});
}
} catch (err) {
console.warn(err.code, err.message);
Alert.alert(err.message);
}
};
requestPurchase = async sku => {
try {
RNIap.requestPurchase(sku);
} catch (err) {
console.warn(err.code, err.message);
}
};
requestSubscription = async sku => {
try {
RNIap.requestSubscription(sku);
} catch (err) {
Alert.alert(err.message);
}
};
render() {
const { productList, receipt, availableItemsMessage } = this.state;
const receipt100 = receipt.substring(0, 100);
return (
<View style={styles.container}>
<View style={styles.header}>
<Text style={styles.headerTxt}>react-native-iap V3</Text>
</View>
<View style={styles.content}>
<ScrollView style={{ alignSelf: 'stretch' }}>
<View style={{ height: 50 }} />
<NativeButton
onPress={this.getAvailablePurchases}
activeOpacity={0.5}
style={styles.btn}
textStyle={styles.txt}
>
Get available purchases
</NativeButton>
<Text style={{ margin: 5, fontSize: 15, alignSelf: 'center' }}>
{availableItemsMessage}
</Text>
<Text style={{ margin: 5, fontSize: 9, alignSelf: 'center' }}>
{receipt100}
</Text>
<NativeButton
onPress={() => this.getItems()}
activeOpacity={0.5}
style={styles.btn}
textStyle={styles.txt}
>
Get Products ({productList.length})
</NativeButton>
{productList.map((product, i) => {
return (
<View
key={i}
style={{
flexDirection: 'column'
}}
>
<Text
style={{
marginTop: 20,
fontSize: 12,
color: 'black',
minHeight: 100,
alignSelf: 'center',
paddingHorizontal: 20
}}
>
{JSON.stringify(product)}
</Text>
<NativeButton
// onPress={() => this.requestPurchase(product.productId)}
onPress={() => this.requestSubscription(product.productId)}
// onPress={() => this.buyItem(product.productId)}
// onPress={() => this.buySubscribeItem(product.productId)}
activeOpacity={0.5}
style={styles.btn}
textStyle={styles.txt}
>
Request purchase for above product
</NativeButton>
</View>
);
})}
</ScrollView>
</View>
</View>
);
}
}
ããªãã¯å¿
èŠãããŸããreal device
ã§ã®ãã¹ãã«ios
ã«ã€ããŠgetProducts
/ getSubscription
ã§ã¯ãªãã android
ã android
å Žåã賌å
¥ããã«ã¯å®éã®ããã€ã¹ãå¿
èŠã§ãã
ã°ãŒã°ã«ã«ã€ããŠã¯ãããªãã®åé¡ã解決ããããã«
ãã¹ãã®ããã«å®éã«ã¢ããªãPlaystoreã«å
¬éããå¿
èŠã¯ãããŸãããã眲åãããapkãã¢ããããŒãããå¿
èŠããããŸãã
ç§ããã®åé¡ãæ±ããŠããŸãããã§ã«ã¢ããã«ã§è£œåãäœæããŸããããã¢ã¯ã»ã¹ã§ããªãããã§ãã
const itemSkus = Platform.select({
ios: [
'product1'
],
android: []
});
RNIap.getProducts(itemSkus).then((products) => {
console.log(products); //<< returns empty array
}).catch((error) => console.log(error))
補åãããªãã®çµéšã«åæ ãããã®ã«æéãããããŸããïŒ
å¥çŽãçšéãéè¡æ¥åã¯ãã¹ãŠã¢ã¯ãã£ãã§ã
"react-native-iap"ïŒ "^ 3.4.0"ã
ãããŠãã¢ããªå
ã¯ãã§ã«ãéä¿¡æºåå®äºãã¹ããŒã¿ã¹ã«ãªã£ãŠããŸã
@nateblogã©ããªååãäœããŸãããïŒ ãµãã¹ã¯ãªãã·ã§ã³ãŸãã¯äœãä»ã®ãã®ïŒ
ãŸãã補å/ãµãã¹ã¯ãªãã·ã§ã³ã®ããŒã«ãªãŒãŒã·ã§ã³ãApp Store Connectã«è¿œå ããŸãããïŒ ãã®å Žåã¯ãããã€ã¹ãŸãã¯ã·ãã¥ã¬ãŒã¿ãŒã§ã¢ã¯ãã£ãã«ããŠããããŒã«ãªãŒãŒã·ã§ã³ãè¿œå ããŠã¿ãŠãã ããã 以åãåé¡ããã£ãããšãèŠããŠããŸãã ç§ã®ã·ãã¥ã¬ãŒã¿ãŒãšããã€ã¹ã®ãã±ãŒã«ã¯è±èªãªã®ã§ããµãã¹ã¯ãªãã·ã§ã³ã«ãè±èªïŒUSïŒãããŒã«ãªãŒãŒã·ã§ã³ã®ã¿ãè¿œå ããŸããã
@ jvandenaardweg-åçããããšãããããŸããããŒã«ãªãŒãŒã·ã§ã³ãã¹ããããããšã¢ããªå ã¹ããŒã¿ã¹ããéä¿¡æºå
æŽæ°
ã¢ããªå æ©èœãæå¹ã«ããããã±ãŒãžã2.4.0ã«ããŠã³ã°ã¬ãŒãããããšã確èªããŸããããçµæã¯åãã§ãã ã 補åãå ¥æã§ããŸããã空ã®é åãè¿ãã ãã§ãã
ãŸããä»ã®æçš¿ãreact-nativeãªã³ã¯ã䜿çšããªãããšãææ¡ããŠããããããã§ãåãçµæãåŸããããããããã±ãŒãžãæåã§ãªã³ã¯ããŸããã ç§ã¯ã·ãã¥ã¬ãŒã¿ãŒãšå®éã®ããã€ã¹ã®äž¡æ¹ã䜿çšããŠããŸãã
ç³ãèš³ãããŸããããçŸåšæŽçãããŠããŸããåé¡ã¯xcodeã®ãã³ãã«IDã§ãããééã£ããã³ãã«IDã䜿çšããŠããŸããããã¹ãŠæ©èœããããã«ãªããŸããã
ç§ãåæ§ã§ãã©ã€ãã©ãªã®ãªã³ã¯ããã»ã¹ãæåã§è¡ãå¿ èŠããããŸããã ïŒiosïŒ
ç§ã¯åãåé¡ãæ±ããŠãããItunes Connectãã補åãããŒãããŠããããã©ãããåé¡ãæ¢ãå§ããã®ãããããŸããã ã¢ããªã¯å€ãããŒãžã§ã³ã®RNã䜿çšããŠããŸãïŒ0.43.4ã RN-IAPã®ããŒãžã§ã³3.3.7ãš2.5.5ãè©ŠããŸããã å€ãããŒãžã§ã³ã®React-Nativeã䜿çšããŠããã®ã§ãå€ãããŒãžã§ã³ã®ã©ã€ãã©ãªã䜿çšããå¿ èŠããããŸããïŒ
ãšã©ãŒã¡ãã»ãŒãžããªããããŒã¿ããªãããããã©ãã«ã·ã¥ãŒãã£ã³ã°ãé£ããåé¡ã®ããã§ãã
ç³ãèš³ãããŸããããçŸåšæŽçãããŠããŸããåé¡ã¯xcodeã®ãã³ãã«IDã§ãããééã£ããã³ãã«IDã䜿çšããŠããŸããããã¹ãŠæ©èœããããã«ãªããŸããã
ããã@ nateblogïŒ åæ§ã®åé¡ã«çŽé¢ããŠããŸãã補åãšãµãã¹ã¯ãªãã·ã§ã³ã®ç©ºã®é åãååŸããApp StoreConnectå ã«2ã€ã®ãµãã¹ã¯ãªãã·ã§ã³ã¢ã€ãã ãäœæããŸããã ãã³ãã«IDã®äœãåé¡ã ã£ãã®ã詳ããæããŠãã ããã [ãã³ãã«èå¥å]ã[è³Œå ¥ã¢ã€ãã ã®ProductId]ãŸãã¯[ProductId]ã®ã©ã¡ãã§ãããã«ã€ããŠã®åç §ãèŠã€ãããªãã£ããããæ£ããã¢ã€ãã SKUãéä¿¡ããŠãããšã¯æããŸãããè³Œå ¥ã¢ã€ãã ã®]ïŒ
ãŸãããªãªãŒã¹ã¹ããŒã ãšãããã°ã¹ããŒã ã§ãã³ãã«èå¥åãå°ãç°ãªãããšãä»ãå ããããšæããŸãã
ã¢ããã€ã¹ãããã ããã°å¹žãã§ãã
ç§ãåæ§ã§ãã©ã€ãã©ãªã®ãªã³ã¯ããã»ã¹ãæåã§è¡ãå¿ èŠããããŸããã ïŒiosïŒ
ããªãã¯ç§ã®æ¥ãæã£ãïŒ
ç§ã¯react-native-iapãçµ±åãã眲åããapkãPlayã¹ãã¢ã®ããŒã¿ãªãªãŒã¹ã«ã¢ããããŒããããµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã1ã€è¿œå ããŸããã åžžã«ç©ºã®é åãè¿ããããã°ã¢ãŒãã§ããµãã¹ã¯ãªãã·ã§ã³IDããšã«ãµãã¹ã¯ãªãã·ã§ã³ã®ãªã¹ããååŸããããšããŠããŸãã ãµãã¹ã¯ãªãã·ã§ã³ããããã°ã¢ãŒãã§å®éã«ãã¹ãã§ããŸããïŒ
@ShridharCodewaveç§ã¯åãåé¡ã«çŽé¢ããŠããŸãã åé¡ã解決ã§ãããã©ããæããŠãã ãã:(
react-native-iapïŒ3.3.2
ç§ã¯Androidãšãã¥ã¬ãŒã¿ãŒã§åãåé¡ã«çŽé¢ããŠããŸãã apkãGooglePlayã¹ãã¢ã®ããŒã¿ãã£ã³ãã«ã«ã¢ããããŒããã補åãè¿œå ããŸããã
ãŸããæ¥ç¶ã®åæåã次ã«è£œåããã§ããããããšããŠããŸãããconsole.warnã«äœã衚瀺ãããŸãã
ããã«çµæã¯ãããŸãã
ããã«ãšã©ãŒã¯ãããŸãã
@ismetsezerAndroidã®ã¢ããªå 課éå šäœããšãã¥ã¬ãŒã¿ãŒã§æ©èœããŸããã
ãšãã¥ã¬ãŒã¿ã䜿çšããŠGooglePlayã®è«æ±ããã¹ãããããšã¯ã§ããŸããã Google Playã®è«æ±ããã¹ãããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãããã€ã¹ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
https://developer.android.com/google/play/billing/billing_testing
ãã®ããã«ã¯å®éã®ããã€ã¹ãå¿ èŠã§ãã
iOSã§ã¯ãã·ãã¥ã¬ãŒã¿ãŒã§ãµãã¹ã¯ãªãã·ã§ã³ããŒã¿ããã§ããã§ããŸãã ãããããããè³Œå ¥ããããšã¯ã§ããŸããããã®ãããå®éã®ããã€ã¹ãå¿ èŠã§ãã
äžèšã®ä»ã®ã³ã¡ã³ãã«ã€ããŠïŒãŸãã確èªããŠãã ããversionName
ãšversionCode
ã§android/app/build.gradle
ã³ã³ãœãŒã«ã«ã¯Google Playã«ã¢ããããŒãããããã®ãšåããŸãã¯ãã以äžã§ãã
Androidã®æ°ããã¬ãã¥ãŒããªã·ãŒã®ãããéæ¬çªãã©ãã¯ã§ãã¢ã¯ãã£ããªã¬ãã¥ãŒæžã¿ã¢ããªãå¿ èŠã§ãã
以åã¯ãæªå ¬éã®ããã©ãããããŒãžã§ã³ãã¢ããããŒãããŠã¢ããªããã¹ãã§ããŸããã ãã®æ©èœã¯ãµããŒããããªããªããŸããã 代ããã«ãã¢ããªãã¯ããŒãºããŸãã¯ãªãŒãã³ã®ãã¹ããã©ãã¯ã«å ¬éããå¿ èŠããããŸãã 詳现ã«ã€ããŠã¯ããã©ããã¢ããªã¯ãµããŒããããªããªããŸãããåç §ããŠãã ããã
https://developer.android.com/google/play/billing/billing_testing
ã¯ããŒãºã/ãªãŒãã³ãã¹ããã©ãã¯ã§ã®ãå ¬éããšã¯ãGooglePlayã®æ°ããã¬ãã¥ãŒããã»ã¹ãçµãå¿ èŠãããããšãæå³ããŸãã æ°ããã¢ããªã®å Žåã¯æ°æ¥ãæ¢åã®ã¢ããªã®å Žåã¯æ°æéãããå¯èœæ§ããããŸãã
æ£ç¢ºãªæé ã¯ããããŸããããAndroidããã€ã¹ã§ããŒã«ã«ã«åäœããŠããŸãã ãããã£ãŠãããã¯ãããããreact-native-iapããã±ãŒãžã®åé¡ã§ã¯ãªããæ§æã®åé¡ã§ãã
誰ããäžèšã確èªã§ããå Žåã¯ããã®å€æŽã«ã€ããŠREADMEãæŽæ°ããããšããå§ãããŸãã ããã¯å æããæ°ãããã®ãªã®ã§ã
å®éã®ããã€ã¹ã«åãæ¿ãããšãã«@jvandenaardwegã«æè¬ããŸããã¯ãããã¯åäœããæ¥ç¶ã¯æåããŸãããããªããèšã£ãããã«ããªã³ã¯ã«ãããšã補åé åã空ã«ãªãããããã¹ãã¢ããªãããŒã¿ãã£ãã«ã§å ¬éãããã®ãåŸ ã€å¿ èŠããããŸã
@ismetsezerãèããŠ
ãã¡ãããã°ãŒã°ã«ãã¬ã€ã¹ãã¢ã§å ¬éããåŸãããã§ç¢ºèªããŸã
æŽæ°
ç§ã®ã¢ããªãGooglePlayã¹ãã¢ã«å ¬éãããåŸãè³Œå ¥ãå§ãŸããæ©èœããŸããã æ¿èªã«ã¯3æ¥ããããŸãã @jvandenaardwegã«æè¬ã
æŽæ°2
ãšãã¥ã¬ãŒã¿ãŒãGooglePlayã¹ãã¢ããµããŒãããŠããå Žåãreact-native-iapã¯Androidãšãã¥ã¬ãŒã¿ãŒã§åäœããŸãã
@kesepara Playã¹ãã¢ã«æ°ãããµãã¹ã¯ãªãã·ã§ã³ãã©ã³ãè¿œå ããŠãããããã€ã¹ã«è¡šç€ºããããŸã§æ°æéåŸ ããªããã°ãªããŸããã§ããã
ããã«ã¡ã¯@ismetsezerãš@kesepara ã
ãŸã ã¯ã£ããããªãããšãããã®ã§ãéçºãããŒã«ã€ããŠã®ãæèŠãããã ããã°å¹žãã§ãã
iOSçšã®RNIAPãã»ããã¢ããããŸããããçŸåšã¯æ£åžžã«æ©èœããŠããŸãã
ç§ã¯ä»Androidã®éšåãããå§ããŠããŸãããæ¯æãæ©èœããã¹ãã§ããããã«ããã«ã¯ãïŒå°ãªããšãïŒã¯ããŒãºããã©ãã¯ã«ã¢ããããŒãããã眲åä»ãAPKã䜿çšããå¿
èŠãããããšãããããŸããã
ããããããªãã®ã³ã¡ã³ãã§ã¯ãAndroidãšãã¥ã¬ãŒã¿ãŒã§ãã¹ãã§ãããšèšã£ãŠããŸãããããã¯æ£ããã§ããïŒ
ããã«ãã¹ãã¢ã§çœ²åä»ãAPKã䜿çšããå¿
èŠãããå Žåãã©ã®ããã«ãããã°ã§ããŸããïŒ
ããªãã®å©ããããã ããã°å¹žãã§ãã
ããã«ã¡ã¯@beeremyããªãã®è¯ãæèŠãããããšãã 補åããã§ããããã«ã¯ãGooglePlayããµããŒãããŠããå®éã®ããã€ã¹ãŸãã¯ãšãã¥ã¬ãŒã¿ãŒã§iapããã¹ãããå¿ èŠããããŸãã IAPã¯ãGoogle Playã¹ãã¢ã§ã¢ããªãå ¬éããåŸã«æ©èœããŸãããããã¯å€æŽãããå¯èœæ§ããããŸããããã®æ©èœããã¹ãããã«ã¯ãå°ãªããšãã¹ãã¢ã«ã¢ããããŒãããããäžæžããæåºããå¿ èŠããããŸãã ããããäœæ¥ã«ã¯2ã3æéããããŸãã
ããã«ã¡ã¯@ismetsezer ããã£ãŒãããã¯ãããããšãã
ããã圹ç«ã€ããšãã§ãã人ã®ããã«ãç§ã¯ãã®æšå¥šäºé ã«åŸã£ãåŸã«ãããã°æ§æãå®è¡ããããšãã§ããŸããïŒ https ïŒ
ã¢ããªãGooglePlay Consoleã§å ¬éãããåŸããµãã¹ã¯ãªãã·ã§ã³ãšè£œåã@ismetsezerãšããŠç¢ºèªã§ããŸãã ã¢ããªããŸã å ¬éãããŠããªããšãã«ãµãã¹ã¯ãªãã·ã§ã³/補åãååŸããããšãããšãAndroidã§ã¯æ©èœããŸããã
iOSã§ã¯ããµãã¹ã¯ãªãã·ã§ã³ãšè£œåã¯ã¢ããªãå ¬éããªããŠãæ©èœããŸãã
ãããæè¿ãã®åé¡ã«é¢ãã掻åã¯ãªãã£ãããã§ãã åé¡ã¯ä¿®æ£ãããŸãããããããšãã³ãã¥ããã£ã®æ³šæãå¿ èŠã§ããïŒ ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåããã®åé¡ã¯è§£æ±ºãããå¯èœæ§ããããŸãã ãã®åé¡ã«ããã£ã¹ã«ãã·ã§ã³çšããŸãã¯ãè¯ãæåã®åé¡ããšããã©ãã«ãä»ããããšãã§ããŸããéãããŸãŸã«ããŠãããŸãã è²¢ç®ããŠããã ãããããšãããããŸãã
ããã§Androidéçºè ã®RN0.59.1ãšç§ã¯iapããŒãžã§ã³4.4.1ã䜿çšããŠããŸã
ç§ã®ãã«ãã¯çŸåšAlphaãã©ãã¯ã«ãããŸãã ãã®åŸãéåžžã©ãããPlatform.selectïŒ{}ïŒå ã®ãããã°ã¢ãŒãã§ãã·ã³ãåæ§ç¯ããŸãããPlayã³ã³ãœãŒã«ã§ãµãã¹ã¯ãªãã·ã§ã³IDãæå®ããgetSubscriptionsïŒïŒãåŒã³åºããŸãããã空ã®é åãåãåããŸãã ããã¯ã¢ã«ãã¡çã ããã§ããïŒ äœãæ¡ã¯ïŒ
@edgaralienfoe Google Play Consoleã§ãµãã¹ã¯ãªãã·ã§ã³ãã¢ã¯ãã£ãåããŸãããïŒ
@acostalimaã¢ã¯ãã£ãåããå¿ èŠããããŸãã ããããã®ã«æ°æ¥ããããããããªããšæããŸããããããã§ãéããããŸããã
@edgaralienfoe Google Play Consoleã§ãµãã¹ã¯ãªãã·ã§ã³ãæ瀺çã«ã¢ã¯ãã£ãåãããªãã·ã§ã³ããããã¢ã¯ãã£ãã«ãªã£ãŠããªãå Žåããµãã¹ã¯ãªãã·ã§ã³ã¯ã¢ããªã«è¡šç€ºãããªãããšãæãåºããã®ã§ã質åããŠããŸãã ããããããèšãã°ãä»ã®åé¡ããããããããŸããã
@edgaralienfoe解決çã¯èŠã€ãããŸãããïŒ ãã¶ãããªãã®ã¢ããªã®ããŒãžã§ã³ã¯ã¢ã«ãã¡ãã©ãã¯ã®ãã®ãããé«ãå¿ èŠããããŸã
@edgaralienfoe解決çã¯èŠã€ãããŸãããïŒ ãã¶ãããªãã®ã¢ããªã®ããŒãžã§ã³ã¯ã¢ã«ãã¡ãã©ãã¯ã®ãã®ãããé«ãå¿ èŠããããŸã
ã¢ã«ãã¡ãã©ãã¯ã¯åé¡ãªãåäœããŸãã ç§ã¯ããªãé·ãéIAPããã¹ãããŠããããã«ãã¯åé¡ãªãAlphaã«ãããã€ãããŠããŸãã äžæ¹ãå éšãã©ãã¯ã¯æ©èœããŸããã
ããã§åé¡ãçºçããå¯èœæ§ã®ãããã¹ãŠã®äººã«ãšã£ãŠãiOSã§ã®ããªãã¯ã¯ã @ Kuhne1ã«ãã£ãŠææ¡ãããããã«ãããžã§ã¯ããæåã§ãªã³ã¯ããããšã¢ããããããããæåã§ã€ã³ã¹ããŒã«ããåŸãæ©èœããŸããã誰ã«ãšã£ãŠã圹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
ãããæè¿ãã®åé¡ã«é¢ãã掻åã¯ãªãã£ãããã§ãã åé¡ã¯ä¿®æ£ãããŸãããããããšãã³ãã¥ããã£ã®æ³šæãå¿ èŠã§ããïŒ ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåããã®åé¡ã¯è§£æ±ºãããå¯èœæ§ããããŸãã ãã®åé¡ã«ããã£ã¹ã«ãã·ã§ã³çšããŸãã¯ãè¯ãæåã®åé¡ããšããã©ãã«ãä»ããããšãã§ããŸããéãããŸãŸã«ããŠãããŸãã è²¢ç®ããŠããã ãããããšãããããŸãã
é·æé䜿çšãããªãã£ãåŸããã®åé¡ã解決ããŸãã ãã®åé¡ãææ°ãªãªãŒã¹ã§ãåŒãç¶ãçºçããå Žåã¯ãææ°ã®æ å ±ã䜿çšããŠæ°ããåé¡ãäœæããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
ãã¡ãããã°ãŒã°ã«ãã¬ã€ã¹ãã¢ã§å ¬éããåŸãããã§ç¢ºèªããŸã
æŽæ°
æŽæ°2