プログラミング (iOS, JavaScript, Jenkins, Sikuli) とMacやiPhoneなどの話題が中心のブログ Objective-CではURLをベースとした通信フレームワークであるURLローディングシステムが用意されています。これはプロトコルとしてftp, http, https, fileをサポートしており、これらのプロトコルでの通信を行うアプリケーションを簡単に書くことができます。 この記事ではAppleの「URL Loading System Programming Guide」を参考にして、URLローディングシステムを利用した通信の概要について紹介します。NSURLConnectionは同期通信にも対応していますが本記事では触れません。また、iOSでは使用できないNSURLDownloadも基本的には取り扱いません。 要求の送信 要求を送信するまでのコードは
Xcode 4には、ターゲットのサマリーに「Version」と「Build」の欄があります。このBuild番号をビルドの度に自動的に増やしていく方法のメモ。こちらのQ&Aページを参考にしました。 バージョン番号とビルド番号の付け方について ターゲットのサマリーの"Version"はInfo.plistの"Bundle versions string, short" (CFBundleShortVersionString)、"Build"は"Bundle Version (CFBundleVersion)"に相当します。 バージョン番号とビルド番号の使い方の流儀はいろいろあり、プロジェクトにあった方法を選べばよいわけですが、私の場合は上のQ&Aページで説明されているのとほぼ同じように、次のようなルールで付けることにしました。 バージョン番号は、 {メジャーバージョン}.{マイナーバージョン}
トランザクションの中断と再開について、さらにケースを見ていきます。未完状態のトランザクションが既にある状態で、新しいペイメントをリクエストした場合の挙動について。厄介です。 同一プロダクトに対する複数のトランザクション 前述した複数デバイスを使っているときを除いて、StoreKitでは同じプロダクトに対する購入トランザクションを複数同時に進める事はできないようになっているようです。既に進行中/中断状態のトランザクションがある状態で新しい支払いリクエストをキューに積むと、そのトランザクションはfailすることになります。勿論この挙動自体はそうあるべきものですが、この時の処理の流れには注意をしなければいけません。 発生するパターン 同一のデバイス上で一つのプロダクトに対する複数のトランザクションが発生してしまうパターンは二つ考えられます。 パターン1. 前回のトランザクションがfinishして
トランザクションが複数できると面倒なことになると前回のポストで書きました。特に購入手続きの途中でアプリケーションが終了してしまったような場合は、アプリケーション側で少し面倒ですが対策をいれないと問題を回避できません。 発生するケースについての確認 実際の対策を見る前に、発生するケースについて確認しておきます。 ユーザがアプリケーション上で特定のアイテムを「購入」しようとする。 アプリケーションからStoreKitのキューにPaymentリクエストが積まれる。 トランザクションが生成される。 トランザクションが完了する前にアプリケーションが終了。 アプリケーション再起動。 前回のトランザクションが再開/完了するより前のタイミングでユーザが再び「購入」しようとする。 この問題は、前述の通りアプリケーション起動から未完状態のトランザクションが再開されるまで若干のラグがあるために発生しうる問題です
ある程度制作したりリリースしたiPhone専用アプリをiPad用でも使えるようにしたいことがあります。 iPhone専用アプリでもiPad上で拡大してくれるのですが、やっぱり専用にリソースを作ったり、UIを変更したいという、つまりUniversalアプリ化したいというとき、ソースコードで生成しているUIはそれなりに対応も出来るのですが、XIBファイルはどのようにすればいいのでしょうか? 今回は、XIBを変更するの手順を下記に書きました。ちょっと面倒ですが、手順を覚えてしまえば迷わずできます。 XIBの複製 まず、xibをコピーします。 [File]メニューから[Duplicate]を選び、XXX~ipad.xib の用に命名します。 【命名の話】 このxibの名前の付け方ですが、適当な名前にし、自分で呼び出す部分も変更することももちろん出来るのですが、“~ipad”とつけると、Xcodeが
StoreKitのトランザクションには、トラブルが発生した際に重要になる情報が多く含まれています。SKPaymentTransactionオブジェクトに含まれる情報と、それらの挙動について確認していきましょう。なお、複雑になるのでNon-Consumableプロダクトのリストア関連の項目については、基本的に省略しています。 SKPaymentTransactionの要素 SKPaymentTransactionに含まれる主なプロパティは以下の通りです。(Non-Consumableプロダクトのリストア関連の要素は除いています) error payment transactionState transactionIdentifier transactionReceipt transactionDate 各要素について、挙動や使い方を確認していきましょう。 transactionState ト
アプリ開発。Objective-C、Flash、cocos2d、Unity、Unreal Engine 4、ライブラリ、ツール類について。 先日、バージョンアップのためにSubmitしていたPuppet Camがリジェクトされてしまいました。 理由は、In App PurchaseでNon-Consumableなアイテムを購入したお客様に対して、別デバイスなどからリストアできるように、リストアボタンが用意されていないというものでした。 リストア機能は、再度、購入ボタンを押してもらえれば、2重課金にならずに済むようになってはいるのですが、お客様にとっては2重課金されないかな?と不安に思うのはもっともなので、このリジェクトは致し方無いです。 ただし同様の実装でも、リジェクトされる場合とされない場合があり、この辺りの審査はいつも微妙です。 今回は、リストアボタン実装中に、ひとつハマりポイントを見
iPhoneアプリ開発で暗号化を行う必要が出てきたので、試しに書いてみました。 暗号方式にはAES128を、Padding方式にはPKCS7を使っています。 ここで使っているCommonCryptoはiOS SDKについてくるものですが、mac上でも普通に使うことができます(iPhone Simulator用のライブラリを無理矢理使います)。 使い方としては、下のコードをコンパイルして、 $ ./a.out aaaabbbbccccdddd eeeeffffgggghhhh messageというようにすると"message"が暗号化され、さらに続けて復号化されます。 第一引数は鍵、第二引数はInitial Vectorです。どちらも16バイトである必要があります。 /* * gcc -std=c99 crypto.m -framework Foundation */ #import <Fo
秘密鍵やプライベートな情報などを秘匿するためにパスワードでデータを暗号化・復号したい場合があります。このとき、暗号化と復号するアプリケーションが同じであれば簡単ですが、例えばCで暗号化してJava、Perl、Rubyで復号するといった風に異なるプラットフォームで暗号データをやりとりする場合には、いくつか気 をつけなければいけないポイントがあります。 OpenSSLによる暗号化 OpenSSLはWebサーバのSSL/TLSサポートに利用されますが、その他にも付属しているopensslコマンドから基本的な暗号アルゴリズムを利用できます。次のような簡単なコマンドで、パスワードを使ってデータを暗号化したり復号したりすることができます: $ echo 'Hello World!' | openssl enc -e -aes-128-cbc > cipher.txt enter aes-128-cbc
初めまして、Fusic 河野です。 わたくし、IT 系のバスケの社会人チームやiPhone アプリ系のコミュニティとかを やってたりするので、ご興味のある方はぜひご参加ください。 弊社にはもう一人河野というものがおり、そっちとは違う方と 覚えて頂けると溜飲が下がります。。。 最近、プライベートではこんなことやってたりして遊んでます。 Fusic では、主に ruby on rails をやっており、ZENPRE の iPhone アプリを 担当させていただいてたりします。 さて、昨日行われました安元の結婚式も無事に終わり、本日はとっても天気の良い日曜日です。 それにしても、とても良い結婚式でした。 「おめでとうございます。お二人とも末永くお幸せに!」 で、そんな幸せに包まれつつな日曜日も Advent Calendar です。 こんな日にバトンがまわってくるとは、、な気分ではございますがさ
UIWebViewを使ったアプリとサーバーを組み合わせたシステムを開発するようなケースで。 サーバー側で正式な証明書が用意できていない段階で、テストしなければならないような時、 自己署名証明書をとりあえず無視したいことがあると思う。 合法な方法では(現時点では)不可能らしい。 一時的にテストを進めるため、undocumented な方法ではあるが、 以下のような方法がある。 How to ignore ssl certificate challenge with UIWebView and NSUrlRequest? - General discussion - MonoTouch Forums @interface NSURLRequest(SSL) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host; @end @impl
2015年11月9日追記:以下の内容は Xcode 4 までに対応しています。最近の Xcode に対応するには github.com/github/gitignore の Objective-C.gitignore を使うことをお勧めします。(追記終わり) Xcode で作ったプロジェクトを Git で管理するにあたってめんどくせえーのは、 .xcodeproj の中にプロジェクトのデータとユーザデータが一緒に入ってる点です。普通に空のプロジェクトを作るとこうなります: Xcode 3: - $PROJ.xcodeproj/ - project.pbxproj - $USER.mode1v3 - $USER.pbxuser Xcode 4: - $PROJ.xcodeproj/ - project.pbxproj - project.xcworkspace/ - xcuserdata/
iOS Developer Programの更新作業をした際の覚書です。 iOS Developer Programのライセンスの有効期間は1年間となっていますので、更新する必要があります。 更新については、Program Renewals – iOS Developer Program – Support – Apple Developer.に詳しく書いてあります。 更新しなかった場合もどうなるか書いてあるので、一度は読んでおくと良いと思います。 なお、期限が切れる前に更新していますので期限が切れた後に更新した場合とは少し異なると思います。 目次 ライセンスの購入 証明書(Certificate)の更新 Provisioning Profileの更新 ライセンスの購入 iOS Dev Center – Apple Developer.にてライセンスを購入します。 更新が近づいていると、ロ
// 年月日、時分秒を指定して日時オブジェクトを生成する NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setYear:2010]; [comps setMonth:1]; [comps setDay:2]; [comps setHour:3]; [comps setMinute:4]; [comps setSecond:5]; NSDate *date = [calendar dateFromComponents:comps]; NSLog(@"date: %@", date); // => date: 2010-01-02 03:04:05 +0900
SKProductsRequest で指定した productIdentifier が invalidProductIdentifiers になって返ってくるときは、以下の点を確認してください。(ここを参考にしました) そのアプリのApp IDでIn-App Purchasesは有効になっていますか? そのプロダクトは「Cleared for Sale」になっていますか? そのアプリの新しいバージョンをiTunes Connect上で追加していますか? 参考にしたページでは、 Have you submitted (and optionally rejected) your application binary? Xcodeプロジェクトの.plistのBundle IDはApp IDと一致していますか? そのApp IDで新しいProvisioning Profileを作成してインストール
たとえば下記のようなコードでプロダクト情報取得処理を行った場合に、 self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]]; self.request.delegate = self; [self.request start]; プロダクト情報の取得が完了すると productsRequest:didReceiveResponse: メソッドが呼ばるわけですが、そこで下記のように「無効なプロダクトID」をチェックすると - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { if ([resp
理系の視点 Just another Engineer's blog, Voice4u Behind the Scenes Search Main menu Tweet 既存のiOSプロジェクトを最新版のiOS 6とiPhone 5に対応したにアップデートする際にいろいろ変更された部分があり、変に時間がかかったところもあったのでメモしてみました。少しでもこれがお役に立てば幸いです。 iOS 6とiPhone 5のサポートに必要だった処理は次です: Launch Images、App icon、スクリーンショット ビューのAutoresizing ビューの背景色 画面の回転 windowのrootViewControllerプロパティ iPhone 3G, iPod touch 2Gでビルドできない 1. Launch ImagesとApp icon iPhone 5のRetina 4インチ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く