2014/06/30

[iOS][Objective-C]AviarySDKのコンパイル時にエラー

Other Linker Flagsに「-Objc -all_load」を設定したら、コンパイルエラーが発生した、どうやら、Admob SDKが起因していたのだが、根本的な解決方法はなさそうだったので、最新版のSDKに差し替えたら、エラーが取れた。

どうやら、リリースノートを読んでみると、バージョン6.5.0に、「Updated mediation warning messages for linker flag usage.」と書かれているので、この時に治ったのではないだろうかと推測できる。

とりあえず治って一件落着。

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をダウンロードするところまで書いたので、今日は、それを呼び出すところまで。

  1. ダウンロードしたAviarySDK-4.1.0フォルダの中にある「AviarySDK folder」をXcodeにコピーする。
  2. 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する。
  3. Build SettingsにあるOther Linker Flagsに「-Objc -all_load」を設定する
  4. AppDelegate.hファイルに
    #import <AviarySDK/AviarySDK.h>
    を記述する
  5. AppDelegate.mに
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [AFPhotoEditorController setAPIKey:kAviaryAPIKey secret:kAviarySecret];
    });
    
    を書く。kAviaryAPIKeyは、NSStringでKeyを、kAviarySecretは、NSStringでSecretを設定。
  6. 任意のクラスファイルで、AviarySDKをインポートして、
    AFPhotoEditorController *editorController = [[AFPhotoEditorController alloc] initWithImage:imageToEdit];
    [editorController setDelegate:self];
    [self presentViewController:editorController animated:YES completion:nil];
    
    で呼び出すことができる。
  7. 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を導入したかったので、その方法について調査してみた。

  1. Aviaryのサイトに行ってアカウントの登録をする。
  2. developers.aviary.com/appsにアクセスして、Add an appを押す
     photo aviary_sdk_01_zpsccae09c7.png
  3. レイヤーが表示されるので、アプリの名前などを入力して、最後に「Add」ボタンを押す。

     photo aviary_sdk_02_zps468630d7.png
  4. KeyとSecretが表示されればおk
     photo aviary_sdk_03_zpsdf2ad796.png
  5. 最後に、SDKのダウンロードをして、準備完了。

     photo aviary_sdk_04_zpsf35fa411.png
次回からは、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
となっていたが、iOS6からは、
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について

初めてのAndroid 第3版
初めてのAndroid 第3版
posted with amazlet at 14.06.16
Ed Burnette
オライリージャパン
売り上げランキング: 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]匿名クラス

初めてのAndroid 第3版
初めてのAndroid 第3版
posted with amazlet at 14.06.16
Ed Burnette
オライリージャパン
売り上げランキング: 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.

This plays the movie: <input type="button" value="Play" onclick="document.myMovie.play()">

This does nothing on iOS: <body onload="document.myMovie.play()">

via:User Control of Downloads Over Cellular Networks
従って、自動再生したい場合は、下のように組み直す必要がある。
//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

[本]なぜ、ベンチャーは失敗しやすいのか?

読了

なぜ、ベンチャーは失敗しやすいのか?
真田 哲弥 東京大学起業サークルTNK
インデックス・コミュニケーションズ
売り上げランキング: 295,727

第1章 Step 1・作成―公募したビジネスプランの添削
足湯レストランバーwith Dr.fish AQOS
医療コンビニエンスストアMediCos
ペットレンタルサービスRENPET

第2章 Step 2・ブラッシュアップ―TNKが作成したビジネスプランの添削
ビジネスプラン作成
Carrots事業計画書(ビジネスプランVer.2)
添削
感想
コラム
まとめ
第3章 Step 3・事業化―真田自身が書いたビジネスプランの添削
背景(私が25歳で書いた事業計画書)
ダイヤルQネットワーク事業計画書
添削(歴史の採点)
まとめ

via:目次
最初、手に取ったとき、失敗したベンチャーを掲載して、それに対して、「なぜ失敗したのか?」を分析している本かと思ったら、どうやらそうではないようだ。

本書は、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);
って何だろうって調べてみたら、何パターンかあるみたいなんだけど、下のが一番、しっくりきた。

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)
引数にint型のパラメータを設定しており、単純にActivityにViewを設定するということですね!!

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>
でもいいと思うのだが。
初めてのAndroid 第3版
初めてのAndroid 第3版
posted with amazlet at 14.06.09
Ed Burnette
オライリージャパン
売り上げランキング: 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」
 photo android_blank_activity_zpsda3b5bab.png
「FullScreenActivity」
 photo android_fullscreen_activity_zps7bbc47aa.png
「MasterDetailFlow」
 photo android_master_detail_activity_zps51b71d5f.png
あれ、前にやってみたとき、こんな画面なかったと思うんだけど。

他にも「LoginActivity」、「SettingsActivity」があるようです。

2014/06/04

[本]iPhone Web Style

読了
iPhone Web Style
iPhone Web Style
株式会社FEYNMAN 正 健太朗 川畑 佑介

Chapter.1 iPhoneサイト制作の必須知識
Chapter.2 iPhoneサイトにおけるCSS
Chapter.3 iPhoneサイトのデザインパターンを学ぶ
Chapter.4 iPhoneの特性を生かした機能を活用
Chapter.5 iPhoneサイトにおける動画再生
Chapter.6 ライブラリを利用して素早くiPhoneに最適化
Chapter.7 デバッグ方法
Appendix DashcodeでのWebサイト制作
iPhone用サイトの実例
Appleサイトでの登録作業

via:目次
元上司からいただいたのだが、コードは全体の数行しかないので、HTMLやCSSを少し触ったことがある人なら、すんなり読めるのではないだろうか?

一気に読みきってしまった。