iOS 開発メモ (2013年4月)

・UIViewのautoSizing

hoge.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

・文字列の置換

[hoge stringByReplacingOccurrencesOfString:@”検索する文字列” withString:@”置き換える文字列”];

iOS Push Notification

・キーチェーンアクセスから 証明書を書き出す (例: pns.p12)

openssl pkcs12 -in pns.p12 -out pns.pem -nodes

をターミナルから実行してpemファイルを作成。

・デバイストークンをハードコーディングして、簡単にテストする場合 (PHP)

Apple Push Notification Services Tutorial: Part 1/2 – Ray Wenderlich にサンプルコードがある。

デバイスIDの調べ方は、
iOSのRemote Notificationを試してみた – daicham blog
あたりを参考にiOSのAppDelegate.mに実装する。

<?php

// Put your device token here (without spaces):
$deviceToken = '1ED5B1EB97B788EE359233F5A547E881E3FEE0E2DED7A0AEB258ACD11050E051';

// Put your private key's passphrase here:
$passphrase = '';

// Put your alert message here:
$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'pns.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
	'ssl://gateway.sandbox.push.apple.com:2195', $err,
	$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
	exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body&#91;'aps'&#93; = array(
	'alert' => $message,
	'sound' => 'default'
	);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
	echo 'Message not delivered' . PHP_EOL;
else
	echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

をローカルに保存して (simplepush.php)

php simplepush.php

で実行する。

Connected to APNS
Message successfully delivered

と表示され、すぐ通知が飛んでくる。
(エミュレーターは非対応なので、検証出来るのは実機のみ、アプリを起動中は通知が来ないので注意)

Rubyの場合はこれを使うと良さそう。
jpoz/APNS · GitHub

iOS 開発メモ (2013年3〜4月)

いろいろ開発中に調べたことのメモ

 

・ステータスバーを隠す

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
self.wantsFullScreenLayout = YES;

 

 ・親のインスタンスにイベントを送りたい

Protocol – Delegateパターンで実装する。

[iOS] Protocol – Delegateパターン | Objective-C イベント伝達 その1 « きんくまデザイン

 

・ARCを有効にしている場合に起こりがちなエラー

(nonatomic, assign) のあたりでエラーが出たら、 (nonatomic, strong) に書き換える。

[ARC][Xcode 4.3] プロパティのデフォルト属性が変更に! – iOS 開発ブログ Natsu’s note

 

※ ARCはXcode4.3以降(?) iOS5以降(?) で使える、自動メモリ管理です。

iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開) | Zero4Racer PRO Developer’s Blog

 

・UIWebView内のJavaScriptから、Objective-Cのコードを呼び出す

WebView で Javascript と Objective-C のコードを相互に呼び出す方法 ≫ 【スマホ×HTML5】Web&ハイブリッドアプリ開発者ブログ

 

・CGRectをNSLogで確認

NSLog(@"%@",NSStringFromCGRect(frame));

 

・UIViewのアニメーション

- (void)doAnimation
{
    self.alpha = 0.1f;
    self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
    [UIView animateWithDuration:0.3f
        animations:^{
            self.alpha = 1.0f;
            self.transform = CGAffineTransformMakeScale(1.2f, 1.2f);
        }
        completion:^(BOOL finished){
        self.transform = CGAffineTransformIdentity;
    }];
}

SimpleBoxes | ブロックを使ったアニメーション処理 (iPhone/iPad, Objective-C 2.0)

 

・UIWebViewのURL取得

NSString* url = [webView stringByEvaluatingJavaScriptFromString:@"document.URL"];

UIWebViewで表示中のURL、titleを取得する: iPhoneアプリ開発備忘録

 

・ファイル名の文字列処理

// ディレクトリ名を取り出し

NSString *directoryPath = [url stringByDeletingLastPathComponent];

// ファイル名を取り出し

NSString *fileName = [url lastPathComponent];

// 拡張子取り出し

NSString *extension = [fileNameWithExtention pathExtension];

// 拡張子無しのファイル名

NSString *fileNameWithoutExtension = [fileName stringByDeletingPathExtension];

iPhone War Room: How to load local HTML resouces in UIWebView
iPhoneアプリ開発と留学 : ファイルパスからファイル名や拡張子などのみを取り出す

 

・文字列の結合

NSString *s1 = @"Hello";
NSString *s2 = @"World";
NSString *str = [NSString stringWithFormat:@"%@ %@",s1,s2];

 

・文字列のSplit

NSString *string = @"hoge,moge,fugo,mogo";
NSArray *names = [string componentsSeparatedByString:@","];
NSLog(@"%@",names);

My Codex Leicester » Blog Archive » NSStringを特定文字で分割する – Mac/iOS の Audio Visual Programmingの話題

 

・文字列の一致の比較

if ([str3 isEqualToString:str4]){
}else{
}

Compare NSString Objects (Updated)

 

・配列内のindexOf

[配列 IndexOfObject:要素]

 

・配列の要素削除

[配列 removeObjectAtIndex:インデックス];

Objective-CのTips – メメメモモ

 

・AS3のDictionary的なもの

NSMutableDictionary

配列とループ処理を理解しよう – @IT

 

・addSubViewの反対

removeFromSuperview

【コラム】ダイナミックObjective-C (73) デザインパターンをObjective-Cで – Composite (2) | 開発・SE | マイナビニュース

 

・UIWebViewのガベコレ強制発動

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

iPhoneアプリでHTTP通信を頻繁に行っているとメモリ使用量が…

Cocoaの日々: [iOS] UIWebView のキャッシュ調査

(旧) Cocoaの日々: WebKit検証(36) – キャッシュをクリアする(成功)

 

iOSアプリ実機検証 〜 TestFlight配布

定期的に訪れる、iOS勉強作業。

========
実機検証
========

▼証明書の作成

キーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求

ユーザーのメールアドレス: メアドを入力
通称: 自分の名前など
CAのメールアドレス: 空欄で良い
要求の処理: ディスクに保存、鍵ペア情報を指定にチェック

鍵のサイズ: 2048ビット
アルゴリズム: RSA

 

iPhone Provisionning Protal > Certificates

で Certificate を作成してダウンロード。

キーチェーンアクセスの「ログイン」という項目内にドロップして追加。

(Development, Distributionどちらも)

 

App IDの作成

Bundle Identifierは自分のドメインなどに紐付けて、最後は 「 * 」 。
例) net.soohei.*

 

Deviceの追加

UDIDを入力してデバイスを追加する。Xcodeのオーガナイザーからも出来る。

 

Provisioning Profileの作成 (Development, Distributionどちらも)

Certificate、App ID、Device を指定して Provisioning Profile をつくる。

ダウンロードしてXcodeに登録

 

▼ アプリのビルド、実機転送

Build Settings の中の Code Signing で、
Debug にDevelopment用のプロファイル、
Release にDistribution用のプロファイルを指定してビルドする。

sign関係のエラーが出たら、証明書や鍵が正しくマシンに入っているか確認。

アプリを Run する時に、Simulatorを選ぶと、Mac上でシミュレーターが起動、
実機を選ぶと、実機で確認できる。

実機がプロファイル内にデバイスとして登録されているかを再確認。
転送に失敗した場合は、実機にプロファイルが入っているか、

 

 

========
TestFlight
========

Adhoc用のアプリを、インターネット経由で配布・インストールできる便利なサービス。
> Test Flight

 

▼ アプリのインストールに必要な条件

・TestFlight のアカウントを持ってること

・自分の端末(デバイス)の UDID が TestFlight のアカウントに紐付いていること
(端末からTestFlightサイトにアクセスすると簡単に登録できる)

・アプリのプロファイルが端末内にインストールされていること
(TestFlightのアプリ配布用URLからもインストールできる)

・配布されたアプリのプロファイル内に、自分の端末が登録されていること

 

▼ アプリの配布に必要なもの

・TestFlight のアカウント

・Distribution (adhoc) 用のプロファイルがマシンに入っていること

・同プロファイルを使ってビルドされたアプリのIPAファイル (Xcodeで Product > Archive)

 

▼ 配布手順

・Provisioning Portal の Devices にデバイスのUDIDを登録 (Xcodeのオーガナイザー経由でも良い)

・Distribution用の Provisioning Profile で、デバイスを登録

・アプリをビルドしてIPAファイルをつくる (Xcodeで Product > Archive)

・IPAファイルを TestFlightのApp 経由で配布・通知

 

▼ もし配布する端末を増やしたくなったら

・TestFlight のアカウントにデバイスの UDID を登録。

・Provisioning Portal で Devices にデバイスを追加

Provisioning Profile (Distribution) を再ダウンロード

・アプリを再ビルド、再配布

・通知を受け取った端末から、TestFlightのURLにアクセスしてアプリをダウンロードする。

 

or もっと便利な方法教えてもらいました!

 

・TestFlightのweb上で、Apps → アプリ選択 → Permissionos → Updated Provisioning Profile の Update Profile からプロファイルを再ダウンロード。

・Teammates In The Provisioning Profile に新しいメンバーが現れたら、チェックボックスをON。

・Just Update か、Update & Notify する。

・通知を受け取った端末から (Just Updateだと通知はこない)、TestFlight サイトにアクセスしてアプリをダウンロードする。

 

再ビルドの手間がないのがGood!

 

参考:
iPhoneアプリの配布用(Distribution)のビルドを行う – Cyber Passion for iOS
2台目のMacのXcode:「Valid signing identity not found」 | MUSHIKAGO APPS MEMO
Problem while trying to set up distribution profile
TestFlight とりあえずどんなものか | MUSHIKAGO APPS MEMO
TestFlightの使い方と導入方法 | Technology-Gym

Asagiri Jam App

久々の趣味アプリをリリースしました。
FRF2011に向け、改良を重ねようと思います。


http://soohei.net/blog/asagiri-now-2010
[追記1]
一時公開終了しました。(2011/4/5)

[追記2]
http://fes-app.com