タグ

ブックマーク / akisute.com (23)

  • UIWebView, WKWebView 等において Drag and Drop を禁止する方法

    iOS 11よりDrag and Drop APIUIKitに追加され、UITextView / UITableView / UICollectionViewに簡単にDrag and Dropを実現するためのdelegateが用意されたり、それ以外のUIViewにもDrag and Dropをハンドリングするための仕組みが用意されました。このDrag and Dropは基的にはアプリをまたいでデータを受け渡しすることを前提として作られていますが、一応は自分のアプリ内でデータを移動したりコピーしたりするためにも使えるようになっているので、積極的に活用していきたいところです。 ところでこのDrag and Drop、基的にはアプリ側が対応しない限り自動的には対応してくれないのですが、例外があります。それがUIWebView / WKWebView / SFSafariViewContro

    UIWebView, WKWebView 等において Drag and Drop を禁止する方法
    raimon49
    raimon49 2017/08/09
    webview.scrollView.subviews.firstの中にinteractionsが刺さっているので空配列を渡す。
  • pyspa Advent Calendar 2016 1日目: 今年の話

    去年に引き続きまして pyspa Advent Calendar 2016 一番槍担当の斧さんakisuteです。よろしくお願いします。 去年はゲームの話をしましたが、今年は人生に一度しかやらなさそうなイベントを大量に発生させましたので、主に今年何をやっていたのかについてご報告させていただきたいと思います。 1. 家を買いました ずっとワンルームのアパートにしか住んだことがない男だったのですが、30過ぎたので人生一度きりだし家でも買ってみるかと思い、半年ほど探して思い切ってタワーマンションの部屋を買ってしまいました。 正直ちょっと前まで家を買うとか単に負債を抱えるだけの大アホだと思っていたのですが、実際に買ってみると案外悪くなかったです。売ればいいとか資産価値があるとか賃貸より買ったほうが割安とかそういうことはさんざん世間様がおっしゃってるかと思いますので、ここではあんまり世の中では言われ

    pyspa Advent Calendar 2016 1日目: 今年の話
  • Q. ATS を Debug ビルドでだけ無効にしたいのですが...

    A. こちらの内容に従えば一発です。 http://stackoverflow.com/a/32704702 要するにBuild Phaseにビルドスクリプトを追加してそこでPlistBuddyを使って値を書き換えましょうと言う作戦です。 もうちょっとマシな解説 http://stackoverflow.com/questions/1832157/setting-a-boolean-property-in-info-plist-from-a-user-defined-setting 普段、Info.plistの設定内容をConfiguration毎に書き換えたい場合は、たいていよくやるのがxcconfigファイルを以下のように用意して、 APP_BUNDLE_NAME = MyApp_Dev でもってInfo.plistに対して Bundle Display Name = ${APP_BU

    Q. ATS を Debug ビルドでだけ無効にしたいのですが...
    raimon49
    raimon49 2016/10/04
    PlistBuddyコマンドで.plist書き換え
  • A-Liaison BLOG: AppBank GAMESを退職していました

    表題の件、私akisuteは2013年10月末日を持ちましてAppBank GAMES株式会社を退職したことをご報告いたします。短い間ではございましたが関係者皆様大変ありがとうございました。今後の予定につきましてはとりあえずのところ問題なくやっていけそうで助かっております。 ところで、せっかくの退職エントリですので感慨深いものですし、ここはひとつ昔話などをしたいと思います。 まずはAppBank GAMESの軌跡を年表にして振り返ってみました。 2012年2月 AppBank GAMESがスタートしました。2012年4月 最初の退職者が現れました。2012年夏 第一次反乱が発生しました。2012年7月 G君という大変優秀なレベルデザイナーがジョインしました。2012年10月 Dungeons and Golfの追い込み時期にとある出来事が発生しました。2012年12月3日 Dungeons

    A-Liaison BLOG: AppBank GAMESを退職していました
    raimon49
    raimon49 2015/10/19
    >「SEGAさんと組んでるから遅れてお客さんを待たせるのはプロとしてありえない」/ SEGAさん……。
  • GitHub:Enterprise 環境下では CocoaPods を 0.34.0 以上にアップデートしてはいけません

    CocoaPodsのgitを利用するアクションが全く成功しなくなります。具体的にはpod install, pod updateなどが全く通りません。 公式ブログにあるとおり、0.34.0以上からCocoaPodsは高速にgitリポジトリをcloneするため--depth 1 (shallow clone) オプションを採用するようになっています。しかしながらGitHub:Enterprise側の技術的問題なのか、GitHub:Enterprise内のgitリポジトリに対するhttpないしhttps経由でのshallow cloneが成功しないため永遠にpod installやpod updateが終わりません。

    GitHub:Enterprise 環境下では CocoaPods を 0.34.0 以上にアップデートしてはいけません
    raimon49
    raimon49 2014/10/01
    >GitHub:Enterprise内のgitリポジトリに対するhttpないしhttps経由でのshallow cloneが成功しない / 運用で回避しかない。しんどい。
  • Silent Push / Background Fetch 時の fetchCompletionHandler に渡す引数ごとの挙動の違いを調べてみた

    Silent Push / Background Fetch 時の fetchCompletionHandler に渡す引数ごとの挙動の違いを調べてみた 2014/09/10追記: 追加調査によって判明した事項を追記しています。 iOS 7から追加されたPush通知によるバックグラウンド処理機能 (Silent Push) および定期的なバックグラウンドフェッチ機能 (Background Fetch) ですが、これらの機能はバックグラウンド処理が完了したタイミングでいずれもfetchCompletionHandlerにUIBackgroundFetchResult型の値を渡すような設計になっています。 ちょっと調べれば、大体どこの解説サイトにも以下のように説明があります。 UIBackgroundFetchResultNewData 新しいコンテンツの取得に成功し、新しいデータが存在した

    Silent Push / Background Fetch 時の fetchCompletionHandler に渡す引数ごとの挙動の違いを調べてみた
    raimon49
    raimon49 2014/08/25
    UIBackgroundFetchResultNewDataを渡して処理を終了した場合はスナップショットの更新がかかってUIViewControllerの各ライフサイクルのメソッドが呼ばれるのか。その他、通知をし過ぎやBackground Fetch呼び出し頻度へのペナルティなど。
  • Apple Push Notification (APN) 使用時の delegate の挙動について、 iOS 7以降 / iOS 6以前の差をまとめた

    Apple Push Notification (APN) 使用時の delegate の挙動について、 iOS 7以降 / iOS 6以前の差をまとめた iOS 7以降とiOS 6以前で、俗にいうリモートPush通知の受け取り方と受け取った際の挙動がまるで違っているので、最近リモートPush通知を実装した時につまづいた箇所をまとめてみました。 使用するdelegate methodの違い いかなる種類のPush通知においてもapplication:didReceiveRemoteNotification:fetchCompletionHandler:を使用します。 application:didReceiveRemoteNotification:fetchCompletionHandler:とapplication:didReceiveRemoteNotification:が両方実装され

    Apple Push Notification (APN) 使用時の delegate の挙動について、 iOS 7以降 / iOS 6以前の差をまとめた
    raimon49
    raimon49 2014/08/12
    iOSバージョン、fetchCompletionHandler付きメソッド、サイレント通知になる条件。素晴らしくまとまっててありがたい。空のsoundや高めのpriorityを指定すると到達率が良くなるのか。知らなかった。
  • App Extension や Widgets に App Container を使わないで簡単にデータを渡す方法

    iOS 8から利用できるApp Extensionはアプリ体とは別のプロセスとして動作するため、そのままでは簡単にデータを渡すことができません。公式のドキュメントではApp Containerという仕組みを使う方法が推奨されていますが、この方法はiOS Dev Center上でApp IDの設定が必要になったりするなど面倒がつきまといます。そこでより簡単にApp Extensionにデータを渡す方法がないか調べてみました。 一番おすすめなのがこちらです。UIPasteboardというのは要するにコピペ用のクリップボードみたいなものなのですが、こちらシステムが用意している共通のもの以外にも自分のTeam IDでコードサインされたアプリ間すべてで共用できるPasteboardを作成する機能があります。この機能を使用すると非常に簡単にデータをやりとりすることができます。面倒な設定も不要ですし、

    App Extension や Widgets に App Container を使わないで簡単にデータを渡す方法
    raimon49
    raimon49 2014/06/25
    pasteboardWithName:でアプリ間お手軽受け渡し
  • 既存の Objective-C のメソッド引数の Swift 上での扱われ方を調べてみた

    前置き こちらの記事には2014/06/09現在、公式にはリリースされていないiOS8プレリリースドキュメントへのリンクが含まれます。iOS8にて新しく追加された内容には一切触れておらずAppleとのNDA規約にも違反するものではないという認識ですが、場合により予告なく削除する可能性があります。予めご了承ください。 題 iOS8プレリリースドキュメントを眺めていて気になったのですが、ほとんどのCocoaのメソッドの引数に!がついています。例えばNSKeyValueObservingプロトコルのaddObserver:forKeyPath:options:context:メソッドのシグネチャは以下のようになっています。 func addObserver(_ anObserver: NSObject!, forKeyPath keyPath: String!, options options

    既存の Objective-C のメソッド引数の Swift 上での扱われ方を調べてみた
    raimon49
    raimon49 2014/06/09
    >!はImplicitlyUnwrappedOptionalという特殊なOptional型であり、アクセス時にOptionalではなく強制的に元の型を返す点がOptionalと異なる、と考えれば理解しやすい。
  • Swift を使ってみてがっかりした点まとめ

    数日間iOS8/Xcode6/Swiftな環境で色々試してみて、Swiftを使っていて思ったよりがっかりした点が多かったのでちょっとまとめてみようと思います。 動的な処理がSwiftだけでは一切できない [NSObject performSelector:]の類と、NSInvocationがSwiftからは一切呼び出せません。使おうとすると怒られます。objc/runtime.hは試していませんが、同様に直接Swift経由では呼び出せず間にObjective-Cをかます必要があるのではないかと思われます。 @optionalなprotocolが限定的にしか使用できない 具体的には@objc属性を付けないと使えません。しかしながらこのような後方互換性のためだけに存在する属性をいつまでもAppleがサポートするかは疑問が残るというのと、もう一つ以下の様な問題があります。 @objc属性のついた

    raimon49
    raimon49 2014/06/06
    weakみたいなunownedというキーワードが存在。
  • Android で 画面の回転や状態の復元まで考えた Fragment の使い方のガイドライン(自分用メモ)

    Fragment を使った画面を作る際に、どのように作ればうまい具合に画面の回転や状態の復元を扱えるかという自分用のメモです。 基方針として可能な限りすべての管理を当該ActivityのFragmentManagerに任せると楽 ActivityのフィールドとしてFragmentを保持するのはバッドノウハウな気がする onCreateとonDestroyが呼び出されたからといってインスタンスが生成破棄されているとは限らない、これらはFragmentManagerのタイミング次第

    raimon49
    raimon49 2014/05/26
    ActivityとFragmentの関係 ライフサイクル
  • [NSObject load] と [NSObject initialize] の違い

    クラスがObjective-Cのランタイムにロードされ利用可能になったタイミングで、そのクラス全体の初期化を行いたいということはよくあると思います。Objective-CではNSObjectクラスの以下のメソッドを用いてクラス全体の初期化を行うことができます。 + load + initializeこの2つですが、結構挙動が異なります。詳細については以下のとおり。 http://cocoawithlove.com/2008/03/cocoa-application-startup.htmlloadメソッドはクラスがロードされて利用可能になったら即座に呼び出される。このとき、自分以外の他のクラスはまだロードされていない可能性があるので、自分以外のクラスを利用するような初期化はできない。main関数の内部のNSAutoReleasePoolが用意されるよりも先に呼び出されるので、autorel

    raimon49
    raimon49 2014/04/05
    loadは地雷多し、安全な+ (void)initializeをオーバーライドしておけばOK
  • iOS SDK 7.1 / Xcode 5.1にアップグレードした時に踏んだ地雷まとめ

    日iOS SDK 7.1 / Xcode 5.1にアップグレードを行った際にぶつかった所々の問題とTipsをまとめておきたいと思います。 arm64対応とCocoaPods Xcode 5.1からデフォルトのビルド設定$(ARCHS_STANDARD_32_BIT)がarm64、要するに64bit対応を含むようになり、arm64 armv7 armv7sの3つのアーキテクチャに対してビルドを行うようになりました。ソースコードからビルドを行っている場合は大抵問題ないと思うのですが、以下の様なケースでarm64対応を切りたい場合があります。 プロジェクト内にarm64アーキテクチャに対応していないstaticライブラリが含まれている場合。 64bitになると危険なバグが発生するおそれがあるコードが含まれている場合、例えばCGFloatやNSIntegerのサイズが変化したり、各種ポインタのサ

    raimon49
    raimon49 2014/03/12
    Architectures(ARCH)を$(ARCHS_STANDARD_32_BIT)
  • iOS 開発者が Android 開発者になるために用意したものまとめ

    これまでiOS 2.0の登場から今日に至るまでiOS開発者として仕事してきたわけですが、今年はいよいよ格的に仕事Androidの開発を行っていきたいと思っています。そこで正月休みを使って準備したAndroidの開発環境や勉強用の資料をまとめてみました。同じく今年からAndroidやってみよう!という方の助けになればと思います。 ■前提条件 まず最初に前提条件として筆者のスペックをまとめてみました。 iOS開発歴4年ぐらい (iOS 2~7) Android開発歴半年ぐらい (Android 1.5~2.1の間、仕事では殆ど使ってない) Java歴は3年ぐらい (大学時代と最初の会社でSIerをやっていた間、SJC-P所持だがJava 7とか8とかはわからない) iOSの開発歴が長く、モバイル開発で必要な要素や落とし穴などをひと通り踏んでいること、少しですがAndroid開発歴があること

    iOS 開発者が Android 開発者になるために用意したものまとめ
  • Xcode 5 で、発生した NSException の詳細が表示されない時の対処法

    原因がよくわからないのですが、iOSアプリをデバッグ中にNSExceptionが発生してアプリがクラッシュしてしまった時、その詳細がXcodeのコンソール上に表示されなくなってしまいました。普通はデフォルトのexception handlerがうまい具合にやってくれるのですが、何らかの理由でそれがうまくいかない場合があるようです。自分でスレッド立ててるとかでしょうか・・・ 上図のように、例外が発生している箇所にブレークポイントをおいてどこで発生したのかを知ることはできるのですが、実際には発生箇所がわかっても発生原因がさっぱりわからないというケースもあります。例えばiOSのシステムが例外を発生させたときや、コードが公開されていないライブラリが例外を発生させたときなどです。 さて、このようなときは発生しているNSExceptionのdescriptionを直接読めれば便利そうです。というわけで

    Xcode 5 で、発生した NSException の詳細が表示されない時の対処法
    raimon49
    raimon49 2013/12/09
    スタックとレースのobjc_exception_throwでシミュレータならpo $eax 実機上ならpo $r0
  • Xcode 4 で scheme が My Mac 64bit になって iPhone 向けのビルドが出来なくなった時の対処法

    Xcode 4 で scheme が My Mac 64bit になって iPhone 向けのビルドが出来なくなった時の対処法 最近会社のプロジェクトで使う Xcode を Xcode 4 に乗り換えたのですが、全く新しく作り直された バグだらけでまともにビルドすら出来ない上に無料じゃなくなったどうしようもない出来映えの IDE ということで、何かとトラブルが多いようです。今回はその中でももっとも頻発したものをご紹介します。 たまに iOS 向けのプロジェクトを Xcode 4 で開いたときに、左上の scheme 選択欄に My Mac 64bit と表示されてしまって iPhone シミュレータや実機でビルドが出来なくなることがあるようです。 対処法はこちら。 http://stackoverflow.com/questions/5319251/xcode-4-the-selected

    Xcode 4 で scheme が My Mac 64bit になって iPhone 向けのビルドが出来なくなった時の対処法
    raimon49
    raimon49 2013/02/26
    コメント欄も
  • xxd を使って画像などのバイナリデータをソースコードに含める方法

    iOS向けのライブラリやフレームワークを作成しているときに、どうしても画像などのバイナリデータをライブラリやフレームワークに含めたくなる時があります。たとえばUI系のフレームワークなどですね。このようなときに、たとえば静的ライブラリ(.aと.h)やフレームワーク(.framework)とセットで画像を一緒に同梱し、ユーザーのXcodeプロジェクトに一緒に含めてもらうという方法もあるのですが、この方法だと画像名がユーザーのプロジェクトに含まれている画像とかぶったりしてはいけませんし、管理が面倒になってしまいます。また、ライセンスがプロプライエタリなライブラリでは、画像などのリソースをあまり積極的にユーザーに公開したくないというニーズがあったりします。 そこでxxdツールのご紹介です。岸川先生に教えていただいたのですが、xxdというツールを使えばバイナリデータをC言語のヘッダファイルとして簡単

    raimon49
    raimon49 2012/10/10
    xxdで出力したヘッダファイルをNSDataで埋め込み。dataスキームURIテクニック的な。
  • __has_feature(objc_arc_weak) を使って賢く安全に ARC/Blocks を使う

    iOS 6も発表されて、皆さんARCやBlocksをガンガン使用する感じのプログラミングスタイルに変化してきていると思うのですが、そこで問題になってくるのが後方互換性の話です。特にiOS 4。Blocksを使うとなるとどうしても以下の様に非同期で実行されたBlocksの中からViewを書き換えるようなコードを書きたくなるのですが、 __weak MyViewController *__weakSelf = self; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error){ __weakSelf.label.text = [[NSS

    raimon49
    raimon49 2012/10/10
    Blocksの内側スコープからselfを触る __weakが使えない時は__strong
  • Jenkins を iOS アプリ開発に導入してみた (GHUnit編)

    前回 はSenTestKitを用いてJenkins上で単体テストの自動実行を行いました。今回はGHUnitを使った単体テストの自動実行にチャレンジしてみたいと思います。またついでといっては何ですが、単体テスト時に必要になってくるモックを作成するためのライブラリOCMockも同時に導入してみようと思います。 ■なぜGHUnitを使うのか GHUnitを使うことで、SenTestingKitと比べて以下のようなメリットが得られます。 非同期処理のテストを行うための仕組みが用意されている(GHAsyncTestCase)これをSenTestingKitないし他のテスティングフレームワークでやろうとすると大変骨が折れます。 .app形式(要するに実際のiOSアプリケーション)でテストを実行するため、UIApplicationやUIWindowといったUIコンポーネントを使うクラスのテストが可能にな

    Jenkins を iOS アプリ開発に導入してみた (GHUnit編)
    raimon49
    raimon49 2012/10/10
    配布framework版でなく実機ビルド版で。
  • NSTimerは基本的にretainせずassignでよい

    NSTimerを初めて使ってみたのでハマったところをメモしておきます。 ■NSTimerはNSRunLoopにretainされる。NSTimerは引数targetで与えられたオブジェクトをretainする。 いちばんハマったのがこの挙動です。 AppleのNSTimerについての公式ドキュメント(http://www.devworld.apple.com/documentation/Cocoa/Conceptual/Timers/Articles/usingTimers.html#//apple_ref/doc/uid/20000807-CJBJCBDE)にもクラスリファレンスにもきちんとと明記されていたのですが・・・思いっきり見落としてました。 これらがいったいどんな問題を引き起こすか。 たとえば普通のクラスと同じ感覚でdealloc中にNSTimerのinvalidateを呼び出すコー

    raimon49
    raimon49 2012/09/04
    NSTimerのinvalidateを呼ぶタイミング。オブジェクト自身がNSTimerからretainされる関係の時はdealloc以外の箇所で。