しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

iPhoneアプリリリース時の「輸出コンプライアンス」のチェックを省く方法

iTunesConnectから審査に提出する際、「輸出コンプライアンス」と「広告ID」についてチェックをする必要があります。 毎回入力するのが手間だったので、省略する方法はないか調べてみました。 調べたところ、「輸出コンプライアンス」はInfo.plistにITSAppUs…

objc_getAssociatedObjectで既存オブジェクトにプロパティーを追加

objc_getAssociatedObjectを使ってUIViewに新しいプロパティーを生やしてみました。 UIViewにプロパティーを追加する UIViewにvalueというプロパティーを生やします。 実装は簡単で、下のようなextensionを追加すれば完了です。 private var valueKey = 0 ex…

UICollectionViewの並び替え

UICollectionViewでの並び替えを試してみました。 Storyboardを使わないでUICollectionViewを表示 まずは普通にUICollectionViewを表示してみます。 コードは下の通りです。 class CollectionViewController: UICollectionViewController { override func vi…

【Xcode】Debug Memory Graphでメモリリークをチェック

Xcode8から登場したDebug Memory Graphという機能を試してみました。 これはインスタンス間の参照を図として表示できるもので、循環参照の発見などに役立ちます。 Debug Memory Graphは、アプリ起動後にデバッグエリア右端のアイコンをタップする事で実行で…

【Swift】mp3をバックグラウンド再生する

バックグラウンド再生を試してみました。 mp3をフォアグラウンドで再生 まずはフォアグラウンドでmp3を再生してみます。 再生したいmp3ファイルをAssets.xcassetsに追加して下さい。 そのあと下のようにmp3再生処理を記述すれば完了です。 import UIKit impo…

【iOS】1つの画像データで2xと3xにも対応する

毎回2xと3xのデータを作るのが大変だったので、1つの画像データ(PDF形式)で全部に対応する方法を調査しました。 今回は下のような画像で検証しました。 利用したツールはSketchです。 まずはこのデータをpdfとして書き出します。 次にAssets.xcassetsでImage…

paper-onboardingでおしゃれウォークスルー

paper-onboardingというライブラリを使っておしゃれなウォークスルーを実現してみました。 github.com paper-onboardingのインストール target 'MyApp' do use_frameworks! pod 'paper-onboarding' end 2017/10/16現在はSwift4に対応していないので、Swift3.…

RubyでGoogleAnalyticsのデータを取得する

GoogleAnalyticsのデータの取り方を調べてみました。 取得準備 まずはGoogleCloudPlatformにアクセスしてプロジェクトを作成します。 Google Cloud Platform 続けてIAM と管理者のサービス アカウントからサービスアカウントを作成します。 この時、jsonファ…

iOSのサイレントプッシュを試してみる

iOSのサイレントプッシュというものを試してみました。 サイレントプッシュとは その名の通り、ユーザーに通知メッセージが出ないプッシュ通知の事です。 送信時にバックグラウンドで処理を走らせる事ができるので、バックグラウンドでのデータの更新などに…

\[weak self]が必要な時を調べてみる

循環参照対策で使う[weak self]ですが、常に付ける必要があるのか、それとも付けなくて良い時があるのかを調べてみました。 UIAlertControllerを使った検証 最初に、下のようなUIAlertControllerで[weak self]が必要なのかを調べてみました。 let alert = UI…

【iOS】FIrebaseでpush通知

Firebaseを使ったpush通知を試してみました。 APNs証明書の準備 まずはプッシュ通知用の証明書を作成します。 キーチェーンを開き、「認証局に証明書を要求」を選択します。 次の画面で、メールアドレスと名前を入力して証明書要求を作成します。 Certificat…

【Swift】isとisMemberOfClassとisKindOfClass

isとisMemberOfClassとisKindOfClassですが、挙動の差がわかりにくかったのでまとめてみました。 isKindOfClass 下のようなケースでは当然trueになります。 それとisKindOfClass/isMemberOfClassはNSObjectProtocolのメソッドなので、NSObjectなどを継承して…

【Swift】複数のプロトコルに準拠した変数の定義

下で定義された2つのプロトコルに準拠する型の書き方です。 protocol MyProtocol1 {} protocol MyProtocol2 {} 複数のプロトコルへの準拠を表したい時は、下のように&を使います。 protocol MyProtocol1 {} protocol MyProtocol2 {} class MyClass: MyProtoc…

Amper Musicで簡単BGM作成

Amper Musicというサービスを試してみました。 これは音楽を生成してくれるサービスで、30秒ほどの曲を簡単に作る事ができます。 www.ampermusic.com ライセンスは、非商用なら無制限に利用可能。 商用利用したい時は問い合わせが必要です。 Legal | Amper M…

Universal Linksを試してみる

iOSから登場したUniversal Linksを試してみました。 Universal Linksとは Universal Linksとは特定のURLにアクセスした時にアプリを遷移させる事ができる技術です。 例えば「https://example.com/にアクセスした時にアプリAに遷移する」と言った挙動が可能で…

ARKitでタップした場所に立方体を配置する

iOS11で登場したARKitを使って、画面上に立方体を配置してみました。 下のように地面に複数のオブジェクトが並ぶようにしています。 まずはプロジェクト作成から「Augmented Reality App」を選んでARKitのテンプレートを作成します。 次はサンプルコードを消…

Alamofire+CodableでAPIのレスポンスをオブジェクトに変換

AlamofireとCodableを使ってAPIを叩いてみました。 APIは下のようなデータを返すものにしました。 まずはCodableに準拠した構造体を作ります。 struct User: Codable { let key1: String let key2: Int } 構造体を作ったら、実際にAPIを叩いてレスポンスをUs…

SSReadingListでリーディングリストに項目追加

SafariServicesのSSReadingListという機能を使ってiPhoneのリーディングリストに項目を追加してみました。 リーディングリストとは Safariについている機能で、サイトを保存してあとで見る事ができます。 ブックマークと近いのですが「オフラインでも見れる…

BitBarでMacメニューバーに好きな文字列を表示する

BitBarというアプリを使ってMacのメニューバーに文字を表示してみました。 まずは公式サイトからBitBarをインストールします。 getbitbar.com 起動するとプラグインのフォルダーを求められるので、好きな場所を指定します。 次にプラグインフォルダの中にス…

【Swift】SimpleTabでおしゃれなUITabBarControllerを実現する

SimpleTabというUITabBarControllerがオシャレになったようなライブラリを試してみました。 github.com CocoaPodsでインストールします。 target 'MyApp' do use_frameworks! pod 'SimpleTab' end 2017/10/3時点ではSwift4に対応していないので、Swift3で動…

アプリのAHA体験を考える

先日読んだ本で、ユーザーの継続率を上げる為にはAHA体験が重要という事を学んだので、自分のアプリのAHA体験は何かを考えてみました。 いちばんやさしいグロースハックの教本 人気講師が教える急成長マーケティング戦略 「いちばんやさしい教本」シリーズ作…

TabPageViewControllerでおしゃれなタブメニューを実現する

TabPageViewControllerというタブメニューを実現するライブラリを使ってみました。 このライブラリは有名なiQONで使われているということで、かなり期待できそうです。 github.com UIPageViewControllerをつかって無限スクロールできるタブUIを実装してOSSと…

【Swift】didSetの呼ばれるタイミング(初期化/Struct/Classなどで検証)

SwiftのdidSetの呼ばれるタイミングを調べてみました。 didSetとは プロパティーの値セットを検知する仕組みです。 下のように書くことで、プロパティーに値がセットされたタイミングを検知する事ができます。 class MainClass { var value: Int? { didSet {…

【囲碁AI】MacでGNU Goを動かしてみる

MacでGNU Goという囲碁ソフトを動かしてみました。 brewに対応しているので、インストールはコマンド1行でできます。 brew install gnu-go 実行はgnugoコマンドを打つだけです。 そのあとはQ16のような形で位置を指定すれば遊ぶ事ができます。 白番を取りた…

UIStackViewでUIViewを均等配置

iOS9から登場したUIStackViewを試してみました。 UIStackViewでUIViewを均等配置 まずはUIStackViewを配置します。 縦方向と横方向があるのですが、今回は横方向に配置しました。 UIStackViewは下のように画面に配置しました。 続けてUIViewを2つ配置します…

GPUImageでカメラの画像にリアルタイムでフィルターをかける

GPUImageというライブラリを使って、カメラ映像にリアルタイムでフィルターをかける事を試してみました。 github.com まずはCocoaPodsでGPUImageをインストールします。 target 'MyApp' do use_frameworks! pod 'GPUImage' end 次はInfo.plistのNSCameraUsag…

AVAudioEngineでmp3をエフェクト付きで再生する

AVAudioEngineというクラスを使って、mp3をエフェクト付きで再生してみました。 まずはプロジェクトにmp3ファイルを追加します。 追加したファイルがBuild Phasesにも入っているか確認します。 入っていない場合は+ボタンからmp3を追加します。 まずは普通に…

Phones.frameworkで端末の写真の取得・保存・削除

Phones.frameworkを使って、端末の写真の取得・保存・削除を試してみました。 写真を操作する前にInfo.plistにNSPhotoLibraryUsageDescriptionに写真を操作する理由を記述します。 これがないとアプリがクラッシュします。 取得 端末写真をUIImageとして取得…

【iOS】ユーザーがスクリーンショットを撮ったタイミングを検知する

スクリーンショットを撮ったタイミングを検知するには.UIApplicationUserDidTakeScreenshotを使います。 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selec…

モバイル版GoogleAnalyticsでFirebaseを選ばない方法

最近はGoogleAnalyticsプロパティー作成時にモバイルアプリを選ぶとFirebase一択になりました。 今日はモバイルアプリでもFirebaseなしのGoogleAnalyticsを使う方法を書いてみます。 まずはウェブサイトとしてプロパティーを作成します。 続けてそのプロパテ…