Author Archive

iOSアプリ プライバシーマニフェスト対応について

先日iOSアプリをApp Store Connectへアップロードした際に以下のようなメールが届きました。

ITMS-91053: Missing API declaration – Your app’s code in the “アプリ名” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code.

内容としてはApp Storeへの提出におけるプライバシー要件のアップデート(https://developer.apple.com/jp/news/?id=3d8a9yyhに関連したもので、以下のような感じです。

  • 承認される理由が必要なAPIを使用しているが、プライバシーマニフェストに理由が含まれていない
  • 今は大丈夫だが、2024年5月1日以降は新しいアプリまたはアプリの更新をアップロードする際にプライバシーマニフェストへの定義が必須になる

当然今後も継続的にアプリ更新などは行っていく予定であるため、今のうちに対応を行っておくことにしました。

行った対応

1.Xcodeでプライバシーマニフェストファイルを追加

new fileApp Privacy を選択し、Next


Targetsの必要なものにチェックを入れ、Create

2.追加したPrivacyInfo.xcprivacyにAPIの使用理由を入力

今回はメール内容にもあるように「NSPrivacyAccessedAPICategoryUserDefaults」に関して指摘されていたので、その分を入力しました。
※入力内容についてはAppleのドキュメントを参考にしています

<実際に入力した内容>

3.上記対応を行ったバージョンのアプリをApp Store Connectへアップロードして冒頭のようなメールが届くかを確認

結果

今のところ上記の対応だけでメールは届かなくなりました。
ただ、サードパーティ製のSDKにもプライバシーマニフェストが必要とのことなので、もしかすると5月1日以降アップロードした際にまた何かしらの対応が必要になってくるかもしれません。
その際は改めて対応内容などをここで紹介できればと思います。

Facebooktwitterlinkedintumblrmail

Updraft Betaでフィードバックしてみた

先日事前登録をしていた「Updraft」のベータ版が公開されたとのことなので、早速利用してみました。

Updraftって?

レビューからのカイゼンサイクルを超高速化できるフィードバックツールです。(http://www.getupdraft.ioより引用)

利用手順

1.UpdraftのウェブサイトまたはiOSアプリで登録作業を行います。

【ウェブサイト】http://www.getupdraft.io/
【iOSアプリ】https://itunes.apple.com/app/id1099018975

私はUpdraftのサイトで登録を行いました。
ここではGitHubのアカウントでサインアップする必要があるようです。

Screen Shot 2016-04-21 at 10.56.14

2.Updraftのウェブサイト上でプロジェクトを作成します。

プロジェクトタイプ(現在はWEBのみのようです)、Gitリポジトリ、サイト名、プロジェクトメンバーを登録します。
現時点では「Updraftへの登録が済んでいるGitHub organizationのメンバー」のみ招待可能となっているようです。

Screen Shot 2016-04-21 at 11.19.35

3.Updraftアプリから、フィードバックを行います。

UpdraftのiOSアプリでサインアップすると、参加しているプロジェクトの一覧が表示されるので「start」ボタンをタップしてレビューを開始します。
ここでフィードバックした内容はスクリーンショット付きでGitHubにissueとして投稿されるようです。
また、フィードバック内容はUpdraftのウェブサイトやiOSアプリ内でも確認できました。

IMG_1223

感想

レビュアーにとっては「スクリーンショットを撮って、チャットやメールで開発者に連絡して-」といった作業が省略されますし、開発者にとっても「フィードバックの内容をissueに登録して-」といった作業が不要になるので色々と捗るのではないかと思います。
また、今後iOSアプリやAndroidアプリについても対応する予定とのことですので期待して待ちたいと思います。

Facebooktwitterlinkedintumblrmail

iOSのクラッシュログにシンボル情報を追加する

Appleの審査でリジェクトされた際に、「.clash」や「.ips」といった形でクラッシュログが添付されていることがあります。
中身を確認すると以下のような内容になっていますが、このままだとコードのどの部分でクラッシュしたのかが分かりません。

〜一部抜粋〜
Thread 5 Crashed:
1  CoreFoundation                   0x24936b62 0x24831000 + 135152
2  Foundation                       0x255e49f5 0x25575000 + 21531
3  SampleApp                        0x000341d2 0xb000 + 55521
4  libdispatch.dylib                0x32a107b6 0x32a0f000 + 1235

そこで、「symbolicatecrash」というツールを利用してログにシンボル情報を追加することで、クラッシュ箇所を特定出来るようにします。

必要なファイル

  • クラッシュログファイル
  • appファイル
  • dSYMファイル

appファイル及びdSYMファイルはクラッシュログを出力したものと同じものを使う必要があります。
私は以下の方法で取得しました。

  1. XcodeのOrganizerを開く
  2. 該当ビルド上で右クリックし、「Show In Finder」を選択
  3. Finderで選択されているファイル上で右クリックし、「パッケージの内容を表示」を選択
  4. 「dSYMs」ディレクトリ内に「.app.dSYM」が「Products/Applications」内に「.app」があります

symbolicatecrashの実行

実行環境
・OS X 10.9.5
・Xcode6.1

「symbolicatecrash」は私の環境では以下のパスにありました。

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

長過ぎるのでシンボリックリンクやエイリアスを作成しておくと便利です。

あとは下記コマンドを実行する事で、クラッシュログにシンボル情報を追加したログファイルを作成できます。

    # このコマンドを実行しないと「Error: "DEVELOPER_DIR" is not defined at symbolicatecrash line 60.」といったエラーメッセージが表示されます。
    export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"

    symbolicatecrash クラッシュログファイル dSYMファイル appファイル > crash.log

作成されたcrash.logを確認してみるとシンボル情報が追加され、 SampleController.m の121行目辺りが怪しいことが分かるようになりました。

〜一部抜粋〜
Thread 5 Crashed:
1  CoreFoundation                   0x24936b62 +[NSException raise:format:] + 108
2  Foundation                       0x255e49f5 +[NSJSONSerialization JSONObjectWithData:options:error:] + 62
3  SampleApp                        0x000341d2 __35-[SampleController startSample:] (SampleController.m:121)
4  libdispatch.dylib                0x32a107b6 _dispatch_call_block_and_release + 8
Facebooktwitterlinkedintumblrmail

iOSでプッシュ通知時の挙動を確認したい

今回はiOSアプリを開発している際にプッシュ通知時の挙動を確認したい時に使えそうな「houston」というライブラリを紹介したいと思います。

nomad/houston

1. インストール

gem install houston

2. 送信用のrubyファイルを用意

ほぼREADMEにあったサンプルの通りのものです。
また、事前に開発用の「push_dev.pem」を同じディレクトリに置いています。

push.ruby

require 'houston'

# Environment variables are automatically read, or can be overridden by any specified options. You can also
# conveniently use `Houston::Client.development` or `Houston::Client.production`.
APN = Houston::Client.development
APN.certificate = File.read("push_dev.pem")

# An example of the token sent back when a device registers for notifications
token = "<《ここにプッシュ通知を送信したい端末のデバイストークンを指定します》>"

# Create a notification that alerts a message to the user, plays a sound, and sets the badge on the app
notification = Houston::Notification.new(device: token)
notification.alert = "ハロー, ワールド!"

# Notifications can also change the badge count, have a custom sound, have a category identifier, indicate available Newsstand content, or pass along arbitrary data.
notification.badge = 1
notification.sound = "sosumi.aiff"
notification.category = "INVITE_CATEGORY"
notification.content_available = true
notification.custom_data = {foo: "bar"}

# And... sent! That's all it takes.
APN.push(notification)

3. push通知を送信

ruby push.ruby

以上で、指定した端末にプッシュ通知が飛びます。
READMEにはデバイストークンの取得方法や証明書の作成方法なども載っておりすごく分かりやすいです。
この他にもコマンドラインからプッシュ通知を送信することが出来るようです。

apn push "<デバイストークン>" -c /path/to/apple_push_notification.pem -m "Hello from the command line!"
Facebooktwitterlinkedintumblrmail

一つのVagrantfileで複数VMを管理する際のメモ

下記のようなVagrantfileで複数VMを管理している際に「vagrant halt」を行うと…

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.define :first do |first|
    first.vm.box = "centos6.5.3"
    first.vm.network :forwarded_port, guest: 80, host: 8080
    first.vm.network :private_network, ip: "192.168.33.10"
  end
  
  config.vm.define :second do |second|
    second.vm.box = "centos6.5.3"
    second.vm.network :forwarded_port, guest: 80, host: 8181
    second.vm.network :private_network, ip: "192.168.33.11"
  end
end

2つとも停止します。

~/w/vagrantTest ❯❯❯ vagrant halt
 second: Attempting graceful shutdown of VM...
 first: Attempting graceful shutdown of VM...

片方だけ停止したい場合には「vagrant halt first」のように引数にマシン名を指定すれば良いのですが
停止したくないマシンまで誤って停止させるのを避けたかったので、何か良い方法はないか調べました。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  if ARGV[1] == "first" # 追加
  config.vm.define :first do |first|
    first.vm.box = "centos6.5.3"
    first.vm.network :forwarded_port, guest: 80, host: 8080
    first.vm.network :private_network, ip: "192.168.33.10"
  end
  end # 追加
  if ARGV[1] == "second" # 追加
  config.vm.define :second do |second|
    second.vm.box = "centos6.5.3"
    second.vm.network :forwarded_port, guest: 80, host: 8181
    second.vm.network :private_network, ip: "192.168.33.11"
  end
  end # 追加
end

このようにすると「vagrant halt」だけでは停止しなくなり、マシン名を指定することで停止出来るようになります。

Facebooktwitterlinkedintumblrmail