AppStoreのレビューページのリンク

idの後ろの番号はアプリのidです。AppStoreの該当アプリのリンクを見れば確認できます。

旧(iOS10まで)
@”itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=784484932″;

新(iOS11から)
@”https://itunes.apple.com/jp/app/id784484932?mt=8&action=write-review”

現在一番上にあるViewControllerを取得する。

現在一番上にあるViewControllerを取得します。
iOS9で非推奨になった「UIAlertView」を「UIAlertController」に切り替える時に使いました。

UIViewController *vCon = [UIApplication sharedApplication].keyWindow.rootViewController;

while (vCon.presentedViewController) {
      vCon = vCon.presentedViewController;
 }

iOS9以降でhttp通信をする

iOS9からはhttp通信が拒否されるようになりました。

自前のサーバーに接続するならhttps通信に切り替えれば良いのですが、外部のサイトにアクセスする場合はどうしてもhttp通信が必要になる場面があります。

その場合は、例外としてhttp通信してもよいサイトを登録します。

1.hogehoge.plist内にApp Transport Security Settings:Dictionaryを作る
2.App Transport Security Settings内にException Domains:Dictonaryを作る
3.Exception Domains内にwww.hoge.jp(許可するサイト):Booleanを作り、YESにする

アクセスするサイト分だけこれを登録しておきます。

その部分をテキストエディタで見るとこうなります。

<key>NSAppTransportSecurity</key>
 <dict>
 <key>NSExceptionDomains</key>
  <dict>
  <key>www.hoge.jp</key>
  <dict>
   <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
   <true/>
  </dict>
 </dict>
</dict>

Xcode8でコンパイルしたバイナリについて

フォトライブラリー・ブルートゥース・カレンダー・カメラへアクセスする場合は以下のものがinfo.plist内に必要。

あらかじめ許可が取れてる場合(旧バージョンで許可をとってる場合)はXcodeから直接実機にインストールすれば動くけど、アップロードした時にInvalid binaryで弾かれる。

NSPhotoLibraryUsageDescription
NSBluetoothPeripheralUsageDescription
NSCalendarsUsageDescription
NSContactsUsageDescription
NSCameraUsageDescription

使う時に(ロケーションのように)許可を取りに行く必要はないみたい。

NSContactsUsageDescriptionなしで連絡先に、NSCalendarsUsageDescriptionなしでカレンダーにアクセスするXcodeから直接起動した場合でもアプリが落ちる。

iOSのアプリ内のファイル保存のURLについて

アプリ内では以下の様にしてDocumentsディレクトリを取得する。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

具体的には
/var/mobile/Containers/Data/Application/B9B66EA6-051F-450C-81BC-BDA96675290E/Documents/photos/20160901_221957.mov

などとなるのだけれど、B9B66EA6…の部分は起動毎に変わる。
なので、絶対パスを保持して使おうとすると失敗する。

statusBar、navigationBar、tabBarの高さを取得

ステータスバーの高さ
float
statusbarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

ナビゲーションバーの高さ
float
navigationbarHeight = self.navigationController.navigationBar.frame.size.height;

タブバーの高さ
float tabbarHeight = tabBarController.tabBar.frame.size.height;