Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2011-04-25

じつはもっと簡単なAdHocアプリ(ipa)の作成方法があった件... for Xcode4

| 01:05 | はてなブックマーク -  じつはもっと簡単なAdHocアプリ(ipa)の作成方法があった件... for Xcode4 - iPhoneアプリ開発まっしぐら★

昨日AdHoc版の作り方について記事を書いたが...

この後、Twitterでnovi_さんから

あれ、これって普通にReleaseビルドして、Shareの時にCode Signじゃだめでしたっけ。

というご指摘。

要するに、

  • AdHoc用Configurationとかは作らなくてもOK
  • Edit SchemeとかしなくてもOK

ということ。

実際、novi_さんの言うとおりやってみると、たしかにそれだけでOKでした。

ご指摘ありがとうございます!

以下、AdHocアプリ(ipa)作成の短縮版、まとめさせていただきます。


事前準備

前回と同様、

  • 自分のPCにDistribution(配信用)の証明書がインストールされていること
  • iOS Provisioning Portal に、AdHoc用アプリをインストールする対象端末のUDIDが登録されていること
  • 対象端末のUDIDが登録されたDistribution用provisioningファイルを取得してあること

の3つの準備がされていることを前提とする。

オーガナイザにAdHoc用provisioningファイルを登録する

この手順はまだやってなければ前回と同様に必要。

Xcode4の画面の右上のほうに[Organizer]というボタンがあるのでそれをクリックし、オーガナイザを表示する。

次に、オーガナイザの[Devices]タブを選択し、オーガナイザの左側のリストから[LIBRARY]→[Provisioning Profiles]を選択する。

すると、オーガナイザには現在登録されているprovisioningファイルの一覧が表示されるため、そこに今回用のAdHoc用provisioningファイルをドラッグ&ドロップして登録しておく。

f:id:tokorom:20110425013730p:image

Let's Archive!

デフォルトではArchiveを実行すると、Release用Configurationが利用されるようになっている。

AdHoc用として特に変更する内容がなければそのままRelease用設定を使えばOKということ。

ということで、Release用Configurationが利用されるデフォルト設定のまま、Xcode4のメニューから[Procust]→[Archive]と選択してArchiveを実行する*1

すると下図のようにArchiveした結果の一覧画面みたいのが表示される。

f:id:tokorom:20110425015414p:image

ここで[Share...]ボタンをクリックすると、出力方式として「ipa」が選択可能になっている。

f:id:tokorom:20110425015415p:image

ここでipaを選択し、Identityの項で"AdHoc用provisioning"をきちんと選択さえすれば、あとは[Next]ボタンを押して出力するだけ。

ipaファイルが出力できたら、これまでどおりiTunesに

  • ipa
  • provisioning

の2ファイルをドラック&ドロップして同期をとってAdHocアプリのインストール完了です!

まとめ

なんと、こんな簡単なことだったのか!

要するに、novi_さんからのご指摘どおり、Archive実行後にAdHoc用のprovisioningファイルを選択してSignするだけ。

前回記事に書いたように、律儀にAdHoc用のConfigurationを作るのは

  • Release用ConfigurationとAdHoc用ConfigurationでCode Signing以外に変更すべき箇所がある場合

のみということでしょう。

*1:Archiveが実行できない場合、Destinationが実機向けになっていることを要確認

NamfonNamfon2012/02/05 11:56You're on top of the game. Thanks for sahirng.

pwuoiniipwuoinii2012/02/05 23:27XoApRo <a href="http://uwonnqrubqkf.com/">uwonnqrubqkf</a>

ksjaflupngwksjaflupngw2012/02/07 22:05x6auYW , [url=http://ummczstbdrte.com/]ummczstbdrte[/url], [link=http://ptymfcamjcyn.com/]ptymfcamjcyn[/link], http://eorivdakqmdq.com/

gwniqecldvigwniqecldvi2012/02/10 23:51GShFEG <a href="http://rjcdrwhnwmkq.com/">rjcdrwhnwmkq</a>

wmochxucwmochxuc2012/02/12 01:35frSunT , [url=http://ntbtunnxrjmu.com/]ntbtunnxrjmu[/url], [link=http://ktoerrvgkfkb.com/]ktoerrvgkfkb[/link], http://hehaidhlfyno.com/

guestguest2012/07/21 11:05Ad hoc版を作る場合はProvisioningファイルはIPAといっしょにiTunesにロードするので、Organizerでデバイスをつないだり、Provisioningをそのデバイスにロードする必要はないのではないでしょうか。もちろんしてもかまいませんが。

tokoromtokorom2012/07/25 00:12個人的にはプログラマはiTunesを使わずXcodeだけでAdhoc版のインストールまでしてしまうのがオススメです♪
インストール時にエラーが発生した際なども原因が分かりやすかったりします。

2011-04-24

Xcode4でのAdHocアプリ(ipa)の作成方法詳解

| 01:57 | はてなブックマーク -  Xcode4でのAdHocアプリ(ipa)の作成方法詳解 - iPhoneアプリ開発まっしぐら★

はじめに注意!

この記事を書いた後にTwitterでもっと簡単な方法があるよというのをご教示いただきました。

そのため、より簡単な方法については、次の記事をご参照願います。

こちらの記事は、

  • AdHoc配信用に専用の設定(Configuration)が必要な場合

のみご参照ください。

Xcode4になって

どうもこれまでと同じかんじではAdHocアプリを作成できないとか。

自分の場合、今日までXcode4さえインストールできていなかったので、これを機会にXcode4をインストールしてAdHoc用ビルドをしてipa形式で出力するところまでを試してみようと思い立った。

なお、基本的には

のとおりにやっただけ。

そのため、英語がNGでないかたは↑をそのまま見てもらったほうがよいかと。

以下、基本的にはXcode3→Xcode4の差分しか記載しておりません。

事前準備

この記事は、Xcode3以前でAdHocなアプリをビルドした経験のあるかたを対象とし、provisioningファイルの作成やCertificationについては言及しない。

そのため事前に

  • 自分のPCにDistribution(配信用)の証明書がインストールされていること
  • iOS Provisioning Portal に、AdHoc用アプリをインストールする対象端末のUDIDが登録されていること
  • 対象端末のUDIDが登録されたDistribution用provisioningファイルを取得してあること

の3つの準備がされていることを前提とする。

オーガナイザにAdHoc用provisioningファイルを登録する

この手順は基本的にはXcode3までと同じである。

Xcode4の画面の右上のほうに[Organizer]というボタンがあるのでそれをクリックし、オーガナイザを表示する。

次に、オーガナイザの[Devices]タブを選択し、オーガナイザの左側のリストから[LIBRARY]→[Provisioning Profiles]を選択する。

すると、オーガナイザには現在登録されているprovisioningファイルの一覧が表示されるため、そこに今回用のAdHoc用provisioningファイルをドラッグ&ドロップして登録しておく。

f:id:tokorom:20110425013730p:image

AdHoc用Configurationを作成する

まずはXcode3のときと同様にAdHoc用のConfigurationを作成する必要がある。

Xcode4では、まず、該当PROJECTを選択し、[Info]タブを選択する。

すると、下図のようにDebugとReleaseというConfigurationが並んでいるはずなので、ReleaseをベースにしてAdHocを追加することにする。

それには、Configurationsの下にある[+]ボタンをクリックし、「Duplication "Release" Configuration」を選択する。

f:id:tokorom:20110425013731p:image

すると、Releaseをベースとした新しいConfigurationが作成されるので名前を "AdHoc" に設定する。

AdHoc用ConfigurationにAdHoc用のprovisioningファイルを設定する

次に、AdHoc用ビルドの際に、AdHoc用のprovisioningファイルが利用されるように設定する。

該当PROJECTを選択し、今度は[Build Settings]タブを選択する。

Xcode3までと違い、各Configurationの設定項目がマージされた形で表示される。

この中の[Code Signing]→[Code Signing Identity]→[AdHoc]→[Any iOS SDK]の値の部分をクリックし、先ほどオーガナイザに登録したAdHoc用provisioningファイルを選択する。

f:id:tokorom:20110425014016p:image

SchemeのArchiveの項でAdHoc用Configurationが利用されるよう設定する

次に、Schemeの設定を変更する。

Schemeの設定変更は、Xcode4の左上の下図の赤枠のところをクリックし「Edit Scheme...」を選択することで可能。

f:id:tokorom:20110425015238p:image

こうして表示した編集ダイアログの左から「Archive」を選択し、「Build Configuration」の項をさきほど作成した「AdHoc」に変更する。

あとは、Desitinationも「iOS Device」にしておく*1

これで[OK]ボタンをクリックすれば、Schemeの設定変更は完了。

f:id:tokorom:20110425015239p:image

Let's Archive!

あとは出力するだけ*2だ。

Xcode4のメニューから[Procust]→[Archive]と選択してArchiveを実行する*3

すると下図のようにArchiveした結果の一覧画面みたいのが表示される。

f:id:tokorom:20110425015414p:image

ここで[Share...]ボタンをクリックすると、出力方式として「ipa」が選択可能になっている。

f:id:tokorom:20110425015415p:image

ここでipaを選択し、Identityできちんと該当のAdHoc用provisioningを選択さえすれば、あとは[Next]ボタンを押して出力するだけ。

ipaファイルが出力できたら、これまでどおりiTunesに

  • ipa
  • provisioning

の2ファイルをドラック&ドロップして同期をとってAdHocアプリのインストール完了です!

*1:実機が接続してある場合には違う名前になってるかも

*2:もちろんふつうにアプリがビルド可能な状態であること

*3:Archiveが実行できない場合、Destinationが実機向けになっていることを要確認

MarianaMariana2012/06/01 13:12I told my granmodther how you helped. She said, "bake them a cake!"

gdilfqgdilfq2012/06/02 03:01Y5i6Wr , [url=http://gaenigrikloh.com/]gaenigrikloh[/url], [link=http://scudrramdngr.com/]scudrramdngr[/link], http://abqodwlgedxy.com/

tnkdvdwnwlwtnkdvdwnwlw2012/06/04 05:28ReVBOd , [url=http://nwaolnepikjw.com/]nwaolnepikjw[/url], [link=http://wsiinxrcwgfu.com/]wsiinxrcwgfu[/link], http://dkfjrgrlvqyl.com/

guestguest2012/07/21 10:36参考になりました。でも、provisioningとcertificateがごちゃまぜになっているように思いました。

2011-01-01

iPhone vs. Android というネタでぼくも書いてみた

01:36 | はてなブックマーク - iPhone vs. Android というネタでぼくも書いてみた - iPhoneアプリ開発まっしぐら★

今年は技術ネタだけでなく文章メインのものも書いていこうということで、まずは最近よく見るタイトルでぼくも書いてみる。


個人的にどっちに勝ってほしいか

というとどっちでも良いな。

スマートフォンという大きな波が来たことこそ重要であれ、どっちが勝つかというのは技術者目線ではそれほど重要でない気もする。

けっきょくのところiPhoneとAndroidはお互いが引き立て役になって、またライバルとして成長しているのが現実ではないだろうか。

純粋にiPhoneとAndroidで比較した場合

仕事の場でも「iPhoneとAndroidはどっちが来るんですかね?」という話題になることがあるが、そういうときは「数ではAndroid。質ではiPhoneと思います。」と常に答えている。実際今現在はそうなんだと思う。

とはいえ、このままAndroid機の数が増え続ければ当然質もiPhoneに近づき、どっちもどっちだねというところまでいくのは時間の問題だとも思う。そういう意味では、純粋にスマートフォンとしてiPhoneとAndroidを比較した場合、Androidが勝つのかもしれない。

iOSとAndroidで比較した場合

ぼくはiPadをアメリカから輸入してまで買ったわけだが、けっきょくのところあまり使っていないし、正直なくなってもあまり困らない。普段iPhoneを持ち歩いているので、わざわざ重いiPadを持ち歩く気にはなれないし、それこそ持ち歩くならGalaxy Tabのほうがいいかなとも思う。

でもiPadはすごい。それは嫁のパソコンがiPadに置き換わったからだ。ぼくのが置き換わらずに嫁のが置き換わったというのがすごい。うちの嫁はパソコンでプログラミングをするような人種では全くなく、パソコンをメールとWebブラウジングをするくらいにしか使っていなかった。ぼくにはiPadはなにかと中途半端なのだが、嫁にとってはiPadの簡便さも大きさも全てがちょうどいいらしい。実際ぼくのような人種よりも嫁のような人種のほうが多いわけで、そういう人たちにきちんと知られるタイミングこそiPadが本当に爆発するときなのかもしれない。

ぼくのiPhoneはもしかしたらGalaxy Sに置き換わるかもしれない。ただ、嫁がiPadをGalaxy Tabに置き換えることは想像できない。また、ぼくのMac(iOSじゃないけど)がAndroid機に置き換わることもない。総じてiOSのほうが優勢というのが今現在のぼくの印象だ。

ビジネスの場ではどちらが使われる?

数年前まで家のパソコンは絶対Windowsだと思ったのは、やはり会社で使っていたのがWindowsだったからだろう。今後スマートフォンがビジネスの場でも活躍していくのは当然のとこで、だとすればiPhoneとAndroidのどちらがビジネスの場で多く使われていくかというのが、じつはかなり重要な事項なのかもしれない。

そういう意味では今現在はどっちもどっちといったところか。iPhoneとAndroid機でいうとiPhoneのほうがビジネス向けという印象があるが、ビジネス向けに特化したAndroid機もこれからいろいろと出てくるような気がする。けっきょくのところ、端末自体というよりはActiveDirectory的な仕組みをよりきっちり作れたほうに軍配が上がるんだろうと思う。

そしてWindows vs. Macへ

ビジネス向け...というところに話を持っていってそこでiPhoneをということになると、極論としてはパソコンも、よりiPhoneと親和性の高いMacに変更というのも有り得ない話ではないかもしれない。3年前まではMacなんてなくなればいいと思っていた自分がいつの間にかMacを愛用するようになったように。

スマートフォンをきっかけとして過去には勝負がついたとされているWindows vs. MacでMacが逆転するというのはなかなか面白い。それがWindows vs. Mac&Androidでも良い。

実際どうなるのかというのは正直わからないが、確実にiOSもAndroidもこれからがもっと熱い。この現在進行中の戦いは、iPhone vs. Androidというレベルではなく、今現在のパソコンの在り方に影響するくらいの荒波になるかもしれない。

JeniferJenifer2012/02/04 20:55That insghit's perfect for what I need. Thanks!

ltgxavcljltgxavclj2012/02/05 23:111opz7X <a href="http://yvlnzfcnawsi.com/">yvlnzfcnawsi</a>

qgbrzauqgbrzau2012/02/07 22:56VGLKn2 , [url=http://cpgopetrpfza.com/]cpgopetrpfza[/url], [link=http://clagzfewiikb.com/]clagzfewiikb[/link], http://wurftpmicqsg.com/

mmlkeememmlkeeme2012/02/10 23:13hkwhoB <a href="http://rgfiliwwengn.com/">rgfiliwwengn</a>

mbccsisagsjmbccsisagsj2012/02/12 02:305fDqmp , [url=http://cnqhrksdfypv.com/]cnqhrksdfypv[/url], [link=http://erwmqedqwfzw.com/]erwmqedqwfzw[/link], http://khawyudpjspf.com/

2010-11-10

実行時にiPadとiPhoneの処理を分けるための関数作成

01:15 | はてなブックマーク - 実行時にiPadとiPhoneの処理を分けるための関数作成 - iPhoneアプリ開発まっしぐら★

かなり小ネタですが、最近更新できてなかったので。

iPadとiPhoneとで実行時に処理を分けたいときの関数を↓のようなかんじで作りました。

static int s_isiPad = -1;
BOOL isiPad() {
  if ( -1 == s_isiPad ) {
    s_isiPad = [[UIDevice currentDevice].model hasPrefix:@"iPad"] ? 1 : 0;
  }
  return s_isiPad;
}

基本的にはUIDeviceのmodelプロパティを確認しているというだけで、iPadの実機でもシミュレータでも対象となるよう、"iPad"という文字列を完全一致でなくhasPrefixでチェックしています。

また、一度確認が取れたら、それ以降はモデル名の取得とか文字列比較とかをするのは無駄になるので、static変数に結果を格納して2回目以降はそれを返すというかんじです。


実際にこの関数を使う際には、

if ( isiPad() ) {
  // iPadの処理
} else {
  // iPhoneの処理
}

という感じです。

2回目以降はBOOL型のstatic変数を見るだけなので時間的なロスはあまりないと思います。


iPadの処理もiPhoneの処理も同じアプリ内に入るので、iPadでもiPhoneでも同じアプリを配信できるというメリットはありますが、アプリサイズはその分大きくなるというデメリットがあります。



iOS3.2以上で利用できる更新版

このあと、皆様からiOS3.2以降なら UI_USER_INTERFACE_IDIOM() が便利ですよーというのを教えていただきまいたので、更新版が以下です。

BOOL isiPad() {
  return UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM();
}

obysobys2010/11/11 08:16わたしはUI_USER_INTERFACE_IDIOM()で判別していました。
この方法もいいですね。

tokoromtokorom2010/11/11 10:14ありがとうございます!
UI_USER_INTERFACE_IDIOM()いいですねー。
教えていただき関数の中身を見てみたら、基本はUIDeviceのuserInterfaceIdiomを確認し、そのメソッドが見つからなければiPhoneという2段階の判定がされていて有用そうです!

KassiKassi2011/05/15 22:13I'm out of league here. Too much brain power on dspilay!

nglquqgtsbnnglquqgtsbn2011/05/16 10:533s6WgQ <a href="http://wgzeodjmmihk.com/">wgzeodjmmihk</a>

udzkplbgvudzkplbgv2011/05/17 11:20UVFhpV , [url=http://bsoewuqcwvyf.com/]bsoewuqcwvyf[/url], [link=http://urhlrruphrgl.com/]urhlrruphrgl[/link], http://mngijszlwmod.com/

cezsmqyddawcezsmqyddaw2011/05/30 00:01hbjizT , [url=http://xqxrwjqvfvbr.com/]xqxrwjqvfvbr[/url], [link=http://gxhjfdgoyewz.com/]gxhjfdgoyewz[/link], http://uyafzloevdhu.com/

2010-10-02

UIScrollViewを絶対に斜めにスクロールさせない方法

| 14:52 | はてなブックマーク -  UIScrollViewを絶対に斜めにスクロールさせない方法 - iPhoneアプリ開発まっしぐら★

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正 > UIScrollViewを絶対に斜めにスクロールさせない方法


UIScrollViewにはdirectionalLockEnabledというプロパティがあり、ここにYESを設定すると、上下にスクロールしはじめたら上下固定、左右にスクロールしはじめたら左右に固定となるため、斜めにスクロールできないようにしたい場合に便利です。

しかし、これには重大な欠陥(仕様?)があり、はじめから斜めにスクロールしはじめると斜めにスクロールできてしまうのです*1

そのため、斜めに絶対にスクロールさせないためには、自分で制御しなければなりません。


具体的には、以下のストーリーで制御を行ないます。

1. スクロール前のスクロール位置を保存しておく
2. スクロールしはじめたら、それが上下方向か左右方向かを判別して記憶する
3. 上下方向なら、それ以降のスクロールで左右に移動してしまったぶんを無理やり元に戻す
4. 左右方向なら、それ以降のスクロールで上下に移動してしまったぶんを無理やり元に戻す

スクロールの検知はUIScrollViewDelegateのscrollViewDidScroll:メソッド、スクロール位置の矯正はUIScrollViewのsetContentOffset:メソッド*2でそれぞれ行ないます。


具体的なコードは以下のとおり。

これをUIScrollViewを継承したクラスかUIScrollViewを管理しているクラスに追記します。

【interface側】

typedef enum
{
  kILScrollViewDirectionNone = 0,
  kILScrollViewDirectionHorizontal = 1,
  kILScrollViewDirectionVertical = 2,
} ILScrollViewDirection;

@property (nonatomic, assign) ILScrollViewDirection direction;
@property (nonatomic, assign) CGPoint beganPoint;

【implementation側】

@synthesize direction = direction_;
@synthesize beganPoint = beganPoint_;

// スクロール管理の初期化
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView {
  self.direction = kILScrollViewDirectionNone;
  // スクロールしはじめのoffset管理
  self.beganPoint = [scrollView contentOffset];
}

// スクロール位置の矯正
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
  CGPoint currentPoint = [scrollView contentOffset];
  if ( kILScrollViewDirectionNone == self.direction ) {
    // スクロール方向の決定
    if ( !CGPointEqualToPoint( currentPoint, self.beganPoint ) ) {
      CGFloat moveHorizontal = ABS( currentPoint.x - self.beganPoint.x );
      CGFloat moveVertical = ABS( currentPoint.y - self.beganPoint.y );
      if ( moveHorizontal < moveVertical ) {
        NSLog( @"direction = Vertical" );
        self.direction = kILScrollViewDirectionVertical;
      } else {
        NSLog( @"direction = Horizontal" );
        self.direction = kILScrollViewDirectionHorizontal;
      }
    }
  }
  if ( kILScrollViewDirectionVertical == self.direction ) {
      currentPoint.x = self.beganPoint.x;
      [scrollView setContentOffset:currentPoint];
  } else if ( kILScrollViewDirectionHorizontal == self.direction ) {
      currentPoint.y = self.beganPoint.y;
      [scrollView setContentOffset:currentPoint];
  }
}

この他、UIScrollViewDelegateには、

  • (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;

で、慣性のアニメーションも含めてスクロールが完全に終わるのを検知する機能なども備わったりしています。

*1:iOS4.1現在

*2:contentOffsetプロパティ

DiosmaryDiosmary2012/02/07 02:19I feel saistfied after reading that one.

afkzorrxsliafkzorrxsli2012/02/07 17:36YwRFJD <a href="http://hfvnyjmaylup.com/">hfvnyjmaylup</a>

ryzvrizlxryzvrizlx2012/02/09 20:49YePVl1 , [url=http://ilafqvobogzb.com/]ilafqvobogzb[/url], [link=http://extouivsybdi.com/]extouivsybdi[/link], http://xivfvtxrgpua.com/

omjjiaxomjjiax2012/02/11 02:20GJQx3W <a href="http://vxlrpnigxovg.com/">vxlrpnigxovg</a>

czzqjeuczzqjeu2012/02/12 03:44rtKW1V , [url=http://dtzinzwejddp.com/]dtzinzwejddp[/url], [link=http://tabyjeeqfmpb.com/]tabyjeeqfmpb[/link], http://hpmxkcvmlqes.com/

CharlieCharlie2013/10/13 10:57Thinking like that is really imvisserpe

MarijanaMarijana2013/10/14 14:21You've hit the ball out the park! Inebcdirle!

KatrinaKatrina2013/10/15 04:02You <a href="http://ztpyupaomw.com">co'ulndt</a> pay me to ignore these posts!

StivenStiven2013/10/15 15:38That's a wise answer to a tricky quitseon http://jrqfcy.com [url=http://cvnkfkniwt.com]cvnkfkniwt[/url] [link=http://nlqktxnjnah.com]nlqktxnjnah[/link]

KahlouchaKahloucha2013/11/03 18:13Kewl you should come up with that. <a href="http://uacatmwe.com">Exltlcene!</a>

SluxzSluxz2013/11/12 23:30Check that off the list of things I was <a href="http://ynmgjzxubtd.com">coeunsfd</a> about.

ElenaElena2013/11/14 12:03At last, soenome who comes to the heart of it all http://hkvjrzl.com [url=http://vfqzwh.com]vfqzwh[/url] [link=http://wzkeisopfj.com]wzkeisopfj[/link]

HeberHeber2013/11/16 03:22That's a brilliant answer to an <a href="http://imsxwdeie.com">intsreeting</a> question

ToshihideToshihide2013/11/18 02:51I'm quite pleased with the inorfmation in this one. TY! http://pvoitao.com [url=http://ykoqymm.com]ykoqymm[/url] [link=http://ifhsrbz.com]ifhsrbz[/link]