ラベル iPhone App の投稿を表示しています。 すべての投稿を表示
ラベル iPhone App の投稿を表示しています。 すべての投稿を表示

2017年2月14日火曜日

CocoaPods で Quick のインストールが上手く出来ない

テスト書いてますか?
久々に Xcode を使ってみようと思って、その際にテスティングフレームワークの選択で Quick を使おうと思いました。

Quick(github)
https://github.com/Quick/Quick

さて、インストールと思って、どうやって導入するのか確認したところ、ローカライズされたページが用意されていました。

https://github.com/Quick/Quick/blob/master/Documentation/ja/InstallingQuick.md

インストールの手段としては、Git Submodules を使う方法、CocoaPods を使う方法、Carthage を使う方法と 3 パターン用意されていました。

ここでは、使い慣れている(?) CocoaPods を使ってインストールしようと思ったので、該当ページを確認しながら導入をしてみました。

ちなみに、環境は
  • Xcode 8.2.1
  • Swift 3.0.2
  • CocoaPods 1.2.0
です。

早速、書いてある通り、Podfile を作成しその中に設定を記述します。
# Podfile

use_frameworks!

def testing_pods
    pod 'Quick', '~> 0.9.0'
    pod 'Nimble', '3.0.0'
end

target 'MyTests' do
    testing_pods
end

target 'MyUITests' do
    testing_pods
end

保存して終了後、インストールコマンドを走らせ無事インストールが完了し、単純なテストを書いてみようとした所、import Quick の部分で「No such modeule ‘Quick’」のエラーが発生しました。

こういった部分が面倒だなと思い、import 文を外してビルドすると、なんとそこでもエラーが。。。

インストールに失敗したのかと思い、再度ページを見ながら慎重に行っても状況変わらず。
ビルドエラーの内容を見ても、Quick の部分でエラーになっていることは分かるのですが、ライブラリの中を変更すると CocoaPods の良い所がなくなるので、その他の方法を当たるようにしました。

探してみた所、どうも Podfile の記述方法を変えれば良いことがわかりました。
で、変更した内容が以下の通り
# Podfile

use_frameworks!

def testing_pods
  # pod 'Quick', '~> 0.8.0'
  # pod 'Nimble', '3.0.0'
  pod 'Quick', :git => 'https://github.com/Quick/Quick.git'
  pod 'Nimble', :git => 'https://github.com/Quick/Nimble.git'
end

target 'QuickSampleTests' do
  inherit! :search_paths
  testing_pods
end

target 'QuickSampleUITests' do
  inherit! :search_paths
  testing_pods
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0' # or '3.0'
    end
  end
end
※ QuickSample というプロジェクト名にしています。

どうやら、pod ファイルを github から取得する必要があり、更に build_settings の部分に [‘SWIFT_VERSION’] = ‘3.0’ をセットするようにしてインストールすれば、import の部分でもエラーにならず、またテストも無事動くようになりました。

なんだろう?inherit の部分や、post_install のイテレータ部分とかは、公式のインストール方法には書かれていない内容だったので、若干戸惑いましたが、なんとか出来て良かったです。
Written with StackEdit.

2016年10月2日日曜日

iOS10 で出来る iPhone カメラシャッター音の消し方

注意!: 新しい iOS では以下の内容でシャッター音を消すことができなくなりました。

iOS 10 の設定でカメラのシャッター音を消すことが出来る方法があるので紹介します。


概要

通常、カメラで写真を取る際にシャッター音がなります。
これまでは音量を最大限まで下げても、シャッター音を消すことは出来ませんでした。
これまでは、音量を最低にして、iPhone 本体のスピーカーを指で塞いで音をころすか、無音シャッターカメラアプリを使用することで対応をしていたかと思います。
そんな中、今回の iOS10 の設定をすることにより、シャッター音を消す方法があるそうなので紹介します。
ちなみに、確認した条件は
  • iPhone 6s
  • iOS 10.0.2
を使用しました。

設定方法

まず、iPhone の設定アプリを立ち上げます。
次に、「一般」をタップします。
次に、「アクセシビリティ」をタップします。
次に、操作の項目の「AssistiveTouch」をタップします。
次に、「最上位メニューをカスタマイズ…」をタップします。
次に、「-」をタップしてアイコンを「カスタム」だけにします。
次に、「カスタム」をタップします。
次に、リストから「消音」を選択し、「完了」を押します。
次に、画面左上から「戻る」を押して戻り、「AssistiveTouch」を ON にします。
これで、ホームボタンの形をしたアイコンが表示されます。
最後に、表示されたアイコンをタップすることで、「消音」が表示されます。
この状態で、カメラを起動して写真をとってもシャッター音がならなくなります。
また、スクリーンショットを取るとき(ホームボタン+電源ボタン同時押し)も同様に音が鳴らなくなります。
おまけとして、アクセシビリティの画面の一番下にあるショートカットを「AssistiveTouch」にしておくことで、先程表示されたホームボタンアイコンの表示/非表示をホームボタントリプルクリックで行うことができるようになります。

使ってみた感想

この設定で気づいたのですが、消音にすれば良いのであればと、音量ボタンを下げていっても消音の設定にならないのにはびっくりしました。意地でも最低音量を保持するようになってるんですね。
また、マナースイッチを押してもサイレントモードになるだけでこれまた消音にならないのも、気が付きませんでした。
前置きが長くなりましたが、実際使ってみた感想としてはいちいち、消音をするのは面倒と思いながらも、シャッター音がならないと言う状態は良いかと思います。
シャッター音があって実際困るのは、ご飯の写真を取りたい場合などでしょうか。
まわりが静かに食事をしているときにはシャッター音はやや不快に感じる方が多いかと思います。
こういったときには、周りの方にも迷惑かけずに写真を取れるので良かったです。
(一昔前なら、食事前や食事中に写真を撮る行為なんて非難物でしたが。。。)
ただ、よく言われる盗撮(性的な物や、撮影禁止の場所での使用)を考えると、音は出たほうが良いかなとも思います。
最終的には、使用者のモラルの問題になるので、やや難しいかと思います。
個人的には、音はなっても良いけど、もう少し小さい音量にして欲しいと思います。

まとめ

犯罪に使用されるケースを考慮してのシャッター音かと思いますが、標準音量が大きいのは、場所によってはちょっと困るときもあります。
そんなときに、少々面倒ではありますが、こちらの設定をしてみてはいかがでしょうか。
気になる点としては、この設定が今後も出来るのかという点。
バグなのか分かりませんが(消音専用のダイアログが出るのでバグではない気がしますが)、この消音設定がなくならないことを期待します。
Written with StackEdit.

2016年3月19日土曜日

入力れた文字をかな変換する(Swift)

テキストボックスに入力された文字をかな変換する機能を実装必要が出てきました。
内容としては、iOS 標準アプリの電話帳とかにある、姓名を漢字で入力したら、よみがなが自動的に入るあの機能です。

ものすごく単純に考えると、入力された値を保持して「かな」に変換してやれば良いかと思ったのですが、部分削除等の操作を考えると、頭が混んがらかってきたので、多分違う方法があるだろうと思って調べてみました。

すると、正にやりたかったことが実装されているページがありましたので参考にさせて頂きました。

[OSX][iOS]読み仮名を得る(Cocoa練習帳)
http://ameblo.jp/bitz/entry-11859904155.html

Objectiive-C で書かれたコードですが、Swift に置き換えても問題なく動作しました。
素晴らしい。

実装内容としては、入力された値をトークナイザーを使用して解析し、ローマー字に変換後、かな変換すると言った物です。
Swift 変換のコードを下に載せておきます。

func kanaHenkan(text: String) -> String {
    let inputText: NSString = text
    let outputText = NSMutableString()

    let range: CFRange = CFRangeMake(0, inputText.length)
    let locale: CFLocaleRef = CFLocaleCopyCurrent()
    let tokenizer: CFStringTokenizerRef
                   = CFStringTokenizerCreate(kCFAllocatorDefault,
                                        inputText as CFStringRef,
                                                           range,
                              kCFStringTokenizerUnitWordBoundary,
                                                           locale)

    var tokenType: CFStringTokenizerTokenType
                   = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)

    while (tokenType != .None) {
        let latin: CFTypeRef
                   = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer,
                                                                kCFStringTokenizerAttributeLatinTranscription)
        let romanAlphabet: NSString = latin as! NSString
        let furigana = romanAlphabet.mutableCopy()
        CFStringTransform(furigana as! CFMutableString, nil, kCFStringTransformLatinHiragana, false)

        outputText.appendString(furigana as! String)

        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
    }

    return outputText as String
}

メソッド化して、与えた文字列をかな文字で取得するようにしています。
うまく置き換えができるか心配でしたがなんとかできてよかったです。

Written with StackEdit.

2015年8月22日土曜日

iPhone に SVG を表示するには

iOS で、SVG は簡単に表示できない。
この場合、表示用のライブラリの力を借りることになる。

調べた結果、UIImage-SVG と、SVGKit というものが見つかった。
いずれも、CocoaPod  に対応している。

UIImage-SVG
https://github.com/Label305/UIImage-SVG

SVGKit
https://github.com/SVGKit/SVGKit

CocoaPod なので、インストールは簡単だったのだが、UIImage-SVG は表示が全てベタ塗りとなり、文字の造形まで塗りつぶされてしまった。
対処方法がわからなかったので、今回は見送ることとした。

次に、SVGKit だが、このライブラリをインストールする際に関連ファイルとして CocoaLumberjack がインストールされる。
何も考えずに pod 'SVGKit' だけの指定をすると、両ファイルの最新版がインストールされるのだが、どうやらファイル通しの相性が良くないらしく、ビルドエラーを起こす。

こういった場合(CocoaPod)、何処を変更すればよいかの検討すら立たなくなる。
なにせ自動で色々やってくれるので、インストール後に直接設定を弄るのも抵抗がある。
なので、ビルドエラーのメッセージを見て調査することとした。

今回のエラーメッセージでキーとなっていたのは、DDLogCWarn だったので、これを元に検索すると以下のページがトップに出てきた。

DDLogCWarn is not a thing as far as I can tell #196
https://github.com/SVGKit/SVGKit/issues/196

奇しくも SVGKit のページだった。
内容を見ていくと、上にも書いた CocoaLumberjack を別途バージョン指定してインストールするような記述があった。
書かれてあるとおり、CocoaLumberjack はバージョンを指定して、SVGKit は指定なしにしてインストールした所、ビルドエラーも起こらず、ファイルもうまく表示できるようになった。

UIImage* newImage = [SVGKImage imageNamed:@"mySVGfile"].UIImage;
 一応めでたしめでたしといったところだろうか。

2015年8月16日日曜日

iTunes Connect でアプリのバージョンを間違って付けてしまった時の対応について

iOS の開発において、ちょっとした難関である iTunes Connect の設定(自分だけか?)。
今回、気になっていた部分について、Apple の Developer サポートに電話で問い合わせをしてみたので、そこでの回答を覚えとして残しておく事にする。

本来質問は、iTunes Connect にある Contact us のフォームから質問をするのだが、今ひとつな回答なため直接聞いたほうが早いと判断し、電話をしてみた。
(一応 Contact us には、機械翻訳で英語にして、スクリーンショットまでつけて、質問を投げています。)

ちなみに、電話番号は

Worldwide Telephone Support
https://developer.apple.com/jp/contact/phone.php

から調べることができる。
日本の場合は、月曜から金曜の 09:00 - 17:00 となっている。
平日電話できる状況ならいいけど、趣味でプログラムやってる人には厳しい時間設定な気がする。。。

話がそれたが、本題に戻そう。
今回質問したい内容と回答を先に書こう

 

質問

Q1. 新しいバージョンを間違って付けた場合の修正方法はどうするのか?

Q2. サンプルで作成したアプリはどうやって削除するのか?

 

回答

A1. バージョンを間違った場合は、間違ったバージョンで審査を通して再度正式バージョンを申請してください。

A2. 一旦審査を通して、リジェクト状態にすれば削除できます。

 

感想

まず、状況を説明すると、特に特殊な事はしてないつもりだが、Q1 については、アプリで新しいバージョンを作成する場合には iTunes Connect で新しいバージョンの指定を行うことになるのだが、この時に決めたバージョンを間違って確定してしまったという状況である。
(本当の状況は、当初つけていたバージョンを開発過程ですっ飛ばして次のバージョン番号のリリースを行いたいと言う話。)
Q2 については、そのままで、実験用に作成したアプリ(アプリ内課金のサンプルは iTunes Connect に登録しないとできない)を削除したい状況である。

まず、Q1 については、正確にはマニュアルにないので、よく分からないと言われたと言ったほうが良い。
話の流れ上、自分があえて運用でカバーするならこの方法だろうと思い質問したら、それでも良いけど的な回答をしたので、これを回答にした。
まあ、同じバイナリで審査が通るかどうか不明であるが、レビューチームへのメッセージに一筆添えれば良いのか(?)と思ってよしとした。

次、Q2 についてはマニュアルには、リジェクト状態にすれば、削除が行えるはずとの回答を頂いた(マニュアルに書いてある!)。
開発者自らがリジェクトした状態でも削除できるとのことだが、実際の所削除できない。。。

削除については、マニュアルを読む限り、iTunes Connect で対象アプリのページに移動して、価格のページで販売リージョンを全てなくしたら、その他の項目にアプリの削除が出るで、そこから削除が行えることは知っているが。。。やはり削除が行えない。

Game Center と紐付いていたらダメですよとも言われたが、Game Center の機能は使用してないというか、Game Center は、App IDs で無効化出来ないのだが、、、

 

敗北感

いずれにせよ、電話サポートの意味がなく、ただただ時間が過ぎていくので、この点は我慢ということで、電話を置かしてもらうこととした。
最後に、サポートの方から、どうしても分からなければ、マニュアルを読むか、Contact us に再度質問または、フォーラムを利用してくださいとのお言葉を頂いた。。。

それが、ダメだから電話したんじゃん!!(心の叫び)

高い年間費用は一体なんなんだと少しイラッと来つつもしょうがないのかと諦めたのだった。

これらの対処法わかる方がいたら教えて下さい。
Written with StackEdit.

2015年7月25日土曜日

iPhone 実機を使用したネットワーク状態操作

iPhone のアプリで通信系の処理を実装していた時に、テストで通信状況が悪い状態を発生させ動きを見たい状況になった。

机上でデバックしているとはいえ、不安が拭い切れない。
スタブサーバーでもテスト用に作れればよかったのだろうが、いかんせん時間がない。

通信エラーを起こすには。。。と思っていたら、iPhone 自体に通信状況を操作できる項目があることを知った。

iPhone の設定アプリ内に、ディベロッパの項目があり、その中にネットワークの状況を選択できる項目がある。

enter image description here

enter image description here

enter image description here

これで、完全に通信失敗をする状況や、とっても不安定な状況を作り出すことができるようになる。

注意としては、機能を On にすると iPhone 自体の状況が変わるので 100% Loss にして、そのまま Off にせず、このことを忘れていると普通に使いたいときにパニックなるので使ったあとは必ず Off にすること。

シミュレータにはない機能だが、通信が不安定な状況でのアプリの動作確認を行い方は是非。

Written with StackEdit.

2015年6月3日水曜日

UIAlertView + UITextField の組み合わせでアラート表示後にキーボードが出てしまう

例えば、UITextField にフォーカスを合わせて、値を入力し OK ボタンなどで各処理後にアラートを表示すると、アラートが表示後にキーボードが出てしまう状態に遭遇してしまった。

この表示されたキーボードを下げることが出来るなら良いが、AlertView の OK ボタンはキーボードに隠れてしまい、キーボードの Done や 完了ボタンを押しても下がらない。。。

ビューの endEditing:YES にしても変わらず。
こうなってくると大体どの View のキーボードなのかも分からない。。。

キーボードの表示の通知を取得して、View に存在するもののフォーカスを外すなどしても変わらず。

調べた所どうやらこれは、
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
メソッド内で、続けてアラートビューを出そうとしていることが原因のようだ。

続けてアラートビューを出したい場合は、
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
に記述しないと行けないとのこと。


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        ...
        case 1:     // OK
            // ここはだめ
            [self showAlert:@"OKしました。"];
            break;

        default:
            break;
    }
}

- (void)showAlert:(NSString *)message
{
    dispatch_async(dispatch_get_main_queue(), ^{
        // メインスレッドに戻して呼び出す。
        UIAlertView *alert
        = [[UIAlertView alloc] initWithTitle:@"メッセージ"
                                     message:message
                                    delegate:self
                           cancelButtonTitle:@"OK"
                           otherButtonTitles:nil, nil];
        [alert show];
    });

}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:     // キャンセル
            return;
            break;

        case 1:     // OK ボタン
            // ここで呼ばないと行けない。
            [self showAlert:@"OKしました。"];
            break;
        default:
            break;
    }
}

確かに、キーボードが隠れてしまう状況は発生しなくなった。

Written with StackEdit.

2015年5月30日土曜日

layoutSubviews で座標変更した UIView がスクロールすると元の座標に戻る

タイトルの通りになりますが、ScrollView 上に配置した UIView(ボタンとかラベルとか)を、layoutSubviews 内で座標を変更後、表示をすると座標が変更されて正常にみえますが、スクロールをすると、変更前の座標に戻ってしまいます。

この現象は、AutoLayout を使用している場合に発生します。
ViewController 毎に AutoLayout の設定を解除できるようなプロパティを設定したのですが意味がなかった(!?)。

ここで、AutoLayout と書いていますが、これに気づくまでに相当悩みました。

処理の流れをみると、座標の変更を行う layoutSubviews は、表示の時の 1 度だけ通過して、スクロールの時には処理を通らない。。。
安易な回避策として、同じ UIView を 2 つ用意し、座標前と変更後用の UIView の hidden を切り替えようかと考えましたが、内部の処理が冗長になるのでできれば同じものを使いまわしたいと思っていました。

UIScrollview, move, position... などと少ないボキャブラリーの中からキーワードを試行錯誤して検索しました見つかりませんでした。

今一度、起こっている現象と状況を辿って行くことにしました。

通常、AutoLayout を使用する場合、座標の変更を行わないのであれば制約を付けないか、位置とサイズの制約を使用するようにします。
と言うことは、座標をずらす場合には、layoutSubviews で、ずらした部分の制約をつけていく必要があるのでは?と思ったわけです。

つまり、スクロールした時点で AutoLayout が動き制約を実施する行うが、座標変更後の制約の設定がないため元の座標のまま放置されると言った動きになっているのではないかと。

どうやら、これが当たりのようでした。
たぶん、storyboard で画面レイアウト等をされない方は、すぐに現象の理解ができたのかもしれません。。。

同じ現象で悩んでいる人(が居るのか?)の為に、今回とった方法を記載します。

1. storyboard で、変更前の座標に配置し制約を付ける。


2. 制約をアウトレットで接続する。


3. layoutSubViews で、条件を判定して制約を付け直す。
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    self._button.translatesAutoresizingMaskIntoConstraints = NO;

    // 制約を解除
    [self._scrollView removeConstraints:@[self.widthConstraint]];

    // 条件によって X 座標を変更する制約を付ける
    if (self.isFlag) {
        self.widthConstraint
        = [NSLayoutConstraint constraintWithItem:self._button
                                       attribute:NSLayoutAttributeLeft
                                       relatedBy:NSLayoutRelationEqual
                                          toItem:self._scrollView
                                       attribute:NSLayoutAttributeLeft
                                      multiplier:1
                                        constant:20];
        
    } else {
        self.widthConstraint
        = [NSLayoutConstraint constraintWithItem:self._button
                                       attribute:NSLayoutAttributeLeft
                                       relatedBy:NSLayoutRelationEqual
                                          toItem:self._scrollView
                                       attribute:NSLayoutAttributeLeft
                                      multiplier:1
                                        constant:120];
        
    }
    // 制約を再付与
    [self._scrollView addConstraints:@[self.widthConstraint]];
}
 
ポイントは、制約を接続してコード上で操作できるようにしてから、制約を付け直すという部分になります。
手順で書くとあっという間なのに相当な労力が、、、こんな現象で困っている人がいるのかわかりませんが参考になれば。

2015年5月28日木曜日

続、Facebook SDK for iOS 4.0 に悩まされる

先日、表題の記事を書いた所、コメントを頂きましたのでそちらの確認をさせて頂くのと、Graph API を使用する方法を試してみましたので報告を。。。

まず、コメントで頂いた方法を試させていただきました。
(kota n さん。ありがとうございます。)
さっそく必殺のコピペをして動作を見てみるとログに以下のメッセージが。。。
FBSDKLog: Warning: [FBSDKAccessToken currentAccessToken] is missing publish_actions permissions
どうやら publish_actions という権限が必要なようです。
この権現の扱いというのがややこしく、理解するのに暫く時間がかかりました。

しかも、この publish_actions の権限は、Facebook に審査を通していないと、使用時に警告文が表示されるようです。
(あくまで、警告文なので製品アプリだとまずいですが、お試しなので強行突破すれば確認を取ることは出来ます。 テストユーザ(警告が出ない?)ってものあるようですが調査不足。)

この権限の付与は、Graph API を使用する際にも設定の必要がありますので、ひとまず Graph API を使用した方法を載せます。

権限を付与するためには、まずログインの動作が必要となります。
ログインは以下コードでログイン動作を行います。
    - (void)login
    {
        if ([FBSDKAccessToken currentAccessToken]) {
            // accessToken が取れるならログイン処理は完了している
            reutrn;
        }

        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                // Process error
                NSLog(@"Error");
            } else if (result.isCancelled) {
                // Handle cancellations
                NSLog(@"Cancel");
            } else {
                // If you ask for multiple permissions at once, you
                // should check if specific permissions missing
                if ([result.grantedPermissions containsObject:@"email"]) {
                    // Do work
                    NSLog(@"Login OK");
                }
            }
        }];

    }
このコードを走らせると、Safari が起動してログイン画面が起動し、その後アプリのアクセス許可を聞いています。
OK または、キャンセルを押すと、アプリに戻ります。

OK を押した場合はログインと、アプリの使用許可が出来た形となります。
次に、publish_actions の権限を付与するコードを使用します。
ログインが出来た状態だと、権限の付与ができるようになっています。
    - (void)addPermission
    {
        if ([FBSDKAccessToken currentAccessToken]) {
            // publish_actions の権限確認・付与
            if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
                // TODO: publish content.
            } else {
                FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
                [loginManager logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                    //TODO: process error or result.
                }];
            }
        }
    }
またここでも、権限の付与確認のために Safari が起動します。
ここで、審査を通していないと、赤文字で警告文が表示される様になっています。
日和らずテストなので OK しましょう。

ここまで来ると、あとはメッセージを投げるだけ!以下の内容の処理を使用します。
    - (void)sendMessage:(NSString *)message
    {
        if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
            [[[FBSDKGraphRequest alloc]
              initWithGraphPath:@"me/feed"
              parameters: @{ @"message" : @"hello world"}
              HTTPMethod:@"POST"]
             startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                 if (!error) {
                     NSLog(@"Post id:%@", result[@"id"]);
                 }
             }];
        }
    }
これで、完了と。。。
非常に端折って書いているので、正確性は怪しいですが投稿はできるはず。。。

コメントで頂いた内容についても、public_actions の権限を設定したあとからだと、うまくメッセージが送ることを確認しました。
ただ、同じメッセージが2回投稿される現象がでている(!?)ので調査が必要な状態。

気になる点は、権限を外したりログアウトはどうやるのかですが調べた所、権限の削除については、コードから可能。
ログアウトの処理は、Safari で Facebook を開くとログイン状態になっているので、そこからログアウトすれば良いみたい(これもコードで出来るのか?)。
登録したアプリ自体も Facebook の自分のページの設定の項目から削除することができます。

なんか投稿までの流れはコードでできたけど、解除や削除は手動になるっていうのが、今ひとつな感じです。
ともあれ、Graph API を使用しての投稿ができたので、ここから掘り下げていけば良いかなと思う次第です。

駆け足で書いたので、間違っているかもしれません。
しかし、なぜメッセージ等の投稿が Graph なんだろうか?

2015年5月17日日曜日

Facebook SDK for iOS 4.0 に悩まされる

今回は、Facebook SDK for iOS を使用して、タイムラインにメッセージを投稿する方法を調べてみました。

使う方法を書く前に、苛立ちを少々書かせてください。

まず、バージョンがややこしい。
Developers のページをみると、現在?の SDK のバージョンが v3.18 と書かれています。しかし、更新履歴のページに行くと、v3.23.2 となっています。
さらに、もう一つ Changelog があり、そちらを見ると、v4.0.1 がでてきます。
また、github にもリポジトリがあり、こちらは 4.0.1 が最新となっています。

Developers の Facebook SDK for iOS ページ
https://developers.facebook.com/docs/ios?locale=ja_JP

Developers の Facebook SDK for iOS の更新履歴のページ
https://developers.facebook.com/docs/ios/change-log-3.x/

Developers の Facebook SDK for iOS のもう一つの更新履歴のページ
https://developers.facebook.com/docs/ios/change-log-4.x

github の Facebook SDK for iOS ページ
https://github.com/facebook/facebook-ios-sdk

次に、バージョン 3 系と、4 系ではメソッドが変わっている。。。
Web で使い方の参考を拝見させて頂くにしても、みなさん 3 系の方法で書いているために、最新の 4 系では、過去の資産が活かせないということになる。
そして、4 系のサンプルはあまりない。

まあ、要するにハッキリ言うと Facebook SDK って、クソ難し過ぎませんか!!ってことです。

と、毒ついたところで、タイムラインへの投稿までの手順を書いておきます。

断りとしては、この方法では一旦 Safari が起動してログイン認証した後、メッセージを送るときも Safari が起動してメッセージを投稿するという、 UI としていかがなものか?という内容になることをご了承願います。

1. Facebook SDK for iOS を導入する

まずは、Facebook SDK を入手します。
入手場所は、Developer のページまたは、github からの入手でも構いませんが、CocoaPods を使用するのが簡単だと思います。

まずは、Xcode で確認用のプロジェクトを作成。
つぎに、プロジェクトのフォルダに Podfile を作成して、以下を記述。

    pod 'Facebook-iOS-SDK'

ターミナルで、Podfile の場所まで移動して、pod install で導入を行います。
導入のバージョンを指定していないので最新の 4.0.1 が導入されます。

次に、Developer のページで動作するアプリを登録します。
アプリを登録することによって、アプリの ID を取得することが出来ます。
このアプリの ID は、iPhone アプリでの設定に必要です。

次に、Xcode で Supporting Files フォルダにある xxx.plist に必要項目を追加します。
- FacebookAppID : Facebook アプリのID
- FacebookDisplayName : Facebook アプリ名
- URL types > item 0 > URLSchemes > item0 : fb + Facebook アプリID


2. 投稿用のボタンを作成してコードを割り付ける

ここまで来ると、もう 8 割がた終わっています。
Developer のチュートリアルのページだと、導入後は AppDelegate.m へのメソッドの追記などが書かれていますが、メッセージをポストするだけだと特に記述がいらない?みたいです。
細かな制御を行う場合には、記述が必要になるので、必要になったら追って確認するようにします。

さて、実際の方法ですが、まずは、storyboard にボタンを配置して、action を追加します。そして、追加したアクションに以下の記述をします。
FBSDKShareDialog の withContent に何か値を渡さないと実行時エラーになるので FBSDKShareLinkConten のインスタンスを渡しています。正直この方法もいかがなものか?と思っています。

        FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
        [FBSDKShareDialog showFromViewController:self
                                     withContent:content
                                        delegate:nil];    

3. 動作の確認

後は、動作の確認です。
シミュレータでもよいので、起動してボタンを押すと Safari が起動して Facebook のログイン画面が起動します。
ログインが成功すると、次にメッセージを入力する画面が起動します。
ここで、文字を入力して Share ボタンを押すと、自分のタイムラインに投稿が行われています。
そして、アプリの画面に自動的に戻ります。


4. 一応のログアウト

ログアウトは、今回の場合ではアプリ側でログアウトを行う方法はなく、アプリ終了や、Home ボタンを押してバックグラウンドに回した後に、 Safari を起動して Facebook へアクセスし、ログアウトを行う手順をとります。


ね、イケてないでしょ

すみません。
ハッキリ言ってこの方法では、メッセージを送るたびに Safari が起動して投稿したとアプリに戻るという、いったりきたりの面倒くさいアプリとなってしまいます。いちいち切り替えを行わなくて良い方法を探してみたいと思いますが、なんせわかりにくい。。。

たかが、ログインして、メッセージを投稿して、たまにログアウトしたいだけなのに、独自の方法を使おうとすると、なんでこうも難しいのか。

それとも、自分がポイントを押さえていないだけなのだろうか?
追記:
Graph API ってのを使えば行けるのか(?)、あとで調べてみる。

Written with StackEdit.

2015年2月14日土曜日

フェードアウトした(している)ボタンがクリック出来ない

iPhone アプリで、ボタンに画像を指定した物を配置し、フェードイン・フェードアウトのアニメーションをするものを作成してみた。

実装をして、確認を取るが、自分の悪い癖で、表示の確認をした時点で満足し出来たものとしていた。
が、しかし、あることを思いつく。

「これ、消えた時にクリックできるのかしら?」

こんな疑問点が出てきたが、なんとなく予想が付いたので、腫れ物を触るかの気持ちでタップした所、案の定タップイベントが動かない。。。

どうやら、hidden プロパティを YES、または、alpha を 0 にすると、タップは無効になるようだ。
また、フェードアウトの時は、消えかかっている状態でもタップは無効となる。

地味に、alpha を 0.05 にすると、タップは出来るが、正に亡霊の如く消えずに残っているので見た目が悪い。

ボタンのラベル文字をアニメーションさせるのであれば、最悪ボタン自体ではなく、中のラベルの部分をフェードイン・アウトさせてやれば、ラベルが消えてもタップは可能となる。
しかし、今回は画像で、ボタンの位置をコードで変更している様にしていたのだが、画像をフェードイン・アウトさせると何故かボタン位置が変更前に戻るアニメ付きでフェードイン・アウトするという動きとなった。

数パターンあたってみたが、ボタン単発で表示が消えた時にタップの動作を取得する事は出来なかった。

結論から言うと、今回取った手段としては、フェードイン・アウトさせるオブジェクトの上に透明のボタンを配置して、処理を分離させる様にし実現を行った。

コードは以下のとおり

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self fadeOut];
}


- (IBAction)buttonPush:(id)sender
{
    NSLog(@"Push The Button");
}

- (void)fadeOut
{
    [UIView beginAnimations:@"hideOverlayButtonFadeOut" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeIn)];
    [self._button setAlpha:0.0];
    [UIView commitAnimations];
}

- (void)fadeIn
{
    [UIView beginAnimations:@"hideOverlayButtonFadeIn" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeOut)];
    [self._button setAlpha:1.0];
    [UIView commitAnimations];
} 

ボタンを2つ用意して、ひとつはフェードイン・アウトを行うためのボタン(別段ボタンでなくても良い)を用意して、その上に実際にイベントを取る透明のボタンを配置する。
一応出来たが、一つのボタンの為にもう一つボタンを使用するのが、なんだか面倒。

何かいい方法あるんじゃないだろうか。。。

Written with StackEdit.

2014年7月22日火曜日

Apple から「Updated Requirements for CloudKit​」というメールが来た

ここ最近全く、Apple 系の仕事?開発をしていません。
値の張る Developer Program 代が。。。

さて、タイトルのメールがAppleより来ましたので、毎度の翻訳をしてみます。

本文は以下の通り

Updated Requirements for CloudKit

Dear Developer,

Starting July 22, 2014, CloudKit will require iOS 8 beta 4 or OS X Yosemite Developer Preview 4.
To ensure uninterrupted development of your CloudKit enabled apps, download and upgrade to these versions today.

We will perform a server-side data wipe on all CloudKit public databases on July 22.
If you are using iCloud containers with public databases,
consider creating a copy of your data so that you can re-upload once the data wipe is complete.
iCloud Drive, iCloud Photo Library, and Mail Drop will not be impacted by the targeted data wipe.

If you have any questions, visit the Apple Developer Forums.

Best regards,
Apple Developer Technical Support
 
で、訳してみた結果が以下の通り

開発者の皆様へ

2014 年 7 月 22 日から開始される CloudKit は、iOS8 beta 4 か OS X Yosemite Developer Preview 4 が必要となります。
CloudKit を使用した開発を行いたいのであれば、本日のアップグレードバージョンをダウンロードし使用してください。

CloudKit のパブリックデータベースは、22 日に強制的にサーバーサイドでデータの削除を行います。
もし、パブリックデータベースで iCloud コンテナを使用している場合は、データ削除後に再アップロードを行ってください。
iCloud ドライブ、 iCloud フォト及び Mail Drop は削除対象外です。

不明な点がありましたら、Apple Developer フォーラムへお越しください。

敬具

アップルディベロッパーテクニカルサポートより


ハッキリ言って分からない事だらけです。
CloudKit と言うのは、先日発表があった iCloud を使うためのフレームワークとのことで、
mBaaS(Backend As  A Service)らしいです。

読みやすい記事を探しましたので、そちらを見てください。。。

CloudKit—iOS 8/OS X Yosemiteで変わる「文書」(By ASCII)
http://ascii.jp/elem/000/000/911/911246/

先日の Swift といい、全くついて行けていない。。。

2014年6月22日日曜日

Swift で Hello World まで

先日 Apple から発表された新言語 Swift。
発表を見たときは、正直げんなり(新しい言語覚えるの大変だなって)したけど、
使ってみないと分からないと言う事もあり、せめて Hello World ぐらい表示させてみようと思った次第です。

Swift は、まだ Beta 版で Xcode 6 Beta x 版で無いとコンパルできません。
Beta 版を使うには、Apple の Developer Program に加入する必要があります。
年間 7,800 円と少々お高い。アプリ作って App Store に出すなら必須なので、
通常アプリ作っている方であれば試してみる事ができます。

実際には、Developer Program のページからサインインして、iOS のサポートページの
上部に表示される Updated Program Licence Agreement(ライセンス更新)の表記にある Review Agreement のリンクで
更新処理を行う事でリンクがアンロックされる iOS8 のページにある Xcode のダウンロードで初めて入手が
できるようになるという非常に手間な段取りとなります。

また、Xcode 6 Beta 2(2014/06/22時点)は、Mac OS 10.9(Mavericks) からでないと使えないため、
OS を更新していない人は、注意が必要です(自分は 10.8 だったので、この機会に 10.9 へ更新しました)。

さて、ここまで来ると後は、コードを書くだけ。
Xcode を起動して新しいプロジェクトを作成し、途中言語の選択を行える部分があるので、そこで Swift を選択すれば、
利用できます。

プロジェクト作成時点で、Hello World が表示されていれば早くも終了かと思いましたが、結果単なる画面の起動まで
しか用意されていない状態でした。

早速、コードを記述するわけですが、言語仕様がよくわからない状態だったので、以下のページを参考にさせていただき、
予備知識を得た上で作成する事にしました。

新プログラミング言語「Swift」の型と制御構文
http://codezine.jp/article/detail/7842

Objective-C から、現代の流行の言語風に記述できるようになっているようです。
個人的には、行の終わりは「;」を使用したり、括弧の省略とかはない方が好きなのですが、古くさい人間なんでしょうか?
では、事前知識を得た上で作成を行います。

起動すると、ストーリーボードが用意されているので、今回そちらに Hello World を表示させるためのラベルを配置します。
次に、アシスタントエディタにして、ラベルをクリック後、Ctrl キーでエディタ部へドラッグして Outlet 接続を行います。

あとは、viewDidLoad() で、接続したラベルに対して Hello World を代入するだけ。
コードは以下の通り

import UIKit

class ViewController : UIViewController {
    @IBOutlet var label : UILabel
                                                                                 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        label.text = "Hello World"
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }    
}

以上でビルドすれば Hello World が表示される。
書いたコードは 1 行だけ。。。これじゃ試した内にはいらない。。。
もう少しちゃんとしたコードは後々に

あとは、気になる部分としてテストの部分ですが、いまのところ「Quick」というやつが人気有るらしい。

Quick
https://github.com/modocache/Quick/blob/master/README.md#how-to-install-quick

これも追々やっていきます。

その他、気になる部分としては本当に Objective-C よりも早いのか?
この部分は、後発ということや、Apple 謹製なので外す事はないとは思いますが気になる部分です。
調べてみると、この部分を検証されている記事があり、そこには今のところ Objective-C よりも
遅くなる事があると書かれていました。

SwiftはAppleが主張するほど高速ではない - 最初のベンチマークより
http://www.infoq.com/jp/news/2014/06/apple-swift-performance-hit

コンパイラの最適化部分がまだ調整出来ていないようです。
上記にも書きましたが、Beta 版なので現段階でどうこう言ってもしょうがないという事でしょう。
(Apple 自体も知っている内容だとは思いますが)

また、おもしろい記事として遅い部分は C で記述出来るという内容がありました。

Swiftは遅いので、クリティカルな部分はCで書く
http://qiita.com/moriturus/items/6845c2686ae43ab5e12f

これで、スピード不足は補えますね。。。

最後に、Swift の最新情報を毎週メールで送ってくれるサービスの記事がありましたので、
それを記述して終わります。

Swiftの最新情報を毎週メールで送ってくれるサイト「Swift weekly」
http://www.lifehacker.jp/2014/06/140621swiftswift_weekly.html
Swift weekly
http://swiftweekly.com/

2014年6月9日月曜日

Swift の学習サイト(メモ)

去年の10月頃から全く iPhone のアプリの開発していない。
妙に仕事が忙しい為もある(自分で設置した爆弾が爆発してそれの対応に追われる日々だったりする)。

そんな中、Apple が先日の WWDC で Swift という言語を発表した。
年取ってくると正直新しい言語とか拒否反応が出てくるのだが、この業界ではその考えしてると淘汰されていくので、嫌でも追いかけて行く必要がある。。。

さっきも書いたが、自分のバグ回収でに追われる日々で Swift の内容がよく分からないが、Objective-C よりも早く、簡単に書けるというものらしい。

そんな中、学習サイトが紹介されていたので、覚えとして貼っておく。

Lean Swift
http://www.learnswift.tips/

他に日本語であれば Qiita に情報が集まっている気がする。

Qiita
https://qiita.com/

落ち着いたら、、、やろう。。。

2014年4月3日木曜日

Apple から「iTunes Connect: Updates to App Store pricing.」というメールが来た

少し前にはなりますが。。。

Apple から以下の内容のメールが来ました。

----
Dear XXXX,
 
Within the next 24 hours, the following changes will be made to pricing on the App Store.

To account for changes in foreign exchange rates,
App Store retail prices will be increased for the following currencies:

    Australian Dollar
    Indian Rupee
    Indonesian Rupiah
    Turkish Lira
    South African Rand

Additionally, retail prices for Israeli New Shekels and some price tiers for the New Zealand Dollar will be decreased.

Price adjustments on the App Store are made periodically due to changes in foreign exchange rates.
 Within 24 hours, you will see the new Pricing Matrix in the Rights and Pricing section of Manage Your Apps on iTunes Connect.

Updates to iOS Paid Applications and Mac OS X Paid Applications contracts will be available on the iTunes Connect website.
To view all current and outstanding contracts, see Contracts, Tax, and Banking on iTunes Connect.

Regards,

The App Store team

----

毎度の事ながら間違っているかもしれない意訳を

---- 
 24 時間以内に、App Store の価格設定変更について説明します。
以下の通過については、外国為替レートの変動により価格が上昇します。

オーストラリアのドル
インドのルピー
インドネシアのルピア
トルコのリラ
南アフリカのランド

さらに、イスラエルのニューシケルとニュージーランドのドルは価格が下がります。

 App Storeでの価格設定については、外国為替レートの変動により定期的に更新されます。
24時間以内に、iTunes Connect で管理しているあなたのアプリの価格マトリクスを見る事ができます。
更新された価格で、iOS 有料アプリと、Mac OS X の有料アプリの設定を行うには iTunes Connect の web サイトで行ってください。
これらの設定については、iTunes Connect の Contracts, Tax, Banking を確認してください。

それではよろしくね。

App Store チームより
----

要するに価格改定が有るとの事らしいです。
最近まったく iOS の開発とか出来ていないので、こういったメールをみると、寂しくなります。。。

というか、今出してるアプリが iOS 7 に対応してないので、早く直さないと、、、
(ユーザー自分しかいないけど)

2014年1月14日火曜日

Apple からの「Build your apps for iOS 7.」のメール

昨年から情報は出ていたが、今朝改めてタイトルのメールが来た。

Make sure your apps work seamlessly with the innovative technologies in iOS 7. 
Starting February 1, new apps and app updates submitted to the App Store must be built with Xcode 5 and iOS 7 SDK.
Learn more about building apps for iOS 7.

訳としては、

あなたのアプリが iOS7 に対応している事を確認指定ください。
2 月 1 日から、新しいアプリの登録や更新時には、Xcode 5 と iOS7 でビルドしたものが必要となります。
詳しくは、iOS7 でのアプリ作成方法を参考にしてください。

と、いうことらしい。

最近別件にて、iOS アプリに手を付けていないので、こういうの見るとスタックが積まれた感じが半端ない。。。
ただ、こういった事により、古い OS のサポートをしなくても良くなるというのは、これはこれで良かったりもする。

とにかく、次回の登録からは Xcode5 と iOS7 の組み合わせでの登録ということでやっていこう!

2013年12月10日火曜日

iPhone アプリで AdMob の表示ができない

iPhone アプリで、AdMob を利用したアプリを作ろうと思っているが、まずは AdMob の簡単な使い方を確かめてみようと思いサンプルプログラムを作成したが、全く表示されない。

最終的には、表示できたのでそこまでの手順を残す。

今回、参考にしたサイトは、こちら

Google AdMob Ads iOS(初級)
https://developers.google.com/mobile-ads-sdk/docs/ios/fundamentals?hl=ja

Google 本家のページ。
いきなり Google と出て戸惑ったかもしれないが、AdMob とは Google が提供するサービスだ。

AdMob
http://www.google.co.jp/ads/admob/

さて、参考のサイトではいきなりの実装を行っているが、実際には前準備が必要となる。
それは、AdMob 自体にアカウントを作成して、広告表示の準備を行わないといけないと言う事。
ここから、失敗した内容を紹介しつつ最低限の表示を行うまで説明する。

失敗1:アカウント登録に戸惑う

AdMob を使用するには、アカウントを取得する必要がある。
Google アカウントがあれば、AdMob とは簡単に連携ができるようだ。
すでに、Google のアカウントを持っていたため、そのまま Google アカウントでログインした。
すると、ログイン画面後に、以下の画面が表示され呆然としてしまった。


アカウントを作成しているのに、アカウント登録の画面が表示されるからだ。
まず、この事態を把握するのに結構時間がかかった。
この画面を下にスクロールすると、登録の項目が出るので再度登録が必要かと思い進めていると、国の指定で「日本」がない。
この部分をどうすれば良い物か相当悩んだのであった。


答えは、ここで登録する必要は無いと言う事。
つまり、最初の画像に書かれている英文によると、「下のリストにある国はサポート対象となっているから、リンクで設定画面へ遷移して」ということで、リストにない国で登録する場合には下の項目を入力して処理してね。と言う事だった。
単純ながら、英語アレルギーで無視していたのが良くなかったようだ。
書かれてあったメッセージ通り、リンクをクリックすると設定画面へ移動した。

失敗2: 設定を放棄

早速、リンクから設定画面に移動したが、またここで意味が分からない状態になった。
何を設定すればよいか全く分からないのである。
ここまで来ると、進めていけば分かるだろうと実装に入ったのであった。
この部分は、後に解決するので、次の失敗に。。。

失敗3:Google を甘く見ていた

AdMob の設定をあきらめ、実装に入った訳だが、参考サイトの通り書かれて有る内容で実装してもエラーが出て上手くビルドすら通らない。
サンプルコードも有る物の、ダウンロードしても Xcode のバージョンが違うためか同じくビルドエラーになる。
流石に、嫌になってくるが AdMob は、もはやメジャーな機能なので Google で調べると当然解決策が見つかった。よって手順を残す。

 3-1.SDKのダウンロード
参考リンクの説明では、SDK のダウンロードありきで話が進んでいる。
が、いきなり参考リンクを見た人は、SDK の入手なんかしていない。

以下のリンクから iOS 版の SDK をダウンロードする。

AdMob SDK Download
https://developers.google.com/mobile-ads-sdk/download?hl=ja#downloadios

ダウンロード後、展開する。

3-2.プロジェクトへのコピー
Xcode のプロジェクトに、任意のグループを作成して、そこに展開した内容(Add-ons フォルダとREADME.txt以外全て)をコピーする。

3-3.ライブラリの追加と、コンパイラの設定
プロジェクトの設定で、ライブラリを追加する。
追加するのは以下の物

AudioToolbox
MessageUI
SystemConfiguration
CoreGraphics

他に、以下の物も追加しないとエラーになる(どうなってんだ Google)
AdSupport
StoreKit
AVFoundation

次に、プロジェクトの設定で Build Setting の項目を選択し、Other Linker Flags に -ObjC を追加する。

結構面倒だ。じつは CocoaPods を使用すればここまでは、一瞬で終わってしまう。
手動管理が面倒と思われる方は CocoaPods を利用する事をお勧めする。
(Podfile に 「pod 'Google-Mobile-Ads-SDK'」を追加して pod install)

3-4.実装
実装に関しては、参考リンクの通りで問題はないが、ここで困るのが
// 広告の「ユニット ID」を指定する。これは AdMob パブリッシャー ID です。 
bannerView_.adUnitID = MY_BANNER_UNIT_ID;
の部分。
MY_BANNER_UNIT_ID」については、define で指定しても良いし、直接(@"")指定しても良いが、問題は内容。
書いてある通り、広告の「ユニット ID」を指定すれば良いのだが、これが何の事かさっぱり分からなかった。おまけに「これは AdMob パブリッシャー ID です。」と書かれてあるために、パニックになってしまった。
パブリッシャー ID と言う表示を元に、AdMob の設定画面を見ると、画面上部にパブリッシャーIDがあるので、これを入力してみたが動かなかった(広告が表示されない)。


ネタバレにはなっているが、結果的に広告の設定を行って、そこに表示される「広告ユニットID」をコロン以降全て指定してやる必要があった(画像で行くと「ca-app~20」まで)。

3-5.広告の設定
話が前後するが、広告の設定が必要となるので、その作業を行う。
まず、設定画面で、「収益化」をクリックして、次に「新しいアプリを収益化」のリンクを押す。
表示方法等の設定画面が出るので、任意に設定する。
すると、3-4 の画面に有るとおりに「広告ユニット ID」が表示される。
これをプログラムに記述する。

失敗4:「収益化」と「広告」の理解不足

最初は「収益化」と「宣伝」の意味が分かっていなかった。
ここら辺の理解が鈍いのが欠点だ。

収益化とは、「自分のアプリのスペースを提供して広告を表示して収益を得る事」
宣伝とは、「自分ないし誰かのアプリのスペースを拝借して宣伝して貰う事」

と言う意味だと思う。
なので、宣伝の方では、表示の回数やクリックに対する対価の設定などがある。

これの理解無しに、全てが収入に繋がる物と思い、
「広告を表示するから広告の設定をしないと」→「なんで支払いの設定なんだ?」→「いや、コレで有ってるはず」→「なんで支払いの設定なんだ?」。。。のループが作られ相当な時間を費やしたのは言うまでもない。

最後に

だいぶ端折るが、あとは参考リンクの通りに実装すれば、広告が表示されるようになる。
実際にはこのままでは、エラー処理が行われていないなどの事があり、AppStore の審査には通らないようだ。
参考リンクから、中級→上級と上がっていく必要がある。
今のところ、画面に出るまで苦労して一息ついたので、先には進んでいない。

文面がぐちゃぐちゃで読みにくいかも知れないが、ポイントは押さえたと思っている。
同じ過ちで時間を費やしている人に役立てればいいなと思う。

2013年12月1日日曜日

Trunk Notes 画像の表示が出来ない

Trunk Notes に画像を貼り付けていたが、今見ると表示されていない。

思い当たる点としては、Markdown のフォルダに画像ファイルが有ったけど、開こうとしてもファイル破損となっていたので、不要ファイルと思い消したのが原因なようだ。

そこで、Markdown のフォルダに画像ファイルを入れて、Dropbox 同期を取ろうとしたが、エラーになってしまう。
少し前までは、Markdown と同じフォルダ階層に画像ファイルを置いて問題なかった気がしたが現バージョンでは上手くいかないようだ。

気を取り直して画像の取り扱いについて、アプリ内のマニュアルを見ると、画像のアップロードを行って利用するようになっていた。
マニュアルの内容からすると、
  1. 画面左上の NEW ボタンを押してメニューを出し、「フォトライブラリからの追加」か「写真を撮影して追加」から画像を選択する。
  2. 表示たいページで image 関数を使って表示を行う。
    {{image File:xxxx.png}} のように指定。
上記の手順を踏むと無事画像が表示されるようになった。
ただ、画像サイズの指定は、関数では出来ないので、サイズを指定したい場合は、必然的に HTML の img タグを指定することとなる。


動きを見てみると、1.の画像追加で、Dropbox に同期を取ると、Trunk Notes の同期フォルダに「files」というフォルダが作成され、その中に2.で指定したファイルが格納されるようになっている。

アプリでのデータ管理方法としては、Markdown の文章と、マルチメディアを格納する場所を分けたということで、考え方的には良いと思う。
文章と画像が入り乱れると何か汚いからね。


注意点としては、手順が面倒だと思って、「files」のフォルダに直接画像データを追加し、image 関数や img タグで指定をしても画像は表示されないという事。
どうやら、「files」の内容をどこかで管理しているようだ。
う~んこの点、もうすこし融通が利けば楽に編集できるようになるのだが。

2013年11月16日土曜日

Apple から「iTunes Connect: App submissions in December.」というメールが来た

毎度の Apple からのメール。

今回は 12 月におけるアプリの登録処理について書かれてある。
内容は以下の通り

Dear XXXX,

iTunes Connect will be temporarily unavailable from Saturday, December 21, to Friday, December 27, 2013.

During that time, iTunes Connect will not be accessible and you will not be able to submit any apps or In-App Purchases. Processing of any Newsstand Atom feeds will be delayed until after December 27. Sales and Trends reports via the Autoingestion tool will be available but may also be delayed.

Also, you should not schedule any pricing changes or apps to go live between those dates. Pricing changes scheduled to take effect in that date range will cause the app to become unavailable for purchase until after December 27. Similarly, apps scheduled to go live during that range will not be released until after December 27.

If you have any additional questions, use the Contact Us module on iTunes Connect.

Regards,

The App Store team



今回も翻訳サイトと、自分の解釈を使って読んだところ、

2013/12/21(土曜日) から 2013/12/27(金曜日) まで「iTunes Connect」が利用が出来なくなります。
この間におけるアプリの登録や、アプリ内課金の処理が行えなくなります。

「ニューススタンドの Atom」 処理についても 12/27 以降になります。

「Sales and Trends reports」のレポートについては、「Autoingestion tool」を使えば確認できるが、これも遅れる可能性がある。

つまり、この間に価格の設定や、アプリの価格設定やアプリ活性化は行うべきではありません。
この間に設定した内容については、12/27 後に有効になります。

不明点が、あるなら iTunes Connect へ行き、Contact Us で問い合わせてください。

それではよろしく、

App Store チームでした。


要するに、2013/21/21 から 2013/12/27 までは、iTunes Connect を利用してのアプリの設定については行ってくれるなと言う事。
この間にアプリについて価格設定等をしても 12/27 にならんと反映されないと言う事になる。

世間的には、クリスマスの期間な訳だが、その間アプリの設定をさせないとは Apple は鬼かしら。。。

自分は特にそんな必要あるアプリ無いんですけどね。。。

内容間違っていたら、コメントください。



[自作 iPhone アプリ紹介]
スマートな電話帳をあなたに!!
Smart Speed Dialer」
AppStore で、販売開始!
ただ今、PromoBook さんでプロモーションコード配布中!!
(11/24 まで)

2013年10月27日日曜日

iPhone アプリ宣伝方法を考える

先日、「Smart Speed Dialer」 というアプリをリリースしましたが、
コレが全くダウンロードされません(笑)。

自分が動いていないから当然と言えば当然ですね。

また現在の iOS アプリの総数は、約 80 万本(2013/05 時点のデータ)あるそうです。
ジャンルは様々とはいえ、この数の中に一石を投じたところで、どんなアプリでも一瞬で埋もれてしまうでしょう。

では、ここからどうやってアピールしていくかを考え、調査してみました。
現時点での結論からすると、以下の 4 つ。
  1. 自分の周りに紹介する
  2. 動画サイトへ投稿する
  3. プロモーション配布サイトへ依頼する
  4. レビュー掲載サイトへ依頼する

宣伝費が有れば、更に広告などが出てくるとは思いますが、
なんせ資金が無いので、こちら再度で頑張れる範囲でやってみようと。
(どの方法にしても、誰かのお世話にはなりますが・・・)

これらの詳細は、

1.自分の周りに紹介する
まずは、自分の周りに知ってもらうと言うところをやってみます。

今回有料アプリですが、幸いプロモーションコードという物が発行できるようになっています。
これは、アプリのプロモーション用の物で、これを使えば無料でダウンロードが可能となる物です。
コードの数は、1 バージョン 50 個の制限があるので、やたら目ったら配布してしまうと、
直ぐに弾切れになるので、計画が必要です。

こちらを、iPhone を持っている知人友人に配布しました。
この方法については、直接話をして理解をして貰い、何らかの反応を貰うようにお願いしないと、
そのまま放置される可能性が高いです

なので、セールス的で気が引けますが、レビュー入力をお願いした方が良いかもしれません。

レビューも、App Store の物から、Blog をやって居られる方がいれば、記事の一つとして
お願いするのも良いかもしれません。

その他は、ソーシャル(Twitter/Facebook/Google+/Mixi)を使って宣伝します。
(口コミ的になればいいのですが)


2.動画サイトへ投稿する
App Store の画像だけでは、アプリの良さがつかみきれない場合が有るかと思います。
この場合は、動画を撮影して動画サイトへ投稿するというのも一つの手だそうです。

今回の自分のアプリは、動画の撮影まではしませんでしたが、
規模が大きくなったときには採用を考えてみたいと思います。


3.プロモーション配布サイトへ依頼する
上記のプロモーションコードを配布してくれるサイトがあるので、
それを利用してユニークユーザーの獲得に出てはどうかと思いました。

調べた結果、あまりこのようなサイトが見つかりませんでした。

○ 国内
PromoBook
https://www.facebook.com/promobook.me

App News+
http://www.appnewsplus.com/

○ 海外
appGiveaway.com
http://www.appgiveaway.com/

あとは、変化球的にはなりますが、懸賞サイトへの登録という方法が有るようです。
アタッター
http://atatter.jp/


4. レビュー掲載サイトへ依頼する
たぶんこの方法が一番多くの人の目に付く方法だと思います。
レビュー依頼のサイトについては調べてみると、とても多くの数がありました。
ここでも、依頼をかける際にはプロモーションコードを使って、レビューをお願いする形となります。

前もって有る程度こちらからアプリの解説を用意しておく必要があり、
App Store の概要と同じでは意味がないとこのとで、
再度オリジナルの紹介文を作成する必要があります。

また、各サイトによって、画像が必要だったり、アピールポイントが必要だったりと項目が変わってくるので、
適時対応して依頼を出す必要があります。

以下が、調べたサイト(順不同)

AppBank
http://www.appbank.net/http://www.appbank.net/2011/08/01/iphone-news/282433.php

iPhone 女史
http://www.iphone-girl.jp/
http://www.iphone-girl.jp/press/

meet i
http://web.meet-i.com/

Touch Lab
http://touchlab.jp/about/

iPadiPhoneWire
http://iwire.jp/top/notice/press.html

ketchapp!
http://ketchapp.jp/request/

plima
https://plima.jp/pc-contact

App@DIME
http://www.appdime.jp/%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B

iPhone 女子部
http://www.iphonejoshibu.com/info/

覚醒する@CDiP
http://www.donpy.net/oshirase/15049.html

iPhone 研究室
http://iphone-lab.net/invite/press-release

アプリソムリエ
http://appsomm.jp/contact/

CatchApp
http://catchapp.net/company
現在有料のみ受付

iStation
http://iphones.cx/other/developer.php

AppleFan
http://www.applefan2.com/request

Girl's App
http://girlsapp.jp/contact/

アプリ学園
http://appgaku.com/contact.html

AppLibrary
http://app-library.com/review

Applision
http://applision.com/review/

Appinfo
http://iphone.appinfo.jp/about/

AppsJP
http://appsjp.com/?page_id=1287

RainbowApps
http://blog.rainbowapps.com/index.php/about/

AppWoman
http://appwoman.jp/application

スマアプリ
http://iphone.smapli.net/contact.php

キッズアプリCOM
http://www.kids-app.com/request

giveApp
http://www.giveapp.jp/


○ アプリ情報共有サイト
リリースを自分で書く?

AppConnect
http://connect.plus.vc/


○ 個人では希望が薄いが iT 系情報サイトに送る

マイコミジャーナル
http://news.mynavi.jp/top/notice/press.html

iTmedia App Town
http://www.itmedia.co.jp/info/mail/index.html?zdrelease#formStart
release@ml.itmedia.co.jp

ファミ通App
http://app.famitsu.com/contact/

IDEA*IDEA
http://www.ideaxidea.com/

GIGAZIN
http://gigazine.net/

GIZMODE
http://www.gizmodo.jp/


一体どれが?またどの順番が、どれだけの効果が有るか分かりませんが、
出来るところから少しずつ実行していきたいと思います。