Author Archives: makotton

iOSアプリ申請代行とApple Developer Program登録代行の対応範囲を拡大しました


株式会社プライムセオリーではiOSアプリ申請代行やApple Developer Program登録代行、商談同行サービスや技術顧問サービスなどの「iOSアプリ開発コンサルティング」サービスを展開しております。

iOSアプリ開発コンサルティング
http://submitapp.info/

従来のiOS申請代行やApple Developer Program登録代行に加え、ご要望の多かったVolume Purchase ProgramによるCustomB2Bアプリの申請代行とApple Developer Enterprise ProgramおよびiOS Developer University Programの登録代行も開始しております。この二つは情報が少なく、苦労する方も多いと思われ、弊社への相談件数も以前から多くありました。

アカウント登録や申請に関しての情報はネットからも収集できますが、信憑性に欠けるものや正しくても情報が古かったり様々なケースがあります。開発と異なり通常は何度も経験することではありませんし、場合によっては最初で最後かもしれないような専門的な作業になります。そこに時間も労力もつぎ込むのは得策ではありません。開発会社であってもアプリ専業でなければ路頭に迷うこともあるでしょう。

専業兼業含めアプリを受託開発している会社はたくさんありますが、この規模でここまで対応できる開発会社はそう多くないと思います。アプリ申請代行やアプリ開発コンサルティングなどアプリ開発の周辺サポートに関してはアプリ開発会社の中でも抜きん出ていると自負しております。

イレギュラーなことが多く発生するのがアプリ申請やデベロッパー登録です。このブログにもヒントはたくさんありますが、そこに書かれていないケースもたくさんありますので、路頭に迷う前にぜひ一度ご相談いただけると幸いです。

株式会社プライムセオリー
http://www.primetheory.jp/


UITextFieldのinputViewにUIPickerViewを設定し、ピッカー以外からの入力を受け付けないようにする方法


UITextFieldのinputViewにUIPickerViewを設定した状態でUITextFieldをリードオンリーにするとイベントを受け付けなくなってしまいピッカーが表示されません。テキストフィールドに対してピッカー以外からの入力を受け付けないようしたい場合はUITextFieldDelegateの

optional public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

を利用します。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return false
}

これで、UITextFieldをリードオンリーにしなくてもタップイベントを認識し、ピッカー以外からの入力を受け付けないようになりました。

キーボードあるいはピッカーからの入力を受け付けるテキストフィールドがある場合は、テキストフィールドにtagを設定し、パラメータのtextFieldのtagを調べて除外しましょう。


[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.


[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

iOS9.xで開発したプロジェクトをiOS10対応にする際、上記のエラーが出ました。フォトライブラリにアクセスしたタイミングでコケました。デバイスやセンシティブな情報にアクセスする際にユーザに確認を求めなければならないという決まりがありましたが、iOS10ではこれらのアクセス方法が変更になっています。

詳しくは、Information Property List Key Reference

今回の場合はフォトライブラリですので、エラーメッセージの指示通り、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	・・・
	<key>NSPhotoLibraryUsageDescription</key>
	<string>ここで選択した画像をアバターとして使用します</string>
	・・・
</dict>
</plist>

このように、Info.plistにキーと目的を設定すればOKです。ソースコード側の変更は不要です。


Nil is not compatible with expected argument type ‘UnsafePointer


Nil is not compatible with expected argument type ‘UnsafePointer

iOS9.x対応プロジェクトファイルをiOS10SDKでビルドした際にエラーになりました。

let path: CGMutablePath = CGMutablePath()
CGPathMoveToPoint(path, nil, 0, self.frame.size.height)
CGPathAddLineToPoint(path, nil, self.frame.size.width, self.frame.size.height)

CGMutablePath API リファレンス
CGMutablePath.xxxxxxxxメソッドを使え、とのことです。上記の例だと、

let path: CGMutablePath = CGMutablePath()
path.move(to: CGPoint(x: 0, y: self.frame.size.height))
path.addLine(to: CGPoint(x: self.frame.size.width, y: self.frame.size.height))

このように書き換えることで対応できました。


CakePHPで通常のPHPを動作させたい場合の設定


あたりまえですが、通常に配置したPHPファイルはCakePHPのルーティングに引っかかって意図した動作をしません。いつも忘れるので備忘録。

# vi app/.htaccess

appディレクトリ直下の.htaccessを開き、

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/targetfile
RewriteRule ^.*$ – [L]

上記の内容を、

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase    /
    RewriteCond    %{REQUEST_URI} ^/targetfile
    RewriteRule    ^.*$ - [L]

    RewriteEngine On
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>

このように、もとのRewriteRuleの前に挿入します。これで問題なくアクセス可能になります。なお、targetfileが対象のPHPファイル名ですので、ご自分の環境置き換えてください。


UINavigationBarのBackボタンをUIBarButtonItemでカスタマイズするとエッジスワイプジェスチャーが効かなくなる件の対処(Swift)


UINavigationBarのBackボタンに対してUIBarButtonItemを用いて独自に設定を行うとエッジスワイプジェスチャーが効かなくなりますが、以下の方法で有効にできます。

FirstViewController(遷移元)からSecondViewController(遷移先)をpush、SecondViewControllerにBackボタンがある構造を前提として、

class SecondViewController: UIViewController, UIGestureRecognizerDelegate {
	・・・
	override func viewDidLoad() {
	     super.viewDidLoad()
		・・・    
         self.navigationController.interactivePopGestureRecognizer.delegate = self        
		・・・    
	}
	・・・    
}

SecondViewControllerにデリゲートとしてUIGestureRecognizerDelegateを設定、viewDidLoadあたりでデリゲートインスタンスを設定します。これでOKです。


iOSシミュレータでLaunch Image(スプラッシュ画像)が反映されない場合の対処


XcodeにてLaunch Images Sourceの再設定、Launch Screen Fileの指定(あるいは指定なし)、アプリを削除してから再度ビルド→転送….これらの作業も行っても、どうしてもiOSシミュレータでLaunch Imageが表示されない、あるいは、以前のままになってしまう場合があります。そのようなときは、iOSシミュレータをリセットしてしまいましょう。


iOSシミュレータの[Simulator]->[Rest Content and Settings…]を選択し、

確認ダイアログにて[Reset]ボタンを押下し(転送済みのアプリが多い場合は少々時間がかかります)、リセットされたらビルド→転送。これでLaunch Imageは問題なく表示されるかと思います。


CakePHP3+MySQLにてConnection to database could not be established: SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: ‘****’


config/app.phpにてtimezoneを’Asia/Tokyo’に設定したところ、

Connection to database could not be established: SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

になりました。


CakePHP3の初期画面ではこの状態です。

MySQLコマンドラインからタイムゾーンテーブルを確認したところ、

mysql> select * from mysql.time_zone;
Empty set (0.00 sec)

ありません。

$ mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql -p******

mysql_tzinfo_to_sqlを用いてタイムゾーンテーブルをロードします。


これでOKになりました。


月額10万円からiOSアプリ開発が可能なサービス


月額10万円からiOSアプリ開発が可能なサービスを6/15より提供開始します。

請負契約ではなく月額課金の準委任契約にすることで、小さくはじめることでリスクを減らし、ゴールを決めておかないことで撤退もしやすくしました。一度にたくさんの予算を確保できない、プロジェクトを継続するか判断できない、専任を採用することまではできないけど専属のアプリ開発者を確保したい、などのご要望にマッチします。

詳細は以下をご覧ください。



月額10万円からのiOSアプリ開発
http://iphoneappdev.info/

発注者にも受注者にも優しい開発を提供いたします。ぜひご用命ください。


Amazon EC2にpyenv環境を構築する


以前書いた
MacOSXにbrewでpyenvをインストールする
pyenvでPythonの指定のバージョンをインストールする
と関連しますが、ここではOSXではなくEC2側にpyenv環境構築し、バージョンを切り替える方法を書いておきます。

■前提条件

・Amazon Linux
・2016/05/20現在の情報

■手順

(1) 依存ライブラリのインストール

$ sudo yum -y install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel
Loaded plugins: priorities, update-motd, upgrade-helper
Package 1:make-3.82-21.10.amzn1.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package bzip2-devel.x86_64 0:1.0.6-8.12.amzn1 will be installed
・・・
Dependency Installed:
  cpp48.x86_64 0:4.8.3-9.109.amzn1                            gcc48.x86_64 0:4.8.3-9.109.amzn1                         
  gcc48-c++.x86_64 0:4.8.3-9.109.amzn1                        glibc-devel.x86_64 0:2.17-106.167.amzn1                  
  glibc-headers.x86_64 0:2.17-106.167.amzn1                   kernel-headers.x86_64 0:4.4.10-22.54.amzn1               
  keyutils-libs-devel.x86_64 0:1.5.8-3.12.amzn1               krb5-devel.x86_64 0:1.13.2-12.40.amzn1                   
  libcom_err-devel.x86_64 0:1.42.12-4.40.amzn1                libgomp.x86_64 0:4.8.3-9.109.amzn1                       
  libmpc.x86_64 0:1.0.1-3.3.amzn1                             libselinux-devel.x86_64 0:2.1.10-3.22.amzn1              
  libsepol-devel.x86_64 0:2.1.7-3.12.amzn1                    libstdc++48-devel.x86_64 0:4.8.3-9.109.amzn1             
  libverto-devel.x86_64 0:0.2.5-4.9.amzn1                     mpfr.x86_64 0:3.1.1-4.14.amzn1                           
  ncurses-devel.x86_64 0:5.7-3.20090208.13.amzn1              perl-Error.noarch 1:0.17020-2.9.amzn1                    
  perl-Git.noarch 0:2.7.4-1.47.amzn1                          perl-TermReadKey.x86_64 0:2.30-20.9.amzn1                

Complete!

(2) pyenvのインストール

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Cloning into '/home/*******/.pyenv'...
remote: Counting objects: 12653, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 12653 (delta 2), reused 0 (delta 0), pack-reused 12639
Receiving objects: 100% (12653/12653), 2.25 MiB | 722.00 KiB/s, done.
Resolving deltas: 100% (8774/8774), done.
Checking connectivity... done.

(3) .bashrcの編集

$ vi ~/.bashrc
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi

上記を最後部に追加して保存。

$ source ~/.bashrc

.bashrcを反映させる。

(4) インストール可能なPythonバージョンの確認

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  ・・・
  3.3-dev
  3.3.1
  3.3.2
  3.3.3
  3.3.4
  3.3.5
  3.3.6
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.5.0
  3.5-dev
  3.5.1
  3.6.0a1
  3.6-dev
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
・・・

(5) 指定バージョンのPythonをインストール

$ pyenv install 3.4.4
Downloading Python-3.4.4.tgz...
-> https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz
Installing Python-3.4.4...
Installed Python-3.4.4 to /home/*******/.pyenv/versions/3.4.4

例として3.4.4をインストールします。

(6) pyenv-pip-rehashのインストール

$ git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash

ここまでで基本的な準備はOKです。

使用するPythonのバージョン指定は以下のように行います。

$ pyenv global 3.4.4

ここでは先ほどインストールした3.4.4を指定しています。ちなみに、システムにインストールされているPythonを指定する場合は、

$ pyenv global system

これでOKです。