iPhone からサーバへhttp通信でファイルアップロードする方法

サーバ側 PHPプログラム
※ 本PHPプログラムは、ファイル名: file_upload.php とする。
※ 本PHPプログラムのディレクトリ配下に”files”ディレクトリを作成しておく。
アップロードされるファイルは、filesディレクトリ配下に作成される。

1
2
3
4
5
6
7
8
9
10
11
12
<?php                                                                                                                         
$target_path = "files/";
 
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; 
} 
else{ 
    echo "There was an error uploading the file, please try again!"; 
}
?>

クライアント側プログラム
※ ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/)からライブラリ取得する。
iOS用サンプル プログラムの以下の箇所を変更し動作させる。
※ pathForResource メソッドでパスが取得できない場合、プロジェクトの登録情報が不正な場合がある。
問題のリソースファイルを再度、プロジェクトに登録し直せば解決する場合が多い。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@implementation UploadViewController
 
- (IBAction)performLargeUpload:(id)sender
{
    // 以下、ファイルアップロード検証用コード    
    [request cancel];
 
    // 上記のphpプログラムURL
    NSURL *url = [NSURL URLWithString:@"http://xxxxxx/file_upload.php"]; 
    [self setRequest:[ASIFormDataRequest requestWithURL:url]];
 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
    [request setShouldContinueWhenAppEntersBackground:YES];
#endif
 
    NSBundle *bundle = [NSBundle mainBundle];
    // アップロードテストするファイル
    NSString *pathUploadFile = [bundle pathForResource:@"info" ofType:@"png"];
    NSLog(@"%@", pathUploadFile);
    [request setFile:pathUploadFile forKey:@"uploadedfile"];
 
    [request setUploadProgressDelegate:progressIndicator];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(uploadFinished:)];
    [request setDidFailSelector:@selector(uploadFailed:)];
 
    [request startAsynchronous];
 
    [resultView setText:@"Uploading data..."];
 
// ↑ファイル アップロード検証用コード

illustrator 操作について

・ズームツール
ズームツールアイコンをダブルクリックで100%表示
(cmd+0と同じ)
ズームツールを選択し、矩形領域を選択すると拡大表示
opt+クリックで縮小表示

・手のひらツール
表示位置を変更できる
(space押下クリックと同じ)
手のひらツールをダブルクリックでアートボード全体が表示

・ナビゲータパネル
ウィンドウ – ナビゲーター
手のひらツールと同じ、表示位置を変更

・選択ツール
オブジェクトを選択
shift で複数選択
delete で選択しているオブジェクトを削除
オブジェクトが選択されている状態で、[選択ツール]のアイコンをダブルクリックすると移動を数値入力できる

・スポイトツール
塗りなどの設定を反映したいオブジェクトを選択し、スポイトツール選択。反映したい塗りなどを保持したオブジェクトを選択することで、設定をコピーできる

・その他
cmd+n 新規作成
cmd+z で取り消し
shift+cmd+z やり直し
グリッド線の表示/非表示 cmd+¥
定規を表示 cmd+R
cmd 押下で選択ツールにできる

・長方形ツール
長方形ツールを選択し、アートボードをクリックでサイズを指定して描画
cmd+オブジェクト クリックで選択ツールと同じ
画面上部のコントロールパネルからサイズを変更できる

・パスファインダ
オブジェクトの整列変形、整列、重なりを指定できる
(整列が旨くできない場合、どこに整列させる設定担っているかチェックする)

・バウンディングボックス
オブジェクト選択時に表示される四角い枠

・オブジェクトの複製
opt+ドラッグでオブジェクトの複製ができる

・グループ化
複数選択状態で、cmd+g でグループ化
変更したオブジェクトをダブルクリックで編集モード
画面上部の編集モードバーで編集モードを終了する

shift+cmd+g でグループ解除

・環境設定
一般
キー入力:2 px で矢印キー押下時のオブジェクトの移動距離

ガイド・グリッド
グリッド:2 px

・色の変更
ツールパネルの塗りボックスを選択
カラーパネルを選択
(選択順番が重要。なにをどうするという順番)

・鉛筆マークが表示されている場合、選択されているレイヤーがロックされている

・文字のアウトライン化
文字のアウトライン化は、フォントがインストールされていないマシンでも表示できるようにするため

・線のアウトライン化
線のアウトライン化は、拡大縮小した際に、バランスが崩れるオブジェクトに対して行っておく

・レイヤーパネル
レイヤーパネルの右端の丸はターゲットコラム。アピアランスが設定されていると丸がグレーになる。選択されている場合、二重丸になる。

・オブジェクトの複製
optキー押下でカーソルが二重になる。二重表示状態で画像をドラッグすると、画像を複製できる

実機にアプリを転送する手順

実機にアプリを転送するには、iOS Developer Program を契約しておく必要がある。

1. キーチェーンより正規開発者証明書請求書類の作成
キーチェーンは、
オンライン証明書状況プロトコル(OCSP)
証明書失効リスト(CRL)
を「切」に設定されていること。

メニュー「証明書アシスタント」「認証局に証明書を要求」を選択し、正規開発者証明書を請求する書類(秘密鍵、公開鍵)を作成する。

iOS Developer Program で登録した
メールアドレス、通称(ローマ字の氏名)
を指定し、「ディスクに保存」「鍵ペア情報を指定」を選択する。
鍵のサイズ:2048 ビット
アルゴリズム:RSA
を指定されていることを確認すること。

作成した鍵はバックアップをとっておくこと。
→ 他のマシンで開発を行う場合、キーチェーンに登録する必要があるため

CertificateSigningRequest.certSigningRequest
(正規開発者証明書を請求する書類)
〜.pem (公開鍵)
〜.p12 (秘密鍵)

2. iOS Developer Program から正規開発者証明書を取得
iOS Provisioning Portal – Certificates に「正規開発者証明書を請求する書類」を登録し、正規開発者証明書(developer_identity.cer)を取得する。
開発環境に登録する。

3. 実機の Device ID (40文字のID)を登録
4. iOS Developer Program からプロビジョニングファイルを取得
実機にプロビジョニングファイルを登録する。
登録状態をオーガナイザで確認する。

5. xcode プロジェクトに識別子の設定
xcode4 の場合、プロジェクト ナビゲータよりプロジェクトを選択
TARGETS – Info
Custom iOS Target Properties
Bundle identifier にBundle IDを指定する

Build Settings
Code Signing
Code Signing Identity をプロビジョニング ファイルのサインと合致するように設定する

6. xcode から実機にアプリを転送する

上記の手順で実機でプログラムが動作できない場合、
– オーガナイザで実機のプロビジョニングファイルに問題がないか?
– xcode プロジェクト設定 [iOS Deployment Target] の iOS バージョンが実機の iOS バージョンより新しくないか?
など確認する。

shareKitを利用するための手順

iPhone アプリから twitter 連携を行い、メッセージ投稿・画像投稿を実装する場合、shareKit が良いかなと思います。
(メッセージ投稿を実装できるライブラリは他にもありますが、画像投稿ができなかったりするようです。)
以下、利用するための手順です。

twitter APIを取得(画像投稿も行う場合、bitly APIも取得)
shareKit の SHKConfig.h にAPI登録で取得した情報を設定する

twitter api 登録は以下のURLから行う
twitter api登録

api 登録を行い、以下の情報を入手する
– API Key
– Consumer Key
– Consumer secret

bitly 登録は以下のURLから行う
bitly登録

api 登録を行い、以下の情報を入手する
ー API Key

上記の情報を SHKConfig.h に設定する

twitter API 登録時の注意点
アプリケーションの種類は、「ブラウザアプリケーション」を選択すること
コールバックは、「shareKitのヘッダに登録するURLと同じ」にすること
標準のアクセスタイプは、「Read & Write」を選択すること
xAuth 認証を行う場合、別途申請が必要となる
(SHKConfig.h のコメントとして注意点が記載されています)

実装の注意点
shareKit ライブラリは、通信中に画面の連続タップなどをブロックする処理がありません。
不要なイベントをブロックする処理を追加する必要があります。
shareKit ライブラリは画面の回転に対応していますが、回転に対応する必要がないアプリの場合、回転をしない様にコードを変更する必要があります。(当然ですね。。。(・_・)(._.))
twitter ログイン処理に関してもキャンセル後、通信を中断する処理がありません。
通信を中断する処理を追加する必要があります。

NSOperationQueue の処理が実行できない場合

非同期通信を行う場合、NSOperation, NSOperationQueue を利用するかと思いますが、なぜか動かない…と調査したところ、iOS 4より NSOperationQueue の仕様が変更されているとのこと。
以下の様にすることで iOS 4 でも動作しました。

しかしながら、iOS 4 で動作するコードは、iPad 3.2 Simulator では問題があるようなので、respondsToSelector で判断し、処理を変更する必要があるみたいです。

1
2
3
// iOS4 からメッソドが変更され、メインスレッドに明示的に関連づける必要がある
//    _queue = [[NSOperationQueue alloc] init];
_queue = [NSOperationQueue mainQueue];

ロリポップのgitリポジトリへxcode4プロジェクト関連のファイルをpushする

gitを初めて利用する場合、知っておいた方がよい事柄を以下に記す。
・分散リポジトリ
ローカルのリポジトリとサーバのリポジトリで更新処理が行える
ローカルでの変更点をコミットするには、commit を使用する
サーバのリポジトリと連携を行う際は、push / pull を使用する
サーバのリポジトリをローカルに複製するには、clone を使用する

分散リポジトリを理解する上で参考になる構成図
コマンド詳細

1. xcode4プロジェクトを作成する
プロジェクト新規作成時には、
Source Control: Create local git repository for this project
をチェックする

開発関連のファイルを git で管理していない場合,以下の手順で git 管理しておく.
$ cd (プロジェクトのトップディレクトリ)
$ git init
$ git add .
$ git commit -m "コミット コメント"

2. サーバにgitリポジトリを作成する
“git”ディレクトリを作成し、git ディレクトリで以下のコマンドを実行する。
git init –bare –shared

3. サーバへpushする
開発ディレクトリで,

git push ssh://(ユーザ名)@ssh030.lolipop.jp:2222/home/users/1/(ユーザ名)/git master

※ パスは,適宜指定する.

4. サーバからcloneする
いったん,開発ディレクトリをリネームなどでバックアップした後,

git clone ssh://(ユーザ名)@ssh030.lolipop.jp:2222/home/users/1/(ユーザ名)/git

5. その他
サーバ リポジトリの変更点をローカル リポジトリに取り込む
$ git pull

・push 失敗する場合は、コミットしているか確認すること
$ git commit
もしくは、
$ git commit -m “(コメント)”

.vimrcでutf-8を利用する

.vimrc に以下の設定を記述する

1
2
3
4
5
6
syntax on
set nobackup
set termencoding=euc-jp
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,utf-8,ucs2le,ucs-2

ついでにカーソル行に下線、行番号も表示するようにする

7
8
set cursorline
set number

ロリポップのssh接続時パスワード省略ってできないの?

ロリポップのチカッパプランで osx から ssh接続をする場合、とても長いパスワード入力を求められる。
鍵を利用してパスワード入力を省略する方法を試してみる。

手順は以下の通り。

1. ローカルで鍵を作成する

$ ssh-keygen -t dsa

~/.ssh/配下に鍵が作成される

2. 作成された公開鍵をサーバへコピーする

作成された鍵(id_dsa.pub)をサーバ側の ~/.ssh/authorized_keys へペーストする

$ cd ~/.ssh
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
う~ん。一度鍵の認証ができたと思ったけど、できなくなった。。。?

ユニークな識別子を作成する

1
2
3
4
5
    // ユニークな識別子を作成する
    CFUUIDRef uuid;
    uuid = CFUUIDCreate(NULL);
    _identifier = (NSString*)CFUUIDCreateString(NULL, uuid);
    CFRelease(uuid);