2016-05-23 35 views
0

AndroidとiOS用のXamarin.Formsを使ってアプリケーションを開発しています。 http://app.myapp.io/user/reset-password/{some_hash}のようなURLに入力すると、ユーザーは自分のアカウントの新しいパスワードを設定できる特別な画面でアプリを開きます。Xamarin.Forms - httpスキームURLにリンクしているiOSアプリケーションが動作しない

Androidでは、カスタムインテントフィルタを使用して、スキームをhttpに、ホストをapp.myapp.ioに設定してこれを実現しています。私はiOSでも同じことをやりたいしかし、AFAIKをiOSでリンクするアプリを登録するときは、それを行う方法は、あなたのInfo.plistファイル、カスタムスキームに登録することです。これは私のInfo.plistファイルの私のカスタムスキームです。ここで

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>UIDeviceFamily</key> 
    <array> 
     <integer>1</integer> 
     <integer>2</integer> 
    </array> 
    <key>UISupportedInterfaceOrientations</key> 
    <array> 
     <string>UIInterfaceOrientationPortrait</string> 
     <string>UIInterfaceOrientationLandscapeLeft</string> 
     <string>UIInterfaceOrientationLandscapeRight</string> 
    </array> 
    <key>UISupportedInterfaceOrientations~ipad</key> 
    <array> 
     <string>UIInterfaceOrientationPortrait</string> 
     <string>UIInterfaceOrientationPortraitUpsideDown</string> 
     <string>UIInterfaceOrientationLandscapeLeft</string> 
     <string>UIInterfaceOrientationLandscapeRight</string> 
    </array> 
    <key>MinimumOSVersion</key> 
    <string>6.0</string> 
    <key>CFBundleDisplayName</key> 
    <string>MyApp</string> 
    <key>CFBundleIdentifier</key> 
    <string>com.company.app</string> 
    <key>CFBundleVersion</key> 
    <string>1.0</string> 
    <key>CFBundleIconFiles</key> 
    <array> 
     <string>[email protected]</string> 
     <string>[email protected]</string> 
     <string>Icon-76</string> 
     <string>[email protected]</string> 
     <string>Default</string> 
     <string>[email protected]</string> 
     <string>[email protected]</string> 
     <string>Default-Portrait</string> 
     <string>[email protected]</string> 
     <string>Icon-Small-40</string> 
     <string>[email protected]</string> 
     <string>[email protected]</string> 
     <string>Icon-Small</string> 
     <string>[email protected]</string> 
     <string>[email protected]</string> 
    </array> 
    <key>UILaunchStoryboardName</key> 
    <string>LaunchScreen</string> 
    <key>CFBundleName</key> 
    <string>Halligan</string> 
    <key>CFBundleURLTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleURLName</key> 
      <string>com.company.app</string> 
      <key>CFBundleURLSchemes</key> 
      <array> 
       <string>http</string> 
      </array> 
     </dict> 
    </array> 
</dict> 
</plist> 

{ 
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS. 
    [Register("AppDelegate")] 
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IDeviceStorage 
    { 
     const string HOCKEYAPP_APPID = "ef71d53e56044baa813c2381b291c355"; 

     #region IDeviceStorage implementation 
     public string LoadString(string key, string def = null) 
     { 
      string value = NSUserDefaults.StandardUserDefaults.StringForKey(key); 
      if (value == null) 
       return def; 
      else 
       return value; 
     } 

     public void SaveString(string key, string value) 
     { 
      NSUserDefaults.StandardUserDefaults.SetString(value, key); 
      NSUserDefaults.StandardUserDefaults.Synchronize(); 
     } 
     #endregion 

     // 
     // This method is invoked when the application has loaded and is ready to run. In this 
     // method you should instantiate the window, load the UI into it and then make the window 
     // visible. 
     // 
     // You have 17 seconds to return from this method, or iOS will terminate your application. 
     // 
     public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
     { 
      if (!Resolver.IsSet) SetIoc(); 

      global::Xamarin.Forms.Forms.Init(); 
      SvgImageRenderer.Init(); 
      LoadApplication(new App()); 

      return base.FinishedLaunching(app, options); 
     } 

     public override bool OpenUrl (UIApplication app, NSUrl url, string sourceApp, NSObject annotation) 
     { 
      var resetLinkHash = string.Empty; 
      if (url.BaseUrl.Host.Equals ("app.myapp.io")) { 
        if (!Resolver.IsSet) SetIoc(); 

        global::Xamarin.Forms.Forms.Init(); 

        LoadApplication(new App(url.LastPathComponent)); 
        return true; 

      } 
      LoadApplication(new App(url.LastPathComponent)); 
      return true; 
     } 

     private void SetIoc() 
     { 
      TinyIoCContainer.Current.AutoRegister(); 
      var container = TinyIoCContainer.Current; 
      container.Register<IDeviceStorage>(this); 
      container.Register<IXFormsApp> (new XFormsAppiOS()); 
      container.Register<ISecureStorage, SecureStorage>(); 
      Resolver.SetResolver(new XLabs.Ioc.TinyIOC.TinyResolver(container)); 
     } 
    } 
} 

私AppDelegate.csだとここで私のMain.cs

{ 
    public class Application 
    { 
     // This is the main entry point of the application. 
     static void Main(string[] args) 
     { 
      // if you want to use a different Application Delegate class from "AppDelegate" 
      // you can specify it here. 
      UIApplication.Main(args, null, "AppDelegate"); 
     } 
    } 
} 

、よく、今のところこれがでまたはhttpずにしようと、iOSの上では動作しませんですはじまりに。

誰かが正しい方向に私を指摘することができれば、私はそれを感謝します。 URLに一致させることでアプリケーションを起動することは非常に重要です。サーバーにアクセスすることができないため、<meta/>タグをページのhtmlに追加するなどの作業はできません。

答えて

0

Androidと異なり、iOSのURLスキームは1つのアプリにしか登録できません。これがうまくいかない理由は、httpがあなたのアプリがiOSで使用するために登録できるURLスキームではないためです。

この作業を行う方法は、新しいiOS 9+機能であるUniversal Linksです。これにより、http/https URLのアプリを特定のドメインにのみ登録することができます。ただし、問題のドメインを制御することを証明するために、サーバー側の変更をいくつか行う必要があるため、サーバーにアクセスする必要があります。これが不可能な場合は、Branch.io(全開示:私はチームです)のような無料サービスを使用してリンクを処理することを検討してください。

関連する問題