コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
namespace AppNameA.Services
{
//DependencyServiceから利用する
public interface IApplicationService
{
void Start(string param);
event EventHandler ReturnParamSetted;
string GetReturnParam();
}
}
namespace AppNameB.Services
{
//DependencyServiceから利用する
public interface IApplicationService
{
//Intentを戻す機能
void ReturnApp(string param);
}
}
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>AppNameA</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>AppNameB</string>
</array>
</dict>
</plist>
[assembly: Dependency(typeof(ApplicationService))]
namespace AppNameA.iOS.Services
{
public class ApplicationService : IApplicationService
{
private const string LINK_URL = @"AppNameB://";
public static ApplicationService Instance = null;
public event EventHandler ReturnParamSetted;
public static string ReturnParam = String.Empty;
public void Start(string param)
{
//現在のインスタンスを保持しておく
ApplicationService.Instance = this;
Foundation.NSUrl url = Foundation.NSUrl.FromString(LINK_URL + param); //パラメータの文字列をセットする
if (!UIApplication.SharedApplication.CanOpenUrl(url))
{
//アプリBがインストールされていない場合はアプリBのAppStoreサイトを開く
url = Foundation.NSUrl.FromString("https://itunes.apple.com/jp/app/AppNameB/id9999999999?l=ja&mt=8");
}
//アプリBを呼び出す
UIApplication.SharedApplication.OpenUrl(url);
}
//戻りのパラメータを取得した際に呼び出す。
public void OnReturnParamSetted()
{
if (ApplicationService.Instance != null)
{
ApplicationService.Instance.ReturnParamSetted(null, new EventArgs());
}
}
//PCLからパラメータを取得する
public string GetReturnParam()
{
return ReturnParam;
}
}
}
private const string APP_URL = @"AppNameA://";
// For iOS 9 or newer
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
if (this.IsReturnedApp(url))
{
return true;
}
}
// For iOS 8 and older
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
if (this.IsReturnedApp(url))
{
return true;
}
}
//アプリBからの戻りかどうかを判定する
private bool IsReturnedApp(NSUrl url)
{
if (url != null &&
!String.IsNullOrEmpty(url.ToString()))
{
//アプリBからの戻りの場合、urlにアプリAの文字列が含まれているはず
if (url.ToString().Contains(APP_URL))
{
ApplicationService.ReturnParam = url.ToString().ToLower().Replace(APP_URL, "");
ApplicationService.Instance.OnReturnParamSetted();
return true;
}
}
return false;
}
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>AppNameB</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>AppNameA</string>
</array>
</dict>
</plist>
[assembly: Dependency(typeof(ApplicationService))]
namespace AppNameB.iOS.Model.Services
{
public class ApplicationService : IApplicationService
{
private const string LINK_URL = @"AppNameA://";
public void ReturnApp(string param)
{
Foundation.NSUrl url = Foundation.NSUrl.FromString(LINK_URL + param);
if (!UIApplication.SharedApplication.CanOpenUrl(url))
{
//アプリAがインストールされていない場合はアプリAのAppStoreサイトを開く
url = Foundation.NSUrl.FromString("https://itunes.apple.com/us/app/AppNameA/id9999999999?l=ja&ls=1&mt=8");
}
//アプリAを呼び出す
UIApplication.SharedApplication.OpenUrl(url);
}
}
}
// For iOS 9 or newer
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
//パラメータを取得する
string param = url.ToString().ToLower().Replace("AppNameB://", "");
return true;
}
// For iOS 8 and older
public override bool OpenUrl(UIApplication app, NSUrl url, string sourceApplication, NSObject annotation)
{
//パラメータを取得する
string param = url.ToString().ToLower().Replace("AppNameB://", "");
return true;
}
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
OnButtonClick(object sender, EventArgs e)
{
//イベントの紐づけ
DependencyService.Get<IApplicationService>().ReturnParamSetted += this.OnParameterSetted;
//アプリBを起動してパラメータを受け渡す。
string param = "test";
DependencyService.Get<IApplicationService>().Start(param);
}
void OnParameterSetted(object sender, EventArgs e)
{
//アプリBでセットしたパラメータを取得する
string param = DependencyService.Get<IApplicationService>().GetReturnParam();
}
}
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
OnButtonClick(object sender, EventArgs e)
{
//アプリBを終了してアプリAにパラメータを受け渡す。
string param = "returnvalue";
DependencyService.Get<IApplicationService>().ReturnApp(param);
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。