Author Archive
iOSアプリ プライバシーマニフェスト対応について
- 2024/04/23
- haraguchi
先日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 file で App Privacy を選択し、Next
2.追加したPrivacyInfo.xcprivacyにAPIの使用理由を入力
今回はメール内容にもあるように「NSPrivacyAccessedAPICategoryUserDefaults」に関して指摘されていたので、その分を入力しました。
※入力内容についてはAppleのドキュメントを参考にしています
3.上記対応を行ったバージョンのアプリをApp Store Connectへアップロードして冒頭のようなメールが届くかを確認
結果
今のところ上記の対応だけでメールは届かなくなりました。
ただ、サードパーティ製のSDKにもプライバシーマニフェストが必要とのことなので、もしかすると5月1日以降アップロードした際にまた何かしらの対応が必要になってくるかもしれません。
その際は改めて対応内容などをここで紹介できればと思います。
Updraft Betaでフィードバックしてみた
- 2016/04/21
- haraguchi
先日事前登録をしていた「Updraft」のベータ版が公開されたとのことなので、早速利用してみました。
Updraftって?
レビューからのカイゼンサイクルを超高速化できるフィードバックツールです。(http://www.getupdraft.ioより引用)
利用手順
1.UpdraftのウェブサイトまたはiOSアプリで登録作業を行います。
【ウェブサイト】http://www.getupdraft.io/
【iOSアプリ】https://itunes.apple.com/app/id1099018975
私はUpdraftのサイトで登録を行いました。
ここではGitHubのアカウントでサインアップする必要があるようです。
2.Updraftのウェブサイト上でプロジェクトを作成します。
プロジェクトタイプ(現在はWEBのみのようです)、Gitリポジトリ、サイト名、プロジェクトメンバーを登録します。
現時点では「Updraftへの登録が済んでいるGitHub organizationのメンバー」のみ招待可能となっているようです。
3.Updraftアプリから、フィードバックを行います。
UpdraftのiOSアプリでサインアップすると、参加しているプロジェクトの一覧が表示されるので「start」ボタンをタップしてレビューを開始します。
ここでフィードバックした内容はスクリーンショット付きでGitHubにissueとして投稿されるようです。
また、フィードバック内容はUpdraftのウェブサイトやiOSアプリ内でも確認できました。
感想
レビュアーにとっては「スクリーンショットを撮って、チャットやメールで開発者に連絡して-」といった作業が省略されますし、開発者にとっても「フィードバックの内容をissueに登録して-」といった作業が不要になるので色々と捗るのではないかと思います。
また、今後iOSアプリやAndroidアプリについても対応する予定とのことですので期待して待ちたいと思います。
iOSのクラッシュログにシンボル情報を追加する
- 2015/02/06
- haraguchi
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ファイルはクラッシュログを出力したものと同じものを使う必要があります。
私は以下の方法で取得しました。
- XcodeのOrganizerを開く
- 該当ビルド上で右クリックし、「Show In Finder」を選択
- Finderで選択されているファイル上で右クリックし、「パッケージの内容を表示」を選択
- 「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
iOSでプッシュ通知時の挙動を確認したい
- 2014/11/30
- haraguchi
- push Notification
今回はiOSアプリを開発している際にプッシュ通知時の挙動を確認したい時に使えそうな「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!"
一つの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」だけでは停止しなくなり、マシン名を指定することで停止出来るようになります。