2015-09-28 1 views
0

У меня есть два тестовых приложения: App1 & App2.Связь между приложениями в iOS с использованием схемы URL

App1 принимает строку из текстового поля и вызывает метод:

@IBAction func openApp(sender: AnyObject) { 
    let url1 = ("app2://com.application.started?displayText="+textToSend.text!) 
    let url2 = url1.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) 
    UIApplication.sharedApplication().openURL(NSURL(string: url2!)!) 
} 

Что на самом деле открывает app2, который имеет только метку, которая должна изменить в тексте посланного через URL, код находится в пределах AppDelegate.swift:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    let url = url.standardizedURL 
    let query = url?.query 
    ViewController().labelToDisplayResult.text = query 
    return true; 
} 

к сожалению, линия, где я пытаюсь передать результат URL к фактической этикетке дает мне эту ошибку:

EXC_BAD_INSTRUCTION (CODE=EXC_I386_INVOP SUBCODE=0x0) 

Однако я все данные в App2 наверняка, как я могу видеть их значения в отладчике:

url NSURL "app2://com.application.started?displayText=564315712437124375" 0x00007fa4e3426320 
query String? "displayText=564315712437124375" 

Любая идея, почему я получаю эту ошибку?

Благодаря ...

ответ

6

Ваша ошибка

ViewController().labelToDisplayResult.text = query 

ViewController() Создать новый экземпляр ViewController, а не один загружается из storyboard.I догадываюсь labelToDisplayResult это отдушина, поэтому он равен нулю, так что вы получить EXC_BAD_INSTRUCTION (CODE=EXC_I386_INVOP SUBCODE=0x0)

Это то, что я обычно делаю для обработки схемы OpenUrl, нужно думать о двух состояниях:

  1. Target App запущен раньше, поэтому при открытии URL произойдет, цель приложение в фоновом режиме или неактивном состоянии
  2. Target App не запущен, поэтому при открытии URL произойдет, целевое приложение не работает на всех

в AppDelegate

class AppDelegate: UIResponder, UIApplicationDelegate { 
var openUrl:NSURL? //This is used when to save state when App is not running before the url trigered 
var window: UIWindow? 


func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    let url = url.standardizedURL 
    NSNotificationCenter.defaultCenter().postNotificationName("HANDLEOPENURL", object:url!) 
    self.openUrl = url 
    return true; 
} 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    return true 
} 
} 

Затем в ручке OpenUrl ViewController

class ViewController: UIViewController { 

@IBOutlet weak var testLabel: UILabel! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleOpenURL:", name:"HANDLEOPENURL", object: nil) 
    let delegate = UIApplication.sharedApplication().delegate as? AppDelegate 
    if let url = delegate?.openUrl{ 
     testLabel.text = url.description 
     delegate?.openUrl = nil 
    } 
} 
func handleOpenURL(notification:NSNotification){ 
    if let url = notification.object as? NSURL{ 
     testLabel.text = url.description 
    } 
} 
deinit{ 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "HANDLEOPENURL", object:nil) 
} 

} 
+0

Спасибо, я ве ry new для любой разработки iOS и Swift, как я могу получить значение формы AppDelegate для ViewController, если я хочу отображать значение, прошедшее через схему URL? –

+0

@JakubZak Посмотрите, что я обновляю – Leo

+0

Это порождает ошибку, но, в любом случае, спасибо, очень хороший момент, что мне нужно думать об обоих состояниях. –