Родное приложение Mac не может передать управление собственному приложению iOS

Я использую Handoff в своих приложениях для iOS и Mac. iOS -> iOS и iOS -> Mac работают без нареканий! Это здорово. Однако Mac -> iOS никогда не работает. Я тестировал как на El Capitan, так и на Sierra на разных машинах. Если я добавлю URL-адрес веб-страницы в качестве запасного варианта, Safari в iOS подхватит действие, но родное приложение iOS не появится. Я использую этот фрагмент кода в приложении Mac

class ViewController: NSViewController {  
    override func viewDidAppear() {  
        super.viewDidAppear()      
        self.startUserActivity()  
    }    
    func startUserActivity() {  
        let userActivity = NSUserActivity(activityType: "net.myapp.myactivitytype")  
        userActivity.isEligibleForHandoff = true  
        userActivity.isEligibleForSearch = false  
        userActivity.isEligibleForPublicIndexing = false  
        userActivity.title = "Handoff test"  
        userActivity.userInfo = ["key": "value"]  
        userActivity.requiredUserInfoKeys = Set<String>(arrayLiteral: "key")  
        userActivity.webpageURL = URL(string: "https://myapp.net/myurl") // I can pick this up in mobile safari  
        self.userActivity = userActivity  
    }    
    override func updateUserActivityState(_ userActivity: NSUserActivity) {  
        userActivity.addUserInfoEntries(from: ["key":"Updated value"])  
        super.updateUserActivityState(userActivity)  
    }  
} 

На стороне iOS я уже обрабатываю универсальные ссылки с applinks:myapp.net , а также пытался добавить activitycontinuation:myapp.net (вместе с правильной конфигурацией файла apple-app-site-association. Это сделало мой выбор родного приложения соответствующим url из Mac Safari, но родное приложение Mac по-прежнему не может выполнить передачу в родное приложение iOS. У меня нет идей, у кого-нибудь есть идеи, почему это может происходить? На iOS я использую 10.2. Кстати, я не мог' t заставить Handoff вообще работать на iOS 9.

С уважением Рафаэль Полезно Бесполезно


person Rafael Nobre    schedule 18.01.2017    source источник
comment
У меня возникла проблема с передачей обслуживания для трансляции с помощью mac -> mac. Я знаю, что иногда вам нужно использовать userActivity.becomeCurrent(), вы уже пробовали это?   -  person Schule    schedule 03.02.2017


Ответы (2)


Я наконец решил это. Ответ не имел ничего общего с подписанием профилей, как предполагает принятый ответ.

Я сообщил об ошибке в Apple, объясняя всю ситуацию, и Apple сказала мне, что info.plist моего приложения для iOS вообще не объявляет NSUserActivityTypes, а info.plist моего приложения для Mac правильно объявляет NSUserActivityTypes, в результате чего передача обслуживания работает только с iOS на Mac и никогда Mac для iOS.

This issue is due to the iOS version of the app not claiming the activity type in the info.plist, resulting in the iOS device not knowing what app to give the handoff to.

В моем проекте Xcode на левой панели навигации я открыл info.plist, и NSUserActivityTypes действительно уже был там. Но затем я понял, что в моем проекте есть несколько файлов info.plist, когда я ищу его с помощью Finder в папке проекта. Затем я физически зашел в папку своего проекта с помощью Finder и попытался найти этот файл info.plist, но когда я нашел его внутри projectName/projectName, он открыл другой файл info.plist, к которому я изначально не мог получить доступ через навигатор проекта Xcode. В другом файле info.plist не было NSUserActivityTypes, поэтому я добавил его, и передача наконец-то заработала с Mac на iOS! Очень странно, что в моем проекте было несколько поддельных info.plist. Мой реальный информационный список был скрыт от Xcode...

person coolcool1994    schedule 24.07.2018
comment
Отлично, что вы решили свою проблему. Я только что вернулся из отпуска и больше ничем помочь не могу, извините. - person Rafael Nobre; 24.07.2018

В моей ситуации проблема была вызвана отсутствием прав при подписании кода приложения Mac. При запуске codesign -d --entitlements - /Applications/MyApp.app отсутствовала запись, связанная с идентификатором команды. Это ключ для iOS для подключения Mac Handoff к его собственному аналогу (а не к какому-то другому мошенническому приложению, которое пытается использовать тот же идентификатор Handoff).

<key>com.apple.developer.team-identifier</key>
<string>MY_TEAM_ID</string>

Чтобы добавить это право, создайте Provisioning Profile в Dev Center для своего приложения, загрузите его и импортируйте в ручную подпись Xcode. У меня это не сработало ни в автоматическом, ни в ручном режиме без профиля обеспечения (который Xcode указывает как необязательный)

person Rafael Nobre    schedule 27.06.2018
comment
У меня точно такая же проблема. Handoff с Safari работает как с iOS на Mac, так и наоборот, но Handoff для моего приложения работает только с iOS на Mac. Я попытался поместить ваш код в info.plist, но передача с Mac на iOS по-прежнему не работает. Куда вы добавили свой блок кода, чтобы он работал (я пытался поместить его в info.plist)? - person coolcool1994; 01.07.2018
comment
Я включил автоматическое управление подписью. Также попытался добавить это в файл прав, и это все еще не сработало для меня. - person coolcool1994; 01.07.2018
comment
Когда я добавляю com.apple.developer.team-identifier в свою macOS и устанавливаю для него что-то случайное, мое приложение для Mac работает нормально. Но если я добавлю это в iOS и установлю что-то случайное, приложение не будет собираться с ошибкой, которая не соответствует com.apple.developer.team-identifier. Так что я чувствую, что в моем macOS этого не хватает ... но добавление этого к праву не исправило это. Вы делали что-нибудь еще? - person coolcool1994; 01.07.2018
comment
Это не сработало. 1) Я добавил ‹key›com.apple.developer.team-identifier‹/key› ‹string›MY_TEAM_ID‹/string› в свой файл прав. 2) Вручную загрузил мой профиль инициализации для моего приложения Mac и установил подпись вручную. Они не сделали передачу на работу. - person coolcool1994; 09.07.2018
comment
Загрузка профиля подготовки не привела к созданию ключа com.apple.developer.team-identifier в моем файле прав. Мне пришлось вручную вставить этот ключ, но это не имело значения. - person coolcool1994; 09.07.2018
comment
Не могли бы вы помочь мне? Я застрял очень плохо. У меня точно такая же ситуация, когда передача обслуживания работает для Safari в обоих направлениях, но передача обслуживания для моего приложения работает только с iOS на Mac и никогда с Mac на iOS. - person coolcool1994; 09.07.2018