メモリを自動的に管理してくれるので、autoreleaseは便利と思って多用していた。
ところがiOS8になってからiPad miniで誤動作やストールが多発するようになった。
どうやらメモリが不足してきたら使用頻度に依らず、勝手に解放されるらしい。
結論:同じ関数内に限定される場合の使用に止めておくべき。
やっぱりメモリ管理は自分でやらないと、バグが発生した場合の不確定要素が増すだけだ。
2014年11月20日木曜日
2014年10月28日火曜日
iOS8 の iPad miniでOpen In Menu 表示
iOS8(iPad mini)で以下の手順によるOpen In Menu 表示がNGになった。
# iPhone5ではOK
(1)BarButtonItem 押下で UIActionSheet を表示
(2)UIActionSheet を選択してBarButtonItem にOpen In Menuを表示
*原因*
以下のdelegate関数内でOpen In Menuを表示しようとしていた。
(void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
*対策*
以下のdelegate関数内でOpen In Menuを表示するように変更する。
# iPhone5ではOK
(1)BarButtonItem 押下で UIActionSheet を表示
(2)UIActionSheet を選択してBarButtonItem にOpen In Menuを表示
*原因*
以下のdelegate関数内でOpen In Menuを表示しようとしていた。
(void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
以下のdelegate関数内でOpen In Menuを表示するように変更する。
(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
2014年8月26日火曜日
LWP::UserAgent の 400 Bad Request
いろんな理由があるのだろうが
User Agentを色々変えてみても治らないと思っていたら
URLに&の文字があるのが原因だった。
もちろん&にするだけでOK。
ブラウザだと成功するので結構ハマりやすいポイントかも。
User Agentを色々変えてみても治らないと思っていたら
URLに&の文字があるのが原因だった。
もちろん&にするだけでOK。
ブラウザだと成功するので結構ハマりやすいポイントかも。
2013年9月15日日曜日
iOS7対応で気付いた点
iOS7での変更作業(忘備録)
- MediaPickerをNavigationControllerに入れるのがNGになった(普通にViewControllerの差し替えをするしかなさそう)
- スレッドがちゃんと並行処理をするようになった(シーケンシャルな処理が必要な箇所は要チェック)
- 最上部の時刻表示とアプリ領域が重なる(諦めて情報を隠さない様にレイアウトを変更する)
- UIToolBarが半透明のグレイになった(配置するコントロールの配色を変更)
- UIToolBarにUIBarButtonItemをテキスト表示用に使うのは不適(FlexibleSpaceに関係ありそうだが、幅が変更できない場合があるのでUITextEditをdisable状態で使った方が良い)
- UISegmentControlにカラー画像を使えなくなった
- UIActionSheetが上にはみ出す(4Sだけかも知れないが諦めるしかなさそう)
- UINavigationControllerで使うUIViewのレイアウト指定が変わった。上部にUITextField、それ以外をUITableViewとしていた例だと、UITextFieldのY座標を0から64に変更して、新たに設けられたΔYに-64を設定すれば、iOS6とiOS7で共用できる。⇒これでも iPad mini on iOS7 がNGだったので、更にY座標を0に設定するコードを追加した。今後は、最少でもiPhone/iPadとiOS6/iOS7の組み合わせの環境を用意する必要がある。
- キーボードが表示される場合(エディットコントロールにフォーカスを移動させた場合)、自動レイアウトで底面を固定としているものはキーボードより上にスクロールしてしまう。Viewの下側にエディットコントロールを配置させる場合は便利だが、既作成のアプリはキーボードが表示されることを前提として上側に配置していると思うので要確認。
- 多国語対応の仕様が変わったらしい。レガシーな方式だと警告がでるが取り敢えずValidateはPassしてくれる。
2013年9月14日土曜日
ipswファイルをiTunesで更新
開発者向けに提供されるiOSのベータ版をインストールする方法
- ipswファイルをダウンロードする。
- インストール対象デバイスを接続する。
- iTunesでインストール対象のデバイスを表示する。
- Altとアップルキーを押しながら、「アップデートを確認」ボタンを押下する。
- ダウンロードしたipswファイルを選択する。
- 以降は省略
2013年6月24日月曜日
iPhone5のスピーカー問題
iPhone5にはスピーカーとイヤフォンの認識に失敗する不具合があるようだ。
OpenALを使用すると、以下の処理でスピーカーを認識せずイヤフォンへの出力となってしまう。
これに対する正式な方法は不明であるが、
OpenALを使用すると、以下の処理でスピーカーを認識せずイヤフォンへの出力となってしまう。
// OpneALデバイスを開く
ALCdevice* device;
device = alcOpenDevice(NULL);
alcOpenDevice()を実行する前に
IPodライブラリの曲を再生したり、
AudioToolBoxで任意のサウンド再生をすれば回避できる。
2013年6月10日月曜日
iPad miniでの注意点
スレッド内で直接アラート表示をしてはいけない。
といってもiPhoneやiPadでは実害は無い。何故かiPad miniにおいてのみクラッシュしてしまう。
以下のようなアラート表示用の関数を用意し、
-(void)showAlertFromThread: (id)param
{
NSString *msg = (NSString*)param;
UIAlertView *alert = [
[UIAlertView alloc]
initWithTitle:@"Alert from thread"
message: [NSString stringWithFormat: @"message : %@",msg]
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil
];
[alert show];
}
スレッド内では以下のように呼び出せば解決できる。
[self performSelectorOnMainThread:@selector(showAlertFromThread:)
withObject:@"Hello" waitUntilDone:TRUE];
2013年5月31日金曜日
AppStore登録時のバージョン番号の注意点
iMID2PRN V3.6でiPhone5のバグが生じたので、マイナーチェンジのつもりでV3.61をリリースしたら、次のV3.7の申請がValidate段階でエラーとなった。
つまり、小数のつもりで0.01を足したのだが、小数点以下は独立した数値だったらしく、61より大きな数値を要求されたらしい。V3.7ではなくV3.70とすることで解決した。
※枝番設定時には要注意
つまり、小数のつもりで0.01を足したのだが、小数点以下は独立した数値だったらしく、61より大きな数値を要求されたらしい。V3.7ではなくV3.70とすることで解決した。
※枝番設定時には要注意
2013年5月15日水曜日
iOSアプリのValidate失敗
iOSアプリ申請時のValidateが失敗し、以下のエラーが表示される場合がある。
原因は不明であるが、iPhone5を接続してArchiveを作成した場合に発生する。
対策としては、iPhone5以外のデバイスを接続してArchiveを作成するだけでValidateは成功する(もちろん、他には問題の無い場合だが)。
iPhone/iPod Touch:application executable is missing a required architecture.
At least one of the following architecture(s) must be present: armv7
原因は不明であるが、iPhone5を接続してArchiveを作成した場合に発生する。
対策としては、iPhone5以外のデバイスを接続してArchiveを作成するだけでValidateは成功する(もちろん、他には問題の無い場合だが)。
2013年5月9日木曜日
デバッグ用iOSの期限切れ対応
デバッグに使っていたiPhone 3GS が突然、iOSの期限切れとやらで起動できなくなった。
iPhone本体でも、iTunesにつないだ場合でもアクティベーションが出来ないと言われてiOSの更新や初期化すら出来なくなった。
全く使えないのかと思っていたら、Xcode付属のオーガナイザーで工場設定に戻すことができた。工場設定と言ってもバックアップやiCloudで最新iOS&ほぼ元のデータに戻った。
めでたしめでたし!
iPhone本体でも、iTunesにつないだ場合でもアクティベーションが出来ないと言われてiOSの更新や初期化すら出来なくなった。
全く使えないのかと思っていたら、Xcode付属のオーガナイザーで工場設定に戻すことができた。工場設定と言ってもバックアップやiCloudで最新iOS&ほぼ元のデータに戻った。
めでたしめでたし!
2013年5月8日水曜日
UIActionSheetの注意点
UIActionSheetは、iPadではポップアップ表示されるが、iPhoneでは下からスライドアップして表示される。この表示の基準点としてBarButtonItemを使用すると、iPadでは問題ないが、iPhoneでは消去時に問題が発生する。
ActionSheetのビューは、BarButtonItemが属するToolBarの下へ移動するように消える仕様となっているらしい。つまり、ToolBarは画面下部にあるのが前提で、上部に配置してしまうとActionSheet選択後に悲惨な画面を見ることになる。ActionSheetが上に移動したまま残ってしまうのである。
ActionSheetのビューは、BarButtonItemが属するToolBarの下へ移動するように消える仕様となっているらしい。つまり、ToolBarは画面下部にあるのが前提で、上部に配置してしまうとActionSheet選択後に悲惨な画面を見ることになる。ActionSheetが上に移動したまま残ってしまうのである。
2013年2月20日水曜日
iOSアプリへのリソース追加
プロジェクトファイルにリソースを追加すると、ソースコード以外は自動的にアプリに追加される、と思っていたが、自動追加されないファイルもあるようだ。
このような場合、プロジェクトにリソースファイルを追加した後、TARGETS / Build Phases / Copy Bundle Resources に追加すれば良い。
このような場合、プロジェクトにリソースファイルを追加した後、TARGETS / Build Phases / Copy Bundle Resources に追加すれば良い。
2013年2月15日金曜日
NSURLConnectionはキャッシュに注意
NSURLConnectionによるダウンロードのコードは簡単に見つかると思うが、実装にはキャッシュの注意が必要。
NSURL *url = [NSURL URLWithString:@"ダウンロードしたいファイルのURL"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLConnection *conn = [[[NSURLConnection alloc] initWithRequest:req delegate:self] autorelease];
こんな感じだと思うが、この場合、NSURLRequestUseProtocolCachePolicyの指定となるためキャッシュが効いて、必ずしも最新情報が得られない。それどころかネットに繋がってなくてもダウンロードが正常終了するので要注意。
NSURLRequestの作成を以下にすればキャッシュをクリアして実際にダウンロードを行う。
NSURLRequest *req = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:60.0];
2012年12月23日日曜日
iOSのバッテリー消費を押さえるための必須項目
iOSが自動でやってくれるかどうかは不明だが、以下の考慮は必要。
アプリの使用が終了したら各設定を無効にする
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// 自動オフ機能を無効にしておく(不要かも知れないが、表のアプリに迷惑をかけないよう念のため)
[UIApplication sharedApplication].idleTimerDisabled = NO;
// 縦横回転の検知を無効にする
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}
アプリが起動されたら各設定を元に戻す
- (void)applicationDidBecomeActive:(UIApplication *)application
{
// 自動オフ機能を有効にしておく(iMID2PRNは演奏時には自動オフ機能を無効にするため)
[UIApplication sharedApplication].idleTimerDisabled = [Defaultの設定];
// 縦横回転の検知を有効にする
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}
UIControlEventTouchUpOutsideで座標を取得
ボタンを押してドラッグし、ボタンの外で指を放した時の座標を取得する方法。
多くのアクションハンドラは以下の形式で足りるが
2番目の引数でイベント情報を受け取る形式を使用する。
- (IBAction) touchUpOutside:(id)sender forEvent:(UIEvent *)event;
eventの中身はこんな感じ
<UITouch: 0x1cd611c0>
phase: Ended
tap count: 0
window: <UIWindow: 0x1cd90ca0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x1cd90da0>>
view: <UIRoundedRectButton: 0x1cdbcf70; frame = (88 46; 44 64); alpha = 0.07; opaque = NO; autoresize = RM+H; tag = 64; layer = <CALayer: 0x1cdbd040>>
location in window: {274, 458}
previous location in window: {274, 459}
location in view: {186, 42}
previous location in view: {186, 43}
)}
座標の取得手順は、
NSSet *a = [event allTouches];
// (UITouch *touch in [a anyObject]) はストールするが、以下ならOK
CGPoint b = [[[a allObjects] objectAtIndex:0] locationInView:subview];
printf("(x,y)=(%f,%f)",b.x,b.y);
2012年9月17日月曜日
iOS6で変更されたデバイスの回転
http://www.facebook.com/pages/MID2PRN/128787497224101
リリースノートを読むとAutoRotate関連のI/ Fが変更されたと書いてあるけど、そもそもデバイスを縦横に変えて みてもレイアウト自体が変化しない。
これは以下の記述変更を行っていないため!
【iOS5.1以前】
[window addSubview:viewController.view ];
【iOS6】
window.rootViewController = viewController;
リリースノートを読むとAutoRotate関連のI/
これは以下の記述変更を行っていないため!
【iOS5.1以前】
[window addSubview:viewController.view
【iOS6】
window.rootViewController = viewController;
2011年7月26日火曜日
2011年5月28日土曜日
FacebookにiOSプログラミングページを作成中
Objective-C編 : http://docs.com/C32O
開発環境編 : http://docs.com/C327
APP作成編(作成中) : http://docs.com/CN01
Facebookの使い方が未だよく判らないけど
iOSプログラミングというfacebookページを作って
情報をまとめ中。
開発環境編 : http://docs.com/C327
APP作成編(作成中) : http://docs.com/CN01
Facebookの使い方が未だよく判らないけど
iOSプログラミングというfacebookページを作って
情報をまとめ中。
2011年4月20日水曜日
MPMusicPlayerControllerの注意点
iPodライブラリの再生で使うMPMusicPlayerControllerにはバグっぽい注意点がある。
停止させた時のステータスが、
iPhoneではMPMusicPlaybackStateInterrupted
iPadではMPMusicPlaybackStatePaused
と異なっている。
いずれもiOS4.3だけど、iPadの方が正しい気がする。
停止させた時のステータスが、
iPhoneではMPMusicPlaybackStateInterrupted
iPadではMPMusicPlaybackStatePaused
と異なっている。
いずれもiOS4.3だけど、iPadの方が正しい気がする。
2011年3月17日木曜日
iOSでの印刷
大雑把に次の2つの手順となる。
1.UIPrintInteractionControllerを起動する。
2.UIPrintPageRenderer のサブクラスで印刷処理をする。
【1.について】
イベント発生時(通常はメニュー選択)に呼び出される関数を作成する。
- (IBAction)printPage:(id)sender
{
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if(!completed && error){
NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
}
};
// UIPrintInfo の作成
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = [NSString stringWithFormat: @"job title"];
printInfo.duplex = UIPrintInfoDuplexLongEdge;// 両面印刷
printInfo.orientation = m2pView.frame.size.width < m2pView.frame.size.height ?
UIPrintInfoOrientationPortrait : UIPrintInfoOrientationLandscape;// 用紙方向を画面の方向と同じする
controller.printInfo = printInfo;
controller.showsPageRange = YES;// 複数ページ
// UIPrintPageRendererのサブクラスを作成
MyPrintPageRenderer *myRenderer = [[MyPrintPageRenderer alloc] init];
myRenderer.jobTitle = printInfo.jobName;
myRenderer.m2pView = m2pView;//描画用のコントロールを渡しておく
controller.delegate = myRenderer;//印刷時のdelegate関数はMyPrintPageRendererに記述
// ビューフォーマッターとやらの定義も必要らしい
UIViewPrintFormatter *viewFormatter;
viewFormatter = [self.m2pView viewPrintFormatter];
[myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
controller.printPageRenderer = myRenderer;
[myRenderer release];
// 印刷ダイアログ表示(印刷ボタンを押せばMyPrintPageRendererのdelegate関数が呼ばれる)
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
[controller presentFromBarButtonItem:bbiPrint animated:YES completionHandler:completionHandler]; // iPad
else
[controller presentAnimated:YES completionHandler:completionHandler]; // iPhone
}
【2.について】
Appleが提供するサンプルコードのMyPrintPageRenderer.mがほぼ流用できる。
印刷領域は、ヘッダー・コンテンツ・フッターの上中下3分割となっている。
以下をページ単位に描画すればOK.
- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect;
- (void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect;
- (void)drawFooterForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)footerRect;
1.UIPrintInteractionControllerを起動する。
2.UIPrintPageRenderer のサブクラスで印刷処理をする。
【1.について】
イベント発生時(通常はメニュー選択)に呼び出される関数を作成する。
- (IBAction)printPage:(id)sender
{
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if(!completed && error){
NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
}
};
// UIPrintInfo の作成
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = [NSString stringWithFormat: @"job title"];
printInfo.duplex = UIPrintInfoDuplexLongEdge;// 両面印刷
printInfo.orientation = m2pView.frame.size.width < m2pView.frame.size.height ?
UIPrintInfoOrientationPortrait : UIPrintInfoOrientationLandscape;// 用紙方向を画面の方向と同じする
controller.printInfo = printInfo;
controller.showsPageRange = YES;// 複数ページ
// UIPrintPageRendererのサブクラスを作成
MyPrintPageRenderer *myRenderer = [[MyPrintPageRenderer alloc] init];
myRenderer.jobTitle = printInfo.jobName;
myRenderer.m2pView = m2pView;//描画用のコントロールを渡しておく
controller.delegate = myRenderer;//印刷時のdelegate関数はMyPrintPageRendererに記述
// ビューフォーマッターとやらの定義も必要らしい
UIViewPrintFormatter *viewFormatter;
viewFormatter = [self.m2pView viewPrintFormatter];
[myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
controller.printPageRenderer = myRenderer;
[myRenderer release];
// 印刷ダイアログ表示(印刷ボタンを押せばMyPrintPageRendererのdelegate関数が呼ばれる)
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
[controller presentFromBarButtonItem:bbiPrint animated:YES completionHandler:completionHandler]; // iPad
else
[controller presentAnimated:YES completionHandler:completionHandler]; // iPhone
}
【2.について】
Appleが提供するサンプルコードのMyPrintPageRenderer.mがほぼ流用できる。
印刷領域は、ヘッダー・コンテンツ・フッターの上中下3分割となっている。
以下をページ単位に描画すればOK.
- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect;
- (void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect;
- (void)drawFooterForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)footerRect;
登録:
投稿 (Atom)