【Android】AndroidStudioにFabricを入れりんぐ


Fabricとは

FabricはTwitter社が公開しているクラッシュレポートツールのCrashlyticsや広告管理ツールのMopub,無料でSMS認証が使えるDigitsなどのフレームワークの総称です。

とりあえずアカウント取得しよう

前のエントリーにも書きましたが、アカウントを取得してSDKをダウンロードするのに順番待ちする必要があります。まだまだ取得に時間を要するようです。
※筆者はサポートに何回かメールしたら順番が回ってきました。

SDKのインストール

AndroidStudioにFabricSDKを入れる場合、主に2つの方法があります。一つはAndroidStudioのプラグインを使う方法。もう一つはGradleなどのビルドツールを使う方法です。前者の方が圧倒的に簡単なのですが、最悪なことにプラグインがぶっ壊れてて機能しなかったので、今回は後者の方法でインストールしました。

基本的にはこちらのドキュメントや、こちらのウィザード通りにgradleの設定を進めていけばOKです。ただ非常に分かりにくいポイントがあったのでそこについて解説します。

APIKeyとBuildSecretどこやねん

APIKeyとBuildSecretをcrashlytics.propertiesに設定しやがれということなのですが、APIKeyの場所がわかりにくすぎてどハマりしました。APIKeyは

fabricのダッシュボード→Settings→ORGANIZATIONS→<自分のプロジェクト>→プロジェクト名の下にちっこく書いてあるAPIKeyとBuildSecret


sc

をクリックするとそれぞれ表示されます。小さすぎ&階層深すぎ;;

この辺りを設定してから、build.gradleのdependenciesに

    // Crashlytics Kit
    compile('com.crashlytics.sdk.android:crashlytics:2.0.1@aar') {
        transitive = true
    }

    // Twitter Kit
    compile('com.twitter.sdk.android:twitter:1.0.1@aar') {
        transitive = true
    }

    // MoPub Kit
    compile('com.mopub.sdk.android:mopub:3.2.2@aar') {
        transitive = true
    }

    // Digits Kit
    compile('com.digits.sdk.android:digits:1.0.0+@aar') {
        transitive = true;
    }

この辺を設定してあげればそれぞれのフレームワークが使えるようになると思います。

詳しいフレームワークについてのドキュメントはこちら

【iOS開発】Digitsで無料のSMS認証を試しんぐ


Digits

Digitsは無料でSMS認証ができるフレームワークで、Twitter社が公開したFabricというフレームワーク郡の一部です。今回はこれを試しんぐ。

FabricのSDKは現在(2014/11/14)、限られた人数にしか公開されておらず、使うためには順番待ちする必要があります・・・
(筆者は1週間位待ちましたが、順番が来なかったので問い合わせのメールを何通か送ったら順番が回ってきました。)

下準備

Fabricにログインし、FabricのMac用クライアントアプリケーションをインストールしましょう。クライアントを使ってXcodeプロジェクトに簡単に各フレームワークを組み込めるので大変便利です。

組み込みのボタンクラスを使う

#import <TwitterKit/TwitterKit.h>
.
.
.
    DGTAuthenticateButton *authenticateButton = [DGTAuthenticateButton buttonWithAuthenticationCompletion:^(DGTSession *session, NSError *error) {
        // 認証のコールバック。errorに何か入ってたり、sessionがnilだったらエラーハンドリングしましょう。
    }];
    authenticateButton.center = self.view.center;
    [self.view addSubview:authenticateButton];

最短で、この組み込みのボタンを設置するだけでSMS認証を実装できます。。。すばらしい。DGTSessionクラスから電話番号やユーザーID、トークンなどが取得できます。

コードから認証機能を呼び出す

#import <TwitterKit/TwitterKit.h>
.
.
.
//一番シンプルなパターン。ただ認証のUIを呼び出すだけ
    [[Digits sharedInstance] authenticateWithCompletion:^(DGTSession *session, NSError *error){
        //認証のコールバック
    }];
//認証のUIを呼び出しつつ、そのタイトルだけ変えたいとき
    [[Digits sharedInstance] authenticateWithTitle:<任意のタイトル> completion:^(DGTSession *session, NSError *error){
            //認証のコールバック
    }];
//認証のモーダルビューを表示するViewControllerを指定したいとき
    [[Digits sharedInstance] authenticateWithViewController:<任意のコントローラ> title:<任意のタイトル> completion:^(DGTSession *session, NSError *error){
        //認証のコールバック
    }];

※シミュレーターでは言語設定を日本語にしても、組み込みのUIが英語表示されるのですが、実機ではちゃんと日本語で表示されました。

参考

https://dev.twitter.com/twitter-kit/ios-reference

【iOS】ld: library not found for -lPods


CocoaPodsが上手くビルドされなくて困り果てました。。。

以下の2つの方法を試したらなんとかビルドできるようになったので覚書

  1. Podsプロジェクトのビルドセッティングの項目にあるBuild Active Archtecture OnlyをNOにする。
  2. XcodeのメニューからProduct>Scheme>Manage Schemesを選択し、showとsharedのチェックボックスを全部埋める。

そんでもってクリーンビルドして、オーガナイザからDerivedDataを削除し、さらに/Users/【ユーザー名】/Library/Developer/Xcode/DerivedDataのフォルダを削除すればなおよしかもしれません。

※pod installを行う度に、Build Active Archtecture Onlyの項目はYESになるので注意しましょう。

参考

http://qiita.com/u651601f/items/de2cc28ea8fe36f48a70
http://stackoverflow.com/questions/19419781/cocoapods-arm64-issue

【iOS】下位バージョンのOSの為のコードの書き分け方


新しいバージョンのOSにしかないメソッドを呼び出す時、下位バージョンのOSにも対応するためのコードを書く必要が出てきたりしますよね。

しかし、古いAPIを呼び出そうとすると”deprecated”のワーニングが出てきてウザかったりします。

そんな時は”__IPHONE_OS_VERSION_MIN_REQUIRED”マクロを使うと良いでしょう。

-(CGSize)sizeOfMultiLineLabel{
    
    NSAssert(self, @"UILabel was nil");
    
    //Label text
    NSString *aLabelTextString = [self text];
    
    //Label font
    UIFont *aLabelFont = [self font];
    
    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;
    
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
#else
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;
#endif
    
    return [self bounds].size;
}

sizeWithFontメソッドはiOS7以上のAPIだとdeprecatedなのですが、見事にワーニングが出ませんね。

[iOS]アプリのアップデートをハンドリングする



アップデート時にplistのbundle versionを書き換えておけば、アプリケーションのバックグラウンド復帰時、もしくは起動時に自分のbundle versionを確認して、アップデートされているかどうか判断することができます。また、アプリケーションがアップデートされてもメモリはアプリケーションがアップロードされる前の状態を保っている(解放されない)ようです。

ちなみにitunesのAPIから自分のアプリの最新版の情報を取得して、現在のバージョンが最新版かどうか確認することができるようです。

参考:http://qiita.com/euapplication/items/8de2e49ee1d6530f16e7