アプリ作成関連」カテゴリーアーカイブ

iPhone/iPodのアプリを作るために(7) Certificatesの期限切れ更新

2013.10.31追記
この内容は古いので現状とは合わない部分があるのでご注意ください。

いつの間にかDistribution-CertificatesもDevelopment-Certificatesも期限切れになっていたので再作成しました。普通に説明どおり新しくキーチェーンアクセスでキーを作成してサイン(過去ログ2、3を参照)して新しく「Profile」も作り直しました。

ところがこのあと問題発生。Xcodeでサインができません。
正しく新しい有効期限のProfileを選んでいるのにキー情報に問題がある?みたいなエラーで先にすくまなくなりました。

色々調べたけど原因不明。でもなんとなく期限の切れたCertificatesが悪い気がしたので削除したらすんなり通りました。

たぶん、ですが手順どおり新しくCertificatesを作成してしまったのが間違いだったのだと思っております。本来は以下の様に作成する必要があったのだと思います。

1、キーチェーンアクセスを動かして「ログイン」「自分の証明書」を選んで期限切れのiPhone Developer,iPhone Distribution証明書を見つける

2、三角をクリックして関連づけされている秘密キーを表示

3、秘密キーを右クリックして「”mei sei”を使って認証局に証明書を要求…」
  メールアドレス、名称を入れてディスクに保存

4、あとは普通の手順どおりアップロードしてCertificatesを入手し、キーチェーンに登録

こうすることにより、同じ秘密キーで新しいCertificatesが出来上がるので問題なくサインができるのだと思います(未確認w)

私は1年先にしか試せそうにないのでどなたか試して結果をお教えください。

2011.2.1 追記
 この方法でDeveloperの方はうまく行ったのですがDistributionの方はうまく行きませんでした。期限切れとなった証明書を削除して回復しましたがDeveloperとは条件が違うようです。
違いは名称で、Developerの方には以下のような感じで名前の後ろに識別コードがついています。
iPhone Developer: xxxxx yyyyyy (ABCDEFGH)
上のやり方が良かったのではなく、名称が変わっているために問題が起きていない感じです。次の更新時にどうなるか確認します。

In App Purchaseのサンプルもどき

2013.10.31追記
古いので参考にはならないと思います。
「iPhone&Androidアプリ内課金プログラミング完全ガイド」など参考にしてみてください。

エラーチェックも何も無い省略しまくりソフトの概略です。枝葉は自分でちゃんと付け加えてください。
#コピペした時に漏れがあったみたいなので修正しました。2010.2.4

まずはStoreKitObserver

MyStoreKitObserver.h
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@interface MyStoreKitObserver : NSObject <SKPaymentTransactionObserver> {
}
@end

MyStoreKitObserver.m
#import "MyStoreKitObserver.h"
@implementation MyStoreKitObserver
-(id)init {
	if (self = [super init]) {
	}
	return self;
}
- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions {
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
	for (SKPaymentTransaction *transaction in transactions) {
		switch (transaction.transactionState) {
		case SKPaymentTransactionStatePurchasing:
			break;
		case SKPaymentTransactionStatePurchased:
		case SKPaymentTransactionStateFailed:
		case SKPaymentTransactionStateRestored:
			[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
			break;
		}
	}
}
@end

あとは適当にボタンを用意して

TestStoreViewController.h
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@class MyStoreKitObserver;
@interface TestStoreViewController : UIViewController <SKProductsRequestDelegate> {
	MyStoreKitObserver	*mySKObserver;
}
-(IBAction)test1Action:(id)sender;
@end

TestStoreViewController.m
#import "TestStoreViewController.h"
#import "MyStoreKitObserver.h"
@implementation TestStoreViewController
-(IBAction)test1Action:(id)sender {
	SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet
setWithObject:@"item1"]];	// 自分でつけたアイテムID
	request.delegate = self;
	[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
	NSArray *myProduct = response.products;
	if([myProduct count] > 0) {	//1アイテムしか処理してません
		SKProduct *product = [myProduct objectAtIndex:0];
		SKPayment *payment = [SKPayment paymentWithProductIdentifier:product.productIdentifier];
		[[SKPaymentQueue defaultQueue] addPayment:payment];
	}
}
- (void)viewDidLoad {
	[super viewDidLoad];
	mySKObserver = [[MyStoreKitObserver alloc] init];
	[[SKPaymentQueue defaultQueue] addTransactionObserver: mySKObserver];
	UIApplication *app = [UIApplication sharedApplication];
	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app];
	[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
-(void)_applicationWillTerminate:(NSNotification*)notification
{
	[[SKPaymentQueue defaultQueue] removeTransactionObserver: mySKObserver];
	[mySKObserver release];
}

一応動作確認はしましたが無保証です。

In App Purchase テストまでの手順

2015.3.23 追記
以下の内容は古すぎて役に立たないと思いますので別のサンプルをお探しください。
Appleの日本語ドキュメントがこちらにあるので参考にしてください。
 
 
 
 
 
日本語の「Store Kit プログラミングガイド」がここにあるので読む。
手順
1、iPhone Dev Center内のiPhone Developer Program Portalで
  Enable In App PurchaseをセットしたDistribution Provisioning Profilesを作成

2、Apple iTunes Connectでアプリケーションを登録
  (バイナリーはアップロードする必要はありませんので、最低限の情報を入れる)
  Status : Waiting For UploadでOK

3、Manage Your In App Purchasesでプロダクトを登録
  (正しいBundle Identifierが出てこない時にはDev Centerの登録内容を確認)
  priceとDisplay Detail(Japanese)を登録。画像はとりあえずいりません。
  Status : Pending Developer ApprovalでOK

4、Manage UsersでIn App Purchase Test Usersを登録
  テスト用のAppleIDをここで作成する
  (AppleIDとして未使用なメールアドレスが必要、無ければgmail等を利用)

5、テストは実機でしか行えないのでiPhone or iPod touchを用意
  テスト前に「設定」-「Store」で通常のアカウントからサインアウトする
  (忘れるとテスト購入がうまく動きません)
  ※上で作成したAppleIDで先にログインしないこと
  (テストアカウントではなくなってしまい、テストできなくなります)

6、アプリケーションでソフトの購入、リストア等のAPIを使うとメールアドレス(AppleID)とパスワードの入力が出てくるので作成したIDを入力する。

注意事項
・iTunesでシンクロするとアカウントが通常アカウントに戻るため、サインアウトをお忘れなく。
・無料のプロダクトは作れないので「In App Purchase」を使うためには「Paid Applications」の契約が必須です。

Developer Removed From Sale が出てた件

初めて作った有料のアプリをiTunes Connectで登録した所、審査が終わって’Ready for Sale’ってメールが来ました。で、確かにアプリがAppStoreにあったのですがiTunes Connectの状態を見ると、’Ready for Sale’の2時間後ぐらいに勝手に’Developer Removed From Sale’に変わったことになってました。
不思議に思って問い合わせメールを出したのですがなかなか返事が来ない。あちこちググってみたけどよくわからず。ただ、なんとなく「価格とか販売する国を確認したら?」というような記述をどこかでみたので念のために見直して再設定。突然「Ready for Sale」に変わりましたw

有料アプリについては販売開始日時を決められるようにするためにワンクッションあるみたいです。(どこかに書いてあるんだろうな、見逃しているだけで)

iPhone/iPodのアプリを作るために(6) Tax infoが変更?

先日、iTunes ConnectのTax infoが変わったようです。
今まではW-8BENという書類の提出が必要でしたが簡略化してもよくなったのか
「Certificate of Foreign Status of Beneficial Owner」受益株主の外国籍の証明書?というのになりました。ただしこれには条件があって「従業員がアメリカで働いていない」ということを宣誓しなさい、って出ますのでプログラマーがアメリカに居たりすると別な方法になると思うので自力で調べてくださいw
(ちなみに「Title」ってのが必要なのだが個人だと何が一般的なのだろうか)
(W-8BENには「Japanese solo proprietor」て入れたのですが「Individual」で良いと思います)

(2009.7.8追記)
「Certificate of Foreign Status of Beneficial Owner」はW-8BENのトップにある言葉ですね。変わったわけではなく、個人事業主?としてUSネイションの従業員はいませんよ、っていう1年ごとの確認処理なのかも。

(2010.2.5追記)
canalettoさんの日記を読むと申請が簡略化されたみたいです。