ホーム » iOS

iOS」カテゴリーアーカイブ

iOSカメラ関連

Swift Docs

Quiita

UIView の画面キャプチャを png で保存する

AVCaptureVideoDataOutputの使い方

AVFoundationを使ったカメラの実装:画面タップでフォーカス当てる実装

【Swift】UIImageViewに表示された画像を端末に保存しよ

【iOS】【swift】アルバムへの保存 UIImageWriteToSavedPhotosAlbum

iOSでOpenCVを触る

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とSwiftで耳検出のアプリを作る

OpenCV 3.2 を Swift のプロジェクトで使って簡単な画像処理をしてみよう!

「顔以外」のものを画像認識する on iOS

SwiftでOpenCVを利用して顔認識する(AVFoundationの例)

SwiftでOpenCVを使ってみた

Swiftで画像認識カメラ作るためのリサーチメモ

AVFoundation+OpenCVで矩形検出(「名刺撮影用カメラ」みたいなやつ作ってみました)

[iPhone] UIImagePickerController による Camera撮影

AVCaptureVideoDataOutputの使い方

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に設定

こちらは期待通りに機能した

iOS9でHTTP通信ができない時の解決法を参考

カメラ利用の設定

カメラ利用時にエラーが発生し、以下のログを出力

カメラを使用するアプリは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をクリック

同意して終了