Other Linker Flagsに「-Objc -all_load」を設定したら、コンパイルエラーが発生した、どうやら、Admob SDKが起因していたのだが、根本的な解決方法はなさそうだったので、最新版のSDKに差し替えたら、エラーが取れた。
どうやら、リリースノートを読んでみると、バージョン6.5.0に、「Updated mediation warning messages for linker flag usage.」と書かれているので、この時に治ったのではないだろうかと推測できる。
とりあえず治って一件落着。
2014/06/30
[iOS][Objective-C]AviarySDKのコンパイル時にエラー
2014/06/29
[iOS][Objective-C]AviarySDKツールの並び順を変更する
AviarySDKを使ってツールの並び順と出し分けをしたい場合があります。
そんな時は、AFPhotoEditorCustomizationクラスのsetToolOrderメソッドを使って下のように組めばおk
[AFPhotoEditorCustomization setToolOrder:@[kAFEnhance,kAFEffects,kAFStickers,kAFOrientation, kAFAdjustments, kAFSharpness, kAFDraw, kAFText, kAFRedeye, kAFWhiten, kAFBlemish, kAFMeme, kAFFrames, kAFFocus,kAFSplash,kAFBlur]];確かに、切り抜きを表示させなくすることができました。
有料版ではない場合は、ロゴは必ずでてしまうので、そこは撤去することができません。
いいねー、これ。
2014/06/28
[iOS][Objective-C]AviarySDKを呼び出す
前回、SDKをダウンロードするところまで書いたので、今日は、それを呼び出すところまで。
- ダウンロードしたAviarySDK-4.1.0フォルダの中にある「AviarySDK folder」をXcodeにコピーする。
- Accelerate.framework
CoreData.framework
AviarySDK.framework
libsqlite3.0.dylib
libz.1.2.5.dylib
Foundation.framework
MessageUI.framework
OpenGLES.framework
QuartzCore.framework
StoreKit.framework
UIKit.framework
をそれぞれaddする。 - Build SettingsにあるOther Linker Flagsに「-Objc -all_load」を設定する
- AppDelegate.hファイルに
#import <AviarySDK/AviarySDK.h>
を記述する
- AppDelegate.mに
static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [AFPhotoEditorController setAPIKey:kAviaryAPIKey secret:kAviarySecret]; });
を書く。kAviaryAPIKeyは、NSStringでKeyを、kAviarySecretは、NSStringでSecretを設定。 - 任意のクラスファイルで、AviarySDKをインポートして、
AFPhotoEditorController *editorController = [[AFPhotoEditorController alloc] initWithImage:imageToEdit]; [editorController setDelegate:self]; [self presentViewController:editorController animated:YES completion:nil];
で呼び出すことができる。
- AFPhotoEditorControllerDelegateを設定して、下記クラスを書く。
- (void)photoEditor:(AFPhotoEditorController *)editor finishedWithImage:(UIImage *)image { // Handle the result image here } - (void)photoEditorCanceled:(AFPhotoEditorController *)editor { // Handle cancellation here }
後、ドキュメントにも書かれていたが、UINavigationControllerにプッシュはしないほうがいいとのこと。
ついついやってしまいがちなので、ここは注意したい。
2014/06/26
[iOS][Objective-C]Aviary SDKの導入方法
Love Nailに写真編集のAviary SDKを導入したかったので、その方法について調査してみた。
- Aviaryのサイトに行ってアカウントの登録をする。
- developers.aviary.com/appsにアクセスして、Add an appを押す
- レイヤーが表示されるので、アプリの名前などを入力して、最後に「Add」ボタンを押す。
- KeyとSecretが表示されればおk
- 最後に、SDKのダウンロードをして、準備完了。
2014/06/25
[iOS][Objective-C]UIViewControllerのpresentModalViewController:animated:について
昨日、UIViewControllerのdismissModalViewControllerAnimated:がdeprecatedされた件を書きましたが、同様に、presentModalViewController:animated:メソッドもdeprecatedされたっぽくって。iOS6からは、- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completionを使うみたいです。
なんだか、細かくチェックしてかないと、何がdeprecatedされたのかわかならないなー。
2014/06/24
[iOS][Objective-C]UIViewControllerのdismissModalViewControllerAnimated:について
どうやら、iOS6で、- (void)dismissModalViewControllerAnimated:(BOOL)animatedメソッドはDeprecatedになったようだ。
代わりに、- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completionメソッドを使うみたいなんですけど、コールバック処理を書かない場合は、^{}でもいいのかも。
2014/06/23
[iOS][Objective-C]ACAccountStoreのrequestAccessToAccountsWithType:withCompletionHandler:について
どうやら、iOS6で、- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType withCompletionHandler:(ACAccountStoreRequestAccessCompletionHandler)handlerメソッドはDeprecatedになったようだ。
代わりに、- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType options:(NSDictionary *)options completion:(ACAccountStoreRequestAccessCompletionHandler)completionメソッドを使うみたいなんですけど、optionsのところは、必要ない場合、nilを設定すればいいようです。
2014/06/22
[iOS][Objective-C]SLRequestについて
ちょっと前にTWRequestクラスを使ってtwitterのAPIにアクセスする方法を書きました。
そこで、今回は、iOS6で新設されたSocial.frameworkを使って問い合わせを行う方法について書きたいと思います。
ACAccount *acAccount; SLRequest *sLRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:[NSURL URLWithString:@""] parameters:@{}]; [sLRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error){ }];上の例では、Twitterの問い合わせですが、SLServiceTypeTwitterをSLServiceTypeFacebookに変更すればFacebookに問い合わせることができます。
2014/06/21
[iOS][Objective-C]UILabelのlineBreakModeプロパティ変更
昨日、UILabelのtextAlignmentプロパティがiOS6で変更されたことを書きましたが、同様に、lineBreakModeプロパティーの値も変更された模様です。
UILineBreakModeWordWrap UILineBreakModeCharacterWrap UILineBreakModeClip UILineBreakModeHeadTruncation UILineBreakModeTailTruncation UILineBreakModeMiddleTruncation |
NSLineBreakByWordWrapping NSLineBreakByCharWrapping NSLineBreakByClipping NSLineBreakByTruncatingHead NSLineBreakByTruncatingTail NSLineBreakByTruncatingMiddle |
2014/06/20
[iOS][Objective-C]UILabelのtextAlignmentプロパティ変更
どうやら、iOS6からUILabelのtextAlignmentプロパティが変更されたようだ。
iOS5までは、
UITextAlignmentLeft UITextAlignmentCenter UITextAlignmentRight |
NSTextAlignmentLeft NSTextAlignmentCenter NSTextAlignmentRight NSTextAlignmentJustified NSTextAlignmentNatural |
2014/06/18
[iOS][Objective-C][Twitter]Social frameworkを使ってツイートを実装する
前回、Twitter Frameworkを使ったツイートの実装方法について書きました。
そこで、今回は、iOS6から新規に導入されたSocial frameworkを使ってツイートを実装してみたいと思います。
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) { SLComposeViewController *sLComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; [sLComposeViewController setInitialText:@"hoge"]; [sLComposeViewController addImage:[UIImage imageNamed:@""]]; sLComposeViewController.completionHandler = ^(SLComposeViewControllerResult result) { if(result == SLComposeViewControllerResultDone){ } }; [self presentViewController:sLComposeViewController animated:YES completion:^{}]; }で、実際に上のソースで実装したら、無事にツイート画面が立ち上がりました。
もう、iOS5からiOS6からの移行がメンドイです。
2014/06/17
[iOS][Objective-C]iOS6に伴うdispatch_release
Xcode5.1のバージョンアップに伴い、今作っているアプリの対応バージョンをiOS5からiOS6にしようと思ったところ、下のプログラムで、エラーが発生。
dispatch_releaseで、エラーの内容は下のような感じ。
ARC forbids explicit message send of 'release' |
確かに、コメントアウトしたら、エラーがなくなりました。If you used GCD or library that depends on it (e.g. Reachability), you should know dispatch_release is no longer needed in iOS 6 with ARC. In fact, if you try to use it, it is a compiler error, just like what happen when you call release in earlier SDK.
via:dispatch_release is no longer needed in iOS 6 with ARC
2014/06/16
[android][Java]addPreferencesFromResourceのdeprecatedについて
オライリージャパン
売り上げランキング: 309,945
初めてのandroid第三版を読んでいて、下のような記述があるのですが、どうやら、addPreferencesFromResourceメソッドはdeprecatedされているようだ。
import android.os.Bundle; import android.preference.PreferenceActivity; public class Prefs extends PreferenceActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } }public void addPreferencesFromResource (int preferencesResId)
を読むと確かにそうなっているんだけど、代替手段はなんなのか、一切書かれていない。
この不親切さは何なんだ。
iOSのリファレンスなんて、deprecatedの場合、代替手段があって、ものすごく便利なのだが。
この辺の違いが、developer想いかどうかわかるんだよなー。
2014/06/15
[android][Java]匿名クラス
オライリージャパン
売り上げランキング: 309,945
今、初めてのandroid第三版を読んでいるのですが、そこで、下記のような記述がありました。
new DialogInterface.OnClickListener() { }何これ??
おそらくイベントリスナーをその場で実行していると思うんだけど、それにしても、確信が得られない。
で、
Java用語集:匿名クラス[無名クラス]
を読むと、匿名クラスと言って、名前がないクラスみたいですね。
これ便利なので、使い倒せるようにしたいなー。
きっと、これ使い続けるとクロージャーとかの話になってくると思うんだけど。
2014/06/14
[Objective-C][Xcode]The bundle is invalid. New apps and updates submitted to the App Store must be built with public
iOSアプリをXcode 5.1を使ってapp storeに提出しようと思ったら、
The bundle is invalid. New apps and updates submitted to the App Store must be built with public |
なんじゃそりゃ??
The bundle is invalid. New apps and updates submitted to the App Store must be built with public
を読むと、どうやら、最新のXcodeとiOS SDKじゃーないと、上のようなエラーが発生するようだ。
確かに、Xcode5.1.1にしたら、アップロードできた。
2014/06/13
[iOS][html5]audioタグがpreloadできない件
html5から導入されたaudioタグですが、レンダリングするときに、preload属性をつけて前もってロードすることができます。
<audio src="hoge.m4a" preload></audio>これ、iOSのブラウザからアクセスすると、preloadされないようだ。
従って、自動再生したい場合は、下のように組み直す必要がある。In Safari on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it. This means the JavaScript play() and load() methods are also inactive until the user initiates playback, unless the play() or load() method is triggered by user action. In other words, a user-initiated Play button works, but an onLoad="play()" event does not.
via:User Control of Downloads Over Cellular Networks
This plays the movie: <input type="button" value="Play" onclick="document.myMovie.play()">
This does nothing on iOS: <body onload="document.myMovie.play()">
//play and pause it once document.addEventListener('touchstart', function () { document.getElementsByTagName('audio')[0].play(); document.getElementsByTagName('audio')[0].pause(); }); //now play whenever you want it to play確かに上で、再生された。
むちゃくちゃめんどくさいんだけどw
参考
iOS/Android で HTML5 の audio/video を任意のタイミングで再生する方法
iPhone HTML5 Audio tag not working
2014/06/12
[iOS][Facebook]graph api ver2を使った友達招待をする方法
「前回、graph api ver2のuser_friendsパラメータについて」で、user_friendsパーミッション経由で、ゲーム以外のアプリで友達招待をすることができなくなったと書いたが、それに100%変わるわけではないが、代々案を思いついたので、紹介。
ずばり、FacebookのMessengerアプリで招待する方法である。
以下は、そのコード
FBLinkShareParams *fBLinkShareParams = [[FBLinkShareParams alloc] initWithLink:link name:name caption:caption description:description picture:picture]; if([FBDialogs canPresentMessageDialogWithParams:fBLinkShareParams]){ [FBDialogs presentMessageDialogWithParams:fBLinkShareParams clientState:nil handler:^(FBAppCall *call,NSDictionary *results,NSError *error){ }]; //なんらかの理由で表示できない場合 }else{ UIAlert *alert; }上のコードを実行すれば、Facebook Messangerアプリを立ち上げて任意のリンク先を共有することができた。
ただ、デメリットは、Facebook Messangerアプリがないと招待できないことかな。
後、上のコードは、アクセストークン必要ないので、ログイン処理をはさまなくていいところがベスト。
2014/06/11
[本]なぜ、ベンチャーは失敗しやすいのか?
読了
インデックス・コミュニケーションズ
売り上げランキング: 295,727
最初、手に取ったとき、失敗したベンチャーを掲載して、それに対して、「なぜ失敗したのか?」を分析している本かと思ったら、どうやらそうではないようだ。第1章 Step 1・作成―公募したビジネスプランの添削
via:目次
足湯レストランバーwith Dr.fish AQOS
医療コンビニエンスストアMediCos
ペットレンタルサービスRENPET
第2章 Step 2・ブラッシュアップ―TNKが作成したビジネスプランの添削
ビジネスプラン作成
Carrots事業計画書(ビジネスプランVer.2)
添削
感想
コラム
まとめ
第3章 Step 3・事業化―真田自身が書いたビジネスプランの添削
背景(私が25歳で書いた事業計画書)
ダイヤルQネットワーク事業計画書
添削(歴史の採点)
まとめ
本書は、TNKが作成したビジネスプランに対してKlabの創業者である真田氏が突っ込みをするのだが、この指摘が大変鋭かったので面白かった。
ってか、客観的に見ると指摘できるんだけど、いざ、作り手にまわると見落としてしまったりするんだよねー。
また自身の作ったビジネスプランを見ることができ、かなりレアだった。
ダイヤルキューネットワークのビジネスモデルを見たら、なんだか、app storeやgoogle playを支配しているappleやgoogleみたいだなーと感じてしまい。
デバイスは変わっているがやっていることは変わらないなーっと思ってしまった。
確かに精密機械の性能はよくなっているが、やっていることは進化しているのか疑問に思ってしまった。
世の中便利になっているとは思うんだけどね。
そう思うと、昔ヒットしたビジネスモデルをコピーするのもありかなと思った。
ってか言葉にすれば簡単なのかもしれないが、できれば、苦労しないのかもなー。
1年間に365個、ビジネスアイデアを考えるという日課もいいなと思った、取り入れようかな。
2014/06/10
[iOS][Objective-C]Switch case is in protected scopeの解消方法
switch文でSwitch case is in protected scope的なエラーが発生してしまった。
これの解消方法を調べていたら、久しぶりに Switch case is in protected scope でハマるに解決策がありました。
switch(hoge){ case 0:{ } break; }と書く必要があるみたい。case文をつなげたい場合は、
switch(hoge){ case 0: case 1:{ } break; }とすればおk。
これで以後、困らないぞと。
2014/06/09
[Android][Java]setContentView()メソッド
onCreateメソッドの一発目にある
setContentView(R.layout.activity_fullscreen);って何だろうって調べてみたら、何パターンかあるみたいなんだけど、下のが一番、しっくりきた。
引数にint型のパラメータを設定しており、単純にActivityにViewを設定するということですね!!Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity.
via:public void setContentView (int layoutResID)
2014/06/08
[Facebook SDK][iOS][Objective-C]写真の共有
最新版のFacebook SDK for iOSを使って、今、導入方法の勉強をしているのだが、どうやら、認証を行わなくても、写真を共有する方法がありそうだ。
if([FBDialogs canPresentShareDialogWithPhotos]){ UIImage *image1; UIImage *image2; [FBDialogs presentShareDialogWithPhotos:@[image1,image2] handler:(^FBDialogAppCallCompletionHandler)(FBAppCall *call,NSDictionary *results,NSError *error){ }]; }たったのこれだけ実装できちゃうので、めちゃくちゃ便利。
2014/06/07
[android]style.xmlを使ったactivityの最適化
初めてのAndroid第三版を読むと下のような記述が随所にある。
<Button android:layout_width="match_parent" android:layout_height="match_parent android:id="@+id/hoge_button" android:text="@string/hoge" /> <Button android:layout_width="match_parent" android:layout_height="match_parent android:id="@+id/foo_button" android:text="@string/foo_label" /> <Button android:layout_width="match_parent" android:layout_height="match_parent android:id="@+id/bar_button" android:text="@string/bar_label" />上の書き方なんだけど、Styles and Themesを読むと、以下のようにすることができそうだ。
<-- activity_fullscreen.xml --> <Button style="@style/BaseViewTheme" android:id="@+id/hoge_button" android:text="@string/hoge" /> <Button style="@style/BaseViewTheme" android:id="@+id/foo_button" android:text="@string/foo_label" /> <Button style="@style/BaseViewTheme" android:id="@+id/bar_button" android:text="@string/bar_label" />
<-- res/values/styles.xml --> <style name="BaseViewTheme"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> </style>これ確かに動くといえば動くのだが、なぜ「android:」という文字が必要なのだろうか?
androidで使うことが前提なので、短絡的に考えて
<-- res/values/styles.xml --> <style name="BaseViewTheme"> <item name="layout_width">match_parent</item> <item name="layout_height">wrap_content</item> </style>でもいいと思うのだが。
オライリージャパン
売り上げランキング: 348,673
2014/06/06
[iOS][Facebook]graph api ver2のuser_friendsパラメータについて
今、Love NailのFacebook SDKを最新バージョンにしようとしているのだが、今回、graph apiがバージョン2になったことによって、user_friendsパラメータに大幅な変更が加えられたようだ。
バージョン1では、ログインユーザーの友達情報(名前やid)を取得することができたんだけど、Facebook Platform Upgrade Guideを読んでみるとuser_friendsパーミッションで取得した友達は、同じアプリを使っている人に限定されてしまうようだ。
で、これ以外にも、
taggable_friends
と
invitable_friends
というパーミッション及びgraph apiがあるのだが、invitable_friendsは、どうやら、登録されているアプリのジャンルがゲームじゃないといけないようだ。
ここは、別に審査制にして、他のジャンルのアプリもリクエスト飛ばせるようにしたほうがいいと思うんだけどな。
2014/06/05
[Java][android][eclipse]creating activityについて
昔、購入した「初めてのandroid第3版」を読みながら実際にプロジェクトを作成しようとしたところ、下のような3種類のactivityが選択できる画面が表示されました。
「BlankActivity」
「FullScreenActivity」
「MasterDetailFlow」
あれ、前にやってみたとき、こんな画面なかったと思うんだけど。
他にも「LoginActivity」、「SettingsActivity」があるようです。
2014/06/04
[本]iPhone Web Style
読了
iPhone Web Style
株式会社FEYNMAN 正 健太朗 川畑 佑介
元上司からいただいたのだが、コードは全体の数行しかないので、HTMLやCSSを少し触ったことがある人なら、すんなり読めるのではないだろうか?Chapter.1 iPhoneサイト制作の必須知識
via:目次
Chapter.2 iPhoneサイトにおけるCSS
Chapter.3 iPhoneサイトのデザインパターンを学ぶ
Chapter.4 iPhoneの特性を生かした機能を活用
Chapter.5 iPhoneサイトにおける動画再生
Chapter.6 ライブラリを利用して素早くiPhoneに最適化
Chapter.7 デバッグ方法
Appendix DashcodeでのWebサイト制作
iPhone用サイトの実例
Appleサイトでの登録作業
一気に読みきってしまった。