ホーム » iOS
「iOS」カテゴリーアーカイブ
iOSカメラ関連
Quiita
AVFoundationを使ったカメラの実装:画面タップでフォーカス当てる実装
【Swift】UIImageViewに表示された画像を端末に保存しよ
【iOS】【swift】アルバムへの保存 UIImageWriteToSavedPhotosAlbum
Swiftで OpenCV の ArUco モジュールを使う
stackoverflow
UIImagePNGRepresentation() has been replaced by .pngdata()
” rel=”noopener” target=”_blank”>How to add autofocus to AVCaptureSession? SWIFT
iOS アプリ開発
[iPhone] Camera撮影, AVCapturePhotoOutput
[iPhone] AVCaptureVideoDataOutput ビデオで静止画撮影する
[iPhone] AVCaptureVideoDataOutput ビデオで静止画撮影する
その他
[iOS] AVFoundation(AVCaptureVideoDataOutput)で連写カメラを作ってみた
【Swift4】UIViewをUIImageに変換し、画像としてカメラロールに保存する方法
Swiftで OpenCV の ArUco モジュールを使う
OpenCV 3.2 を Swift のプロジェクトで使って簡単な画像処理をしてみよう!
SwiftでOpenCVを利用して顔認識する(AVFoundationの例)
AVFoundation+OpenCVで矩形検出(「名刺撮影用カメラ」みたいなやつ作ってみました)
[iPhone] UIImagePickerController による Camera撮影
https://stackoverrun.com/ja/q/10898780
SwiftでOpenCVを使ってみる
xcodeで簡単なProjectを作成してOpenCVを使ってみる
Project「test」を作成してwork/ios/opencv2.frameworkフォルダをxcodeのプロジェクトの直下にドラッグドロップ。
Frameworksの追加ボタンよりlibc++.tbdを追加
※必ず「Frameworks,Libraries、and Embedded Content」の画面に表示されるまで追加
ViewController.swiftに以下を記述
[code]
import UIKit
import opencv2
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let mat = Mat()
}
[/code]
実行してみてエラーが発生しないことを確認
SwiftでOpenCVを使用するためにOpenCVのFrameworkをbuild
OepnCVをSwiftから使用するにはObjective-cのラッパーを作成する必要があり2度手間で面倒くさい。
以下のサイトにSwiftから直接呼ぶ方法が記載されていたので確認しながら試してみる。
OpenCV が Objective-C / Swift で使えるようになります & 使ってみた
Xcodeを起動して「preferences」の画面を開きCommand Line Toolsが未選択ならば選択する。
未設定
設定済み
Swift、Python、cmake、Xcodeのtoolのバージョンを確認
[code]
swift –version
Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1)
Target: x86_64-apple-darwin19.6.0
cmake –version
zsh: command not found: cmake
python –version
Python 2.7.16
xcode-select –version
xcode-select version 2373.
[/code]
cmakeがインストールされていないため、いったんbrewをインストール
Homebrewのサイトに記載されているコマンドを実行してHomebrewをインストール
[code]
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
[/code]
brewのインストールが完了したらcmakeのインストール
[code]
brew install cmake
[/code]
インストールが完了したらバージョンを確認
[code]
cmake –version
cmake version 3.18.2
[/code]
githubよりopencvのリポジトリをclone
[code]
cd Documents/prjs/opencv/git
git clone https://github.com/opencv/opencv.git
[/code]
opencvのbuild先となる作業用フォルダを作成
[code]
mkdir work
cd work
[/code]
opencv/platforms/ios/build_framework.pyスクリプトを実行
[code]
/Users/hideo/Documents/prjs/opencv/git2/opencv/platforms/ios/build_framework.py ios
[/code]
buildが正しく終了したらworkフォルダ直下のiosフォルダに以下のフォルダが作成される
[code]
build
opencv2.framework
samples
[/code]
opencv2.frameworkが使用するopencvのframework
iPhoneのViewの座標が違う
iPhoneX未満の機種ではViewのY座標は64。
※緑がView
iPhoneX、11ではViewのY座標は88
64では頭が切れる
88で丁度よい
MapBox SDK を iOS Objective-C から使用
最初にmapboxのサイトでアカウントを作成しログイン
MapBox SDKのページを開く
https://docs.mapbox.com/ios/maps/overview/
インストールボタンをクリック
ダウンロードボタンをクリック
mapbox-ios-sdk-5.4.0-dynamic.zipをダウンロード
XCODEを起動してSingle View Appのプロジェクトを作成
ダウンロードしたmapbox-ios-sdk-5.4.0-dynamic.zipを展開し中のMapbox.frameworkをEmbedded Binariesにドラッグして参照を追加
TARGETSのBuild Phases画面を開き、+(追加)ボタンを押す
Run Scriptを追加しMapboxのサイトに従い設定
info.listにMGLMapboxAccessTokenを追加しキーを入力
ViewController.mを編集
[code]
#import "ViewController.h"
@import Mapbox;
@interface ViewController () <MGLMapViewDelegate>
@property (nonatomic) MGLMapView *mapView;
@end
[/code]
地図を表示
ViewControllerのviewDidLoadを以下に従って編集
[code]
– (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"mapbox://styles/mapbox/streets-v11"];
self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds styleURL:url];
self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(35.73353,139.712118)
zoomLevel:12
animated:NO];
self.mapView.delegate = self;
[self.view addSubview:self.mapView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(offlinePackProgressDidChange:) name:MGLOfflinePackProgressChangedNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(offlinePackDidReceiveError:) name:MGLOfflinePackErrorNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(offlinePackDidReceiveMaximumAllowedMapboxTiles:) name:MGLOfflinePackMaximumMapboxTilesReachedNotification object:nil];
}
[/code]
池袋を中心に地図を表示
デフォルトのAnnotationを表示
[code]
– (void)mapViewDidFinishLoadingMap:(MGLMapView *)mapView {
MGLPointAnnotation *hello = [[MGLPointAnnotation alloc] init];
hello.coordinate = CLLocationCoordinate2DMake(35.73353,139.712118);
hello.title = @"カーネル";
hello.subtitle = @"Welcome to my marker";
[mapView addAnnotation:hello];
}
– (MGLAnnotationImage *)mapView:(MGLMapView *)mapView viewForAnnotation:(id <MGLAnnotation>)annotation {
return nil;
}
– (BOOL)mapView:(MGLMapView *)mapView annotationCanShowCallout:(id <MGLAnnotation>)annotation {
return NO;
}
[/code]
関数:annotationCanShowCalloutの戻り値にYESを返すとAnnotationをクリックするとTooltipを表示する
デフォルトのAnnotationではなくMGLAnnotationViewを使ってカスタムAnnotationを表示
viewForAnnotationでnilではなく、MGLAnnotationViewを返す
[code]
– (MGLAnnotationImage *)mapView:(MGLMapView *)mapView viewForAnnotation:(id <MGLAnnotation>)annotation {
// 100はannotationを区別するキー。テストなので固定
MGLAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"100"];
if (!annotationView) {
annotationView = [[MGLAnnotationView alloc] initWithReuseIdentifier:@"100"];
annotationView.frame = CGRectMake(0, 0, 30, 30);
annotationView.layer.cornerRadius = annotationView.frame.size.width / 2;
annotationView.layer.borderColor = [UIColor whiteColor].CGColor;
annotationView.layer.borderWidth = 4.0;
annotationView.backgroundColor = [UIColor colorWithRed:0.03 green:0.80 blue:0.69 alpha:1.0];
}
return annotationView;
}
[/code]
MGLAnnotationViewを選択するとdidSelectAnnotationViewイベントが発生する
[code]
– (void)mapView:(MGLMapView *)mapView didSelectAnnotationView:(MGLAnnotationView *)annotationView {
NSLog(@"didSelectAnnotationView");
}
[/code]
Annotationに画像を表示
viewForAnnotationではnilを返すように戻し、imageForAnnotationでMGLAnnotationImageを返すように変更
[code]
– (MGLAnnotationImage *)mapView:(MGLMapView *)mapView viewForAnnotation:(id <MGLAnnotation>)annotation {
return nil;
}
– (MGLAnnotationImage *)mapView:(MGLMapView *)mapView imageForAnnotation:(id <MGLAnnotation>)annotation {
MGLAnnotationImage *annotationImage = [mapView dequeueReusableAnnotationImageWithIdentifier:@"100"];
if (!annotationImage) {
UIImage *image = [UIImage imageNamed:@"place8.png"];
image = [image imageWithAlignmentRectInsets:UIEdgeInsetsMake(0, 0, image.size.height/2, 0)];
annotationImage = [MGLAnnotationImage annotationImageWithImage:image reuseIdentifier:@"100"];
}
return annotationImage;
}
[/code]
背景を国土地理院のタイル(ラスタ)に変更
baseman.jsonを作成(ファイル名は任意)
このファイルの内容はmapbox-gl-native for ios で地理院地図を表示してみるのそのまんまです
[code]
{
"version": 8,
"name": "Raster Tiles",
"sources": {
"gsiStd": {
"type": "raster",
"tiles": [
"http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png"
],
"tileSize": 256
}
},
"layers": [{
"id": "gsiStd",
"type": "raster",
"source": "gsiStd",
"paint": {
"raster-fade-duration": 100
}
}]
}
[/code]
baseman.jsonをプロジェクトに追加
MGLMapViewのコンストラクタに渡すstyleURLを変更
[code]
– (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"basemap" withExtension:@"json"];
self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds styleURL:url];
self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(35.73353,139.712118)
zoomLevel:12
animated:NO];
self.mapView.delegate = self;
[self.view addSubview:self.mapView];
以下省略
}
[/code]
iOSのMKMapViewでタイル表示
iOSのMKMapViewでApple Mapではなく他のタイルサーバー(OSM)を使用するにはMKMapViewのオーバーレイ機能を使用する。
[code]
MKMapView *mv = [[[MKMapView alloc]initWithFrame:rect]autorelease];
[mv setMapType:MKMapTypeStandard];
[mv setDelegate:self];
NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template];
overlay.canReplaceMapContent = YES;
[mv addOverlay:overlay level:MKOverlayLevelAboveLabels];
[/code]
[code]
– (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
if ([overlay isKindOfClass:[MKTileOverlay class]]) {
return [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
}
return nil;
}
[/code]
iOS アプリをAdHocでインストール
Xcodeのバージョンが10.1になったのであらためてiOSアプリの作成からAdHocでインストールするまでをおさらい!
最初にXcodeでSingle View Appを作成
最近はXcodeが勝手に証明書関連を設定してくれるが、なぜかうまくいかなかったので手動で設定する
Apple DeveloperにログインしてProductionの証明書を確認
証明書はXcodeのPreferencesをクリックしてして表示される画面の左下+ボタンで作成可能
App IDを作成
DeviceにAdHocでインストールしてするデバイスを追加
AdHocで使用するProvisioning Profilesを作成
以上でçの作成は終了
XcodeのPreferencesからAppleIDの画面を表示して「Download Manual Profiles」ボタンを押してAdHoc用のProvisioning Profilesをダウンロード(していると思う・・・)
xcodeを開いてSigningのチェックを外しProvisioning Profilesに作成したAdHocを指定する
これからAdHoc用のコンパイルを開始するが、その前にProductメニューのDestinationをGeneric iOS Deviceに設定。この設定をしないとProductメニューのArciveが有効にならない。
ProductメニューのArciveを実行
「Distribute App」ボタンをクリック
AdHocを選択
optionを指定
証明書とProvisioning Profilesを指定
Exportボタンを押してipaファイルの出力先を指定。
iPhoneにインストール
iTunesを起動してiPhoneを接続
iPaをiTunesの左パネルの自分のデバイス上にドラッグしてインストール
ちなみにiTunes 12.7.3.64では正しくインストールできたが、12.8.2.3ではドラッグできなかった?
SeedCollectorをiOS9に対応(2)
HTTP通信の許可設定
iPad上で通信時に以下のエラーが発生
[code]
App Transport Security has blocked a cleartext HTTP (http://) resource load
since it is insecure.
[/code]
iOS9よりHTTPで通信するにはATSを無効にするか、例外対象のドメインを設定する必要がある。
(1)例外対象のドメインを設定
info.plistのキー「App Transport Security Settings」に「Exception Domains」以下を追加
※設定したがなぜか正しく機能しない
(2)ATSを無効にする
info.plistのキー「App Transport Security Settings」に「Allow Arbitrary Loads」を追加しYESに設定
こちらは期待通りに機能した
カメラ利用の設定
カメラ利用時にエラーが発生し、以下のログを出力
カメラを使用するアプリはinfo.plistに記載
これでカメラ使用時に確認メッセージが表示される。
カメラの変更
iOS7対応時にカメラをUImagePickerControllerに変更しViewControllerとして使用していたが、正しく画像が保存されていなかった。
よってpopoverで表示するように変更。
変更前
[code]
//———————————————————————-
// 写真撮影View表示
//———————————————————————-
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
showing_modal = YES;
if(ip2){
[ip2 release];
}
ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
ip2.imagepicker = imagepicker;
[ip2 setDelegate:self];
//[self showPopOver: ip2.imagepicker AnchorButton:button];
[CmnLib showViewController:self Child:ip2.imagepicker];
}
}
[/code]
変更後
[code]
//———————————————————————-
// 写真撮影View表示
//———————————————————————-
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
showing_modal = YES;
if(ip2){
[ip2 release];
}
ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
ip2.imagepicker = imagepicker;
[ip2 setDelegate:self];
[self showPopOver: ip2.imagepicker AnchorButton:button];
//[CmnLib showViewController:self Child:ip2.imagepicker];
}
}
[/code]
以上を「201707appstore更新SeedCollector」の候補として検証を開始
SeeddCollectorをiOS9に対応(1)
株式会社カーネルが提供しているアプリ SeedCollectorは前回に対応してAppStore上でリリース。
今回はiOS10及びiOS9に対応してAppStoreにアップする。
更新対象は201407にリリースしたモジュール。「201407_開発者ライセンス更新_app_store_更新」
予めOSとXcodeは以下のバージョンにアップデート
Xcodeを起動すると証明書エラーが表示された。
最近はProvisioning ProfilesなどはXcodeで自動作成するが、その設定がされていない。
※逆にProvisioning Profilesをサイトで作成してXcodeにインポートする方法がよくわからない。
「Automatically manage signing」チェックをONにする。
変更前
変更後
確認メッセージに同意すると署名の対象を選択可能となるとので今回はTeamを指定。
以下に従って署名等を設定。
上記でエラーが発生しなくなったのでエミュレーターで実行。
するとスプラッシュ画面が間延びして表示されたのでLunchImageの設定
images.xcassetsを選択すると確かにLunchImageが設定されていない。(LunchImage-2はよく分からない)
1Xには768×1024のイメージを2Xには1536×2048のイメージを設定(ドラッグドロップ)
SeedCollectorは縦方向での利用のみを対象とするのでPortraitのみを設定
Lunch Image Sourceは「LunchImage」と「LunchImage-2」から選択が可能なので設定した「LunchImage」を選択。
以上でSplashが正しく設定されたので再度エミュレータで起動すると今度は起動時にハングアップしログに「Application windows are expected to have a root view controller at the end of application launch」が出力されている。
アプリ起動時に呼ばれる関数「didFinishLaunchingWithOptions」でself.window.rootViewControllerが設定されていないのが原因なのでいかに従って修正。
[code]
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
省略
navi = [[UINavigationController alloc]initWithRootViewController:splash];
self.window.rootViewController = navi;
省略
}
[/code]
※iOS9でアプリが起動直後にクラッシュする場合の回避方法を参考とする
iTunes Connect
最近、iTunes Connectを開いていなかったので久しぶりに開くと
契約に関するお知らせが表示された。
The updated Apple Developer Program License Agreement needs to be reviewed.
In order to update your existing apps and submit new apps to the App Store, the user with the Legal role (Team Agent) must review and accept the updated agreement in their account on the developer website.
updated agreementをクリックして表示
Review Agreementをクリック
同意して終了