忍者ブログ
  • 2024.10
  • 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
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 06:19 】 |
AutoLayoutをコードから指定
iPhone6や6Plusが登場することにより、iOSデバイスの画面サイズ種類は
機種画面サイズ縦横比
4,4S960x 6403:2
5,5S,5C1136x 640約16:9
61334x 750約16:9
6Plus1920x1080約16:9
iPad mini1024x 7684:3
iPad Retina/Air/mini Retina2048x15364:3

と6種類にも及ぶことになる。


ますますUseAutoLayoutを使いこなしていくことは重要になってくる。

UseAutoLayoutを使っていて、動的に指定したくなることがある。
そういう場合、UseAutoLayout自体を使わなくするという手もあるが、画面サイズの違いを吸収できなくなるので適切でない。
UseAutoLayoutのON/OFFはストーリーボード単位での指定になるので、別ストーリーボードに分けることで影響を絞る、という手もあるといえばある。

しかし、コードからレイアウト指定ができると便利になる。
その方法が

参考

に書いてあった。
公式リファレンスは以下を参照。
NSLayoutConstraintクラス

AutoLayoutガイド


なお、注意点をいくつか。

・AutoLayoutによる配置が実行されるタイミング
これは、viewWillAppearとviewDidAppearの間になる。
つまり、レイアウト制約の指定はviewDidLoadかviewWillAppearあたりでやっておけばいいということになる。

しかしそれは同時に、viewDidAppearまで各ビューのframe,boundsは信用できる値になっていないということでもある。
具体的に言うと、storyboard上で配置してある座標やサイズがそのまま入っていたりする。
その値を使って別のビューの座標やサイズを計算すると、思わぬずれが生じることになる。
storyboard上では、iPhone5Sのサイズで作っていることが多いだろう。だからiPhone5Sの実機やシミュレータで実行していると気付きにくい。別のサイズのデバイスで実行したときに発覚することになるだろう。

対処としては、viewDidAppear後に座標やサイズの計算をすればよい。しかし、一瞬(1フレーム?)計算前の状態でビューが表示されてしまう。
だから、そのビューはstoryboardに配置せずにコードで生成するようにするとか、初めはhiddenにしておくとかいう手間をかけておく必要がありそうだ。

それが面倒なら、viewDidLoadかviewWillAppearで、ということになるが、
その場合はビューの正確な位置をコード中で求めることになりそうだ。AutoLayoutの指定の中で、信用できる数字を使うことになる。例えばHeightを40に指定しているとか、親ビューからの相対座標をx=20にしている、とかそういう制約から計算することになる。
しかしこれはUseAutoLayoutと意味が二重になるのであまりうれしくない。


PR
【2014/09/11 18:42 】 | iPhone | 有り難いご意見(0)
A valid provisioning profile for this executable was not found
Xcodeで、久しぶりにプロジェクトを実機に転送しようとすると発生することがある。

A valid provisioning profile for this executable was not found



参考


そして…
スキームを確認し、デバッグBuildになっているかどうか確認すること!

【2014/09/03 11:52 】 | iPhone | 有り難いご意見(0)
iOSでfacebook投稿
Social.frameworkを追加し、


#import <Social/Social.h>

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
SLComposeViewController *facebook = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

// 投稿するコンテンツを設定する
// 表示する文字列
[facebook setInitialText:initialText];
// URL
[facebook addURL:[NSURL URLWithString:@"http://www.xxxx/"]];
// 画像
[facebook addImage:[UIImage imageNamed:@"sample.png"]];
// コールバック
[facebook setCompletionHandler:^(SLComposeViewControllerResult result) {
switch (result) {
case SLComposeViewControllerResultDone:
NSLog(@"Done");
break;
case SLComposeViewControllerResultCancelled:
NSLog(@"Cancelled");
break;
}
}];

// 表示する
[self.viewController presentViewController:facebook animated:YES completion:nil];
}

【2014/08/23 12:24 】 | iPhone | 有り難いご意見(0)
iOS,Androidゲームを作るにあたって発注者が用意すべきもの
アクション
スキームのみ


アプリ名(正式名称。ストアに載せるもの)
短縮アプリ名iPhone(全角6文字以内がよい)
短縮アプリ名Android(正式名と同じでもよい)
バンドルID。(iPhone、androidのパッケージ名。広告SDKやanalyticsなどで使用するので先に決めておくのが良い)

各種アイコン。
とてもややこしい。以下参照
ios,android
iPhone、iPad
ios全バージョン

ややこしすぎるので、一覧を作るのはやめてユースケースだけ挙げておく。
どのバージョンでも、iTunesストア用のアイコン
512,1024



は必要。
それに加えて
iPhoneのみで7以降なら
58(設定),80(spotlight),120(アイコン)



が必要。
iPhoneで6も含むなら、さらに
29(設定、spotlight),57(アイコン),114(アイコン)



が必要。




andoroidに関しては
192,144,96,72,48,36
が必要。

動作確認用の端末のUUIDの一覧。


Apple Dev Centerのアカウント。
チームアカウントで作れば、複数のアカウントを紐づけることができる。権限も個別にしてい可能。iTunesConnectとは別に管理もできるので、開発者だけに渡すアカウントも作れる。

Google Play Devのアカウント。


他に、必要なら以下も。
TestFlightのアカウント。アプリの共有に。
広告SDKのアカウント。(バンドルIDも併せて使う場合あり)
PUSH通知などのサービス(証明書なども併せて使う場合あり)
Google Analytics(普通はGoogle Play Devと同じでよい)


ストアへの提出を行う場合は、以下も。
iOSの場合

iTunesConnectのアカウント。
ストア文面
検索用キーワード
配信国
Copyright表記
アプリのカテゴリー
サポートURL
レビュー中コンタクト情報(苗字、名前、emal、電話番号)
スクリーンショット(1024x768,960x640,1136x640の3種。各最大5枚)
配信開始予定日

Androidの場合

簡単な説明(80文字以内)
詳細な説明(4000文字以内)
スクリーンショット。3種各最大8枚。1 辺の長さが320~3840px。
高解像度画像 512 x 512
宣伝用画像 1,024 x 500
プロモーション画像 180x120
アプリのタイプ・カテゴリ
連絡先のウェブサイトまたはemail(あれば電話番号も)
プライバシーポリシーを書いたURL(あれば)
販売国

【2014/08/12 14:29 】 | iPhone | 有り難いご意見(0)
プロビジョニングプロファイルを手で追加する
最近のXCodeは優秀で、アカウントとの紐付けさえできていれば自動でプロビジョニングプロファイルを作ったり更新したりしてくれる。

でも、人からもらったプロビジョニングを使うときもある。外注とか。

そのときの手順。


まず、プロファイルを確認する。



これの中身を見る。

$ less XXX.mobileprovision



こんな感じで情報が載っていて、この中の「UUID」の項目を確認する。

プロビジョニングプロファイルってどこにあるのかというと、


~/Library/MobileDevice/Provisioning\ Profiles/


ここ。
見てみると



こうなっている。
プロビジョニングプロファイルの固有識別子(UUID)をファイル名として一覧になっている。

つまり、ここに手動でコピーすれば良い。

UUIDは今確認したので、


$ cp XXX.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision



とすればよい。
これでOK。
必要ならXCodeを再起動すれば、一覧に出てくる。



これでOK。


ただし注意点として、秘密鍵がないと実機実行は起動できないようだ。


【2014/08/12 13:08 】 | iPhone | 有り難いご意見(0)
obj-cかどうかマクロで見分ける
ヘッダファイルがC/C++ファイルから読み込まれたのか、
Obj-Cファイルから読み込まれたのか。
見分けたいときはコレ。


#ifdef __OBJC__
#endif
【2014/06/30 23:53 】 | iPhone | 有り難いご意見(0)
ゲーム中ハイスコアの記録
ハイスコアなどの記録方法。
NSUserDefaults を使う。

記録

void CallSetData(const char *ckey, int data){
NSString* nskey = [NSString stringWithUTF8String:ckey];
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:data forKey:nskey];
[userDefaults synchronize];
}



取得

int CallGetData(const char *ckey) {
NSString* nskey = [NSString stringWithUTF8String:ckey];
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger data = [userDefaults integerForKey:nskey];
return (int)data;
}



参考
【2014/06/26 15:32 】 | iPhone | 有り難いご意見(0)
AppStoreへ飛ばす
URLスキームを使う

NSURL *myURL = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/idxxxxxxx"];
[[UIApplication sharedApplication] openURL:myURL];



うーむ簡単。
urlの部分(itunes.apple.com以下)は、AppStore上に実在してればどこでもOK。



もう少しいろいろしたい場合の参考。

iPhone端末内にアプリがある場合はアプリを、ない場合はAppStoreを開くコード

アプリ内でApp Storeが開ける! SKStoreProductViewControllerについて
【2014/06/26 01:21 】 | iPhone | 有り難いご意見(0)
viewの初期化メソッド
ビューコントローラには二つの初期かメソッドがある。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
-(id) initWithCoder:(NSCoder *)aDecoder

nibで定義されていれば前者が、
そうでないアーカイブオブジェクトなら後者が呼ばれる。
必ず行いたい初期化処理があれば、共通のメソッドを作っておいて両方から呼ばせる。


-(void)_init{
//初期化
}

-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
[self _init];
}
return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self _init];
}
return self;
}



参考

【2014/06/21 16:13 】 | iPhone | 有り難いご意見(0)
実行時やアーカイブ作成時のcode signエラー
XCodeでアーカイブを作るとき、以下のようなエラーが出ることがある。

code signエラーというわけ。
昔はよく起きたが、最近はXCodeが賢くなって自動でiOS Dev Centerにアクセスしてプロファイルを取得したり作成自体もしてくれたりして便利になっている。
が、今でもときどき起きることがある。


このエラーに遭遇したときは、certificate か、provisioning profile を更新しよう。



provisioning profile の更新は、XCodeのpreference から Account タブをクリックし、 左ペインのApple IDを選択、右ペインの該当するアカウント名をダブルクリック。
小ウィンドウが出てくるので、更新ボタンを押す。これでよし。




もしこれでうまく行かないときは、古いprovisioning profile を手動で消すという方法もある。
provisioning profile は

~/Library/MobileDevice/Provisioning Profiles




に置いてある。ファイル名は固有の英数字になっている。iOS dev Center からダウンロードしたときのファイル名とは違う。
どれが該当のファイルなのか?ということだが、provisioning profile の中身は plist つまりXMLなので読める。

:
:
ExpirationDate
YYYY-MM-DDThh:mm:ssZ
Name
iOS Team Provisioning Profile: XXXXX.XXXXX.XXXXX
TeamIdentifier

XXXXXXXXXXX

TeamName
XXXXXXXXXXX
TimeToLive
XXX
UUID
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
:
:




というふうに書いてある。
Expiration Dateが過ぎているとか、そういうところから判断しよう。


それでもだめなら?
Certificate が無い可能性もある。
自分で作ったprovisioning profile でないなら特に、Certificateは取ってきておく必要がある。
iOS Dev Centerからdownloadして、ファイルをダブルクリック。キーチェーンに追加されたのを確認しよう。XCodeも再起動。


これでうまく行くはずだ。

【2014/06/14 02:03 】 | iPhone | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>