Tag Archives: iOS SDK

Unityでメールを送信するアプリがiOSで動かない問題

0
Filed under Unity
Tagged as ,

Unityで作ったアプリでメールを送信するコードを書き、Unity Editor上では動いているのだが、iOSでは送信されない、という問題が発生しました。
(検証バージョン Unity 5.6.4p1)

前エントリではAndroidの不具合でしたが、iOSではまた色々と対応が必要でしたので、下記にまとめます。

.NET 2.0にする

これはAndroidでの対応と同じですが、Player Settings内にある、Configurationの、Api Compatibility Levelを「.NET 2.0 subset」となっている場合「.NET 2.0」にします。

Unity Player Settings Configuration .net 2.0 subset

link.xml

Assets/以下にあるlink.xmlを修正します。使用しているライブラリと一緒に作成されているケースもありますが、無ければ作成します。
※参考ページ

<linker>
<assembly fullname="System">
<type fullname="System.Net.Configuration.MailSettingsSectionGroup" preserve="all"/>
<type fullname="System.Net.Configuration.SmtpSection" preserve="all"/>
<type fullname="System.Net.Configuration.SmtpNetworkElement" preserve="all"/>
</assembly>
</linker>

既にある場合は、同様のノードに追加します。

追加Frameworkの指定手順

XcodeでビルドするときにFrameworkの追加設定が必要なことがあります。
Assets/Editor/PostBuildProcess.cs というファイルを作ります(ファイル名は任意ですが、パスはEditor以下である必要があります)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
 
public class PostBuildProcess {
 
	[PostProcessBuild(100)]
	public static void OnPostProcessBuild(BuildTarget target, string path)
	{
		if (target == BuildTarget.iOS)
		{
			PostProcessBuild_iOS (path);
		}
	}
 
	private static void PostProcessBuild_iOS( string path ){
		string projectPath = PBXProject.GetPBXProjectPath(path);
		PBXProject pbxProject = new PBXProject();
 
		pbxProject.ReadFromString(File.ReadAllText(projectPath));
		string target = pbxProject.TargetGuidByName("Unity-iPhone");
 
		pbxProject.AddFrameworkToProject(target, "AssetsLibrary.framework", false);
		pbxProject.AddFrameworkToProject(target, "MessageUI.framework", false);
		pbxProject.AddFrameworkToProject(target, "Accounts.framework", false);
		pbxProject.AddFrameworkToProject(target, "Social.framework", false);
		pbxProject.AddFrameworkToProject(target, "AddressBook.framework", false);
		pbxProject.AddFrameworkToProject(target, "AddressBookUI.framework", false);
 
		File.WriteAllText(projectPath, pbxProject.WriteToString());
	}
}

別の用途にも使えるので、覚え書きです。

Vuforiaでカメラのフォーカスがきかない場合

0
Filed under Unity
Tagged as , , ,

Vuforiaでカメラを作って、実機で動作させてみたら、カメラのフォーカスが合わない問題が発生しました。
自分の場合では、iPhone用に同じコードをビルドしても問題ないのに、Android用に書き出したら問題が出てきました。
調べてみたところ、下記ページに解決策が載っていました。
https://developer.vuforia.com/forum/unity-extension-technical-discussion/camera-focus-mode-android-unity
ARCameraの設定時にフォーカスモードを設定させる、というものなのですが、具体的にスクリプトまで配布されていて、これをARCameraにアタッチすれば解決する、というものです。
CameraFocusController.zip

using UnityEngine;
using System.Collections;
using Vuforia;
 
public class CameraFocusController : MonoBehaviour {
 
    private bool mVuforiaStarted = false;
 
    void Start () 
    {
        VuforiaARController vuforia = VuforiaARController.Instance;
 
        if (vuforia != null)
            vuforia.RegisterVuforiaStartedCallback(StartAfterVuforia);
    }
 
    private void StartAfterVuforia()
    {
        mVuforiaStarted = true;
        SetAutofocus();
    }
 
    void OnApplicationPause(bool pause)
    {
        if (!pause)
        {
            // App resumed
            if (mVuforiaStarted)
            {
                // App resumed and vuforia already started
                // but lets start it again...
                SetAutofocus(); // This is done because some android devices lose the auto focus after resume
                // this was a bug in vuforia 4 and 5. I haven't checked 6, but the code is harmless anyway
            }
        }
    }
 
    private void SetAutofocus()
    {
        if (CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO))
        {
            Debug.Log("Autofocus set");
        }
        else
        {
            // never actually seen a device that doesn't support this, but just in case
            Debug.Log("this device doesn't support auto focus");
        }
    }
}

Realmのdeprecatedメソッド対策

0
Filed under iOS SDK, トラブルシューティング
Tagged as ,

とあるプロジェクトで使用しているRealmですが、バージョンアップしたらあるメソッドでwarningが出るようになりました。

NSString* pathToRealm = "/path/to/data.realm";
[RLMRealm setDefaultRealmPath:pathToRealm]; // ここでwarning!

調べてみると、0.95.0でいくつかの設定系メソッドがdeprecatedになっていたのです。
上記ソースの箇所は次のように書き換えて対応可能でした。

// deprecated.
// [RLMRealm setDefaultRealmPath:pathToRealm];
 
// for Realm v0.95.0
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.path = pathToRealm;
[RLMRealmConfiguration setDefaultConfiguration:config];

iPadアプリのiOS9対応メモ

0
Filed under iOS SDK, iPadアプリ, トラブルシューティング
Tagged as

iPadアプリでもiOS9対応はいくつか問題というか、対応が迫られるようです。

ERROR ITMS-90474

私の場合、既存アプリを再submitして出てきたエラーは次のようなものでした。
ITMS90474-error
ERROR ITMS-90474: "Invalid Bundle. iPad Multitasking support requires these orientations: 'UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight'.
要は、「このアプリはPortrait方向にしか対応していないけど、iPad Multitaskingに対応するためには、全方向に対応しろ」ということですね。
まぁ、このアプリの場合、ある程度問題なく動くようにはしていたので、プロジェクト設定を下記のように全方向にチェックを入れることで対応はできました。
ITMS90474-xcode
(もちろん画面を回転させてもある程度動作することをは確認しておく必要はあります)
もしくは、この設定画面の下にある「Requires full screen」にチェックを入れることでも対応可能なようですが、この場合は、iOS9からの新機能のiPad multitaskingに対応できなくなります。
この辺りは下記Qiita記事にまとまっています。
・iOS – iPad Multitaskingに対応したメモ – Qiita

iOS9対応、あっちもこっとも、大変ですね。。