Что действительно произойдет, если несколько приложений ios попытаются использовать одну и ту же схему URL [duplicate]

Используйте reduce() для перемещения словаря:

from functools import reduce  # forward compatibility for Python 3
import operator

def getFromDict(dataDict, mapList):
    return reduce(operator.getitem, mapList, dataDict)

и повторного использования getFromDict, чтобы найти местоположение для сохранения значения для setInDict():

def setInDict(dataDict, mapList, value):
    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value

Все, кроме последнего элемента в mapList, необходимы, чтобы найти «родительский» словарь, чтобы добавить значение, а затем использовать последний элемент, чтобы установить значение в правую клавишу.

Демо:

>>> getFromDict(dataDict, ["a", "r"])
1
>>> getFromDict(dataDict, ["b", "v", "y"])
2
>>> setInDict(dataDict, ["b", "v", "w"], 4)
>>> import pprint
>>> pprint.pprint(dataDict)
{'a': {'r': 1, 's': 2, 't': 3},
 'b': {'u': 1, 'v': {'w': 4, 'x': 1, 'y': 2, 'z': 3}, 'w': 3}}

Обратите внимание, что руководство по стилю Python PEP8 предписывает имена змеиных имен для функций . Вышеупомянутое работает одинаково хорошо для списков или комбинации словарей и списков, поэтому имена должны быть действительно get_by_path() и set_by_path():

from functools import reduce  # forward compatibility for Python 3
import operator

def get_by_path(root, items):
    """Access a nested object in root by item sequence."""
    return reduce(operator.getitem, items, root)

def set_by_path(root, items, value):
    """Set a value in a nested object in root by item sequence."""
    get_by_path(root, items[:-1])[items[-1]] = value

37
задан Albert Renshaw 30 December 2016 в 21:59
поделиться

3 ответа

Если два приложения регистрируют одну и ту же настраиваемую схему URL-адресов, не определено, какое приложение действительно будет запущено. Один из них будет запущен, но нет никакого способа узнать.

Вот настоящий кикер. Если у вас есть два приложения на вашем устройстве с одинаковой схемой URL-адресов, и вы удаляете тот, который действительно запускается, другой не будет запускаться по URL-адресу без перезагрузки устройства iOS.

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

33
ответ дан Albert Renshaw 19 August 2018 в 08:12
поделиться
  • 1
    Но как насчет вредоносных разработчиков вы можете предотвратить это? Например, что, если бы я сделал свою схему URL & quot; Facebook: // & quot; или что бы они ни использовали ... возможно каждый раз, когда кто-то нажимает, как мое приложение запускается, и пользователь видит объявление или два, и я получаю деньги: o (я бы этого не сделал, конечно, но есть некоторые жалкие люди, которые могут ) ehhh – Albert Renshaw 30 October 2012 в 00:26
  • 2
    Я никогда не слышал, чтобы кто-то это делал, но ты прав, кто-то мог. Я полагаю, что Apple может убедиться, что какие-либо настраиваемые схемы URL, которые вы определяете, выглядят подходящими для вашего приложения, но я никогда не слышал, чтобы кто-либо изменил их схему раньше. – rmaddy 30 October 2012 в 00:31
  • 3
    Apple должна позволить разработчикам создавать схемы URL в Интернете и сообщать об этом заранее, если что-то уже сделано. – Amogh Talpallikar 9 May 2013 в 13:17
  • 4
    У меня были такие же сомнения и наткнулся на эту тему. @AmoghTalpallikar - Если Apple предоставляет структуру регистрации URL-адресов, люди просто регистрируют множество схем URL-адресов, и они не используются. Возможно, должен был быть способ, по которому схемы URL-адресов каким-то образом связаны с профилем подготовки приложения, или как работает функция Push-уведомлений, связанная с профилем подготовки разработчика / Ad-hoc и т. Д. Тем не менее, независимо от того, какая система в настоящее время настроена, явно небезопасно, как справедливо указал этот человек. – Raj Pawan Gumdal 22 May 2013 в 07:15
  • 5
    Обратите внимание, что ошибка, связанная с удалением приложения, обрабатывающего URL-адрес, исправлена ​​по крайней мере на iOS8 – Rog 18 June 2015 в 08:29

Обновлено для 2016

Политика Apple изменилась с 2012 года. Сегодня они указывают, что несколько приложений не смогут регистрироваться для одной и той же схемы . Время регистрации - это гораздо более чистое место для решения конфликтов, чем время выполнения, поскольку оно позволяет избежать проблем безопасности, обсужденных с другими ответами.

Примечание. Если для обработки одной и той же схемы URL регистрируется несколько сторонних приложений, в настоящее время нет процесса определения того, какое приложение будет присвоено этой схеме.

Источник: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072 -CH6-SW1

6
ответ дан Bosh 19 August 2018 в 08:12
поделиться
  • 1
    Я смущен. Кажется, вы говорите, что более одного приложения не могут иметь одну и ту же схему URL, но затем вы добавляете «примечание», говоря, что они могут, и это не определено, что и сказал ответ 2012 года. – Albert Renshaw 28 February 2016 в 12:50
  • 2
    Позвольте мне пояснить: в 2012 году Apple разрешит нескольким приложениям регистрироваться по одной и той же схеме, а поведение во время выполнения, которое будет запущено, не определено. Теперь Apple, похоже, принимает решение во время регистрации, а не во время выполнения, а это означает, что поведение во время выполнения будет хорошо определено, и только одно возможное приложение для данной схемы. – Bosh 1 March 2016 в 06:00
  • 3
    @Bosh Я не вижу, как ваш комментарий разъясняет ваш ответ. Что вы подразумеваете под «временем регистрации»? До сих пор я ничего не вижу в вашем ответе, который отличается от того, что было в 2012 году. – rmaddy 1 March 2016 в 17:56
  • 4
    @Bosh Я хотел бы уточнить бит регистр. Насколько я вижу, есть два возможных способа. 1. Apple отклонит приложение, если увидит, что вы пытаетесь отправить приложение с URL-адресом, который уже получен другим приложением. 2. Apple полностью разрешит загружать приложения в AppStore с той же схемой URL-адресов, но когда вы загружаете приложение, у которого есть URL-адрес, который уже поддерживается другим приложением на вашем телефоне, он просто игнорирует ваше приложение в качестве поддерживаемого приложения для этого URL-адреса? – Bagrat Kirakosian 11 June 2016 в 23:01
  • 5
    @Albert Renshaw Что вы думаете о 2 приведенных выше комментариях? – Vincent 30 December 2016 в 07:55

Из документов Apple:

Реализация пользовательских схем URL

У меня нет ответа на оставшуюся часть вашего вопроса (в это время по крайней мере).

EDIT:

Согласно яблочным документам:

Примечание. Если несколько сторонних приложений регистрируются для обработки одной и той же схемы URL, не определено, какое из приложений выбрано для обработки URL-адресов этого типа.

(О, извините rmaddy, не видел ваш ответ до: P)

5
ответ дан James Zaghini 19 August 2018 в 08:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: